modelsim软件使用.ppt
《modelsim软件使用.ppt》由会员分享,可在线阅读,更多相关《modelsim软件使用.ppt(69页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、逻辑设计与逻辑设计与FPGA仿真软件仿真软件ModelsimModelsim的基本知识的基本知识福州大学微电子系福州大学微电子系仿真与验证仿真与验证1 1、编写测试验证程序、编写测试验证程序1.11.1、测试验证程序有三个主要目的、测试验证程序有三个主要目的1.21.2、典型的测试验证程序形式、典型的测试验证程序形式2 2、激励波形产生、激励波形产生2.12.1、值序列、值序列2.22.2、重复模式、重复模式3 3、测试验证程序实例、测试验证程序实例3.13.1、解码器、解码器 3.23.2、触发器、触发器VerilogVerilog模块的测试模块的测试目的:目的:如何编写的测试文件,对所做的
2、设计进行完如何编写的测试文件,对所做的设计进行完整的测试和验证。整的测试和验证。掌握组织模块测试的常用方法掌握组织模块测试的常用方法学会编写常用的测试代码。学会编写常用的测试代码。模块的测试模块的测试 被测模块被测模块激激励励和和控控制信号制信号输输出出响响应应和验证和验证1 1、编写测试验证程序编写测试验证程序测试验证程序用于测试和验证设计的正确性。测试验证程序用于测试和验证设计的正确性。Verilog HDLVerilog HDL提供强有力的结构来编写测试验证提供强有力的结构来编写测试验证程序。程序。1 1、编写测试验证程序编写测试验证程序1.11.1、测试验证程序有三个主要目的:、测试验
3、证程序有三个主要目的:1)1)产生模拟激励产生模拟激励(波形波形);2)2)将输入激励加入到测试模块并收集其输出响应;将输入激励加入到测试模块并收集其输出响应;3)3)将响应输出与期望值进行比较。将响应输出与期望值进行比较。1.21.2、典型的测试验证程序形式、典型的测试验证程序形式module Test_Bench;module Test_Bench;(不做端口声明)(不做端口声明)/通常测试验证程序没有输入和输出端口。通常测试验证程序没有输入和输出端口。Local_reg_and_net_declarationsLocal_reg_and_net_declarations(端口声明)(端口
4、声明)Generate_waveforms_using_initial_&_always_statemenGenerate_waveforms_using_initial_&_always_statemen(产生激励波形)(产生激励波形)Instantiate_module_under_testInstantiate_module_under_test(例化被测模块)(例化被测模块)Monitor_output_and_compare_with_expected_valuesMonitor_output_and_compare_with_expected_values(输出监控或直接波形输出)
5、(输出监控或直接波形输出)endmoduleendmodule测试时,通过在测试验证程序中进行实例化,将激励自测试时,通过在测试验证程序中进行实例化,将激励自动加载于测试模块。动加载于测试模块。1.21.2、典型的测试验证程序形式、典型的测试验证程序形式测试模块常见的形式:测试模块常见的形式:module XX_tb;module XX_tb;reg;/reg;/被测模块输入变量类型定义被测模块输入变量类型定义wire;/wire;/被测模块输出变量类型定义被测模块输出变量类型定义initial begin;end /initial begin;end /产生测试信号产生测试信号always
6、begin;end /always begin;end /产生测试信号产生测试信号tsint tsint m(.in1(ina),.in2(inb),.out1(outa),.out2(outb)m(.in1(ina),.in2(inb),.out1(outa),.out2(outb););/被测模块的实例引用被测模块的实例引用initial begin.;.;end /initial begin.;.;end /记录输出和响应记录输出和响应endmoduleendmodule1.21.2、典型的测试验证程序形式、典型的测试验证程序形式测试模块中常用的过程块:测试模块中常用的过程块:initi
7、al initial always always所有的过程块都所有的过程块都在在0 0时刻同时启时刻同时启动;它们是并行动;它们是并行的,在模块中不的,在模块中不分前后。分前后。initialinitial块块 只只执行一次。执行一次。alwaysalways块块 只只要符合触发条件要符合触发条件可以循环执行。可以循环执行。1.21.2、典型的测试验证程序形式、典型的测试验证程序形式如何描述如何描述激励信号:激励信号:module t;module t;reg a,b,sel;/reg a,b,sel;/被测模块的输入信号用寄存器赋值被测模块的输入信号用寄存器赋值wire out;/wire
8、out;/被测模块的输出信号被测模块的输出信号/引用多路器实例引用多路器实例 mux2 m(out,a,b,sel);mux2 m(out,a,b,sel);/加入激励信号加入激励信号 initial initial begin a=0;b=1;sel=0;begin a=0;b=1;sel=0;#10 b=0;#10 b=0;#10 b=1;sel=1;#10 b=1;sel=1;#10 a=1;#10 a=1;#10$stop;#10$stop;end end1.21.2、典型的测试验证程序形式、典型的测试验证程序形式如何观察如何观察被测模块的响应:被测模块的响应:在在initial in
9、itial 块中,用系统任务块中,用系统任务$time$time 和和$monitor$monitor$time$time 返回当前的仿真时刻返回当前的仿真时刻$monitor$monitor 只要在其变量列表中有某一个或某几个变只要在其变量列表中有某一个或某几个变 量值发生变化,便在仿真单位时间结束时显示其变量值发生变化,便在仿真单位时间结束时显示其变 量列表中所有变量的值。量列表中所有变量的值。例:例:initial initial begin begin$monitor$monitor($time,($time,“out=%b,“out=%b a=%b a=%b b=%b b=%b se
10、lsel=%b”,=%b”,out,a,b,selout,a,b,sel););end end2 2、激励波形产生、激励波形产生有两种产生激励值的主要方法:有两种产生激励值的主要方法:1)1)产生值序列,即在确定的离散时间间隔加载激励。产生值序列,即在确定的离散时间间隔加载激励。2)2)产生产生重复模式的波形。重复模式的波形。2.12.1、值序列、值序列A1A1、产生值序列的最佳方法是使用产生值序列的最佳方法是使用initialinitial语句。语句。initialbegin Reset=0;#100 Reset=1;#80 Reset=0;#30 Reset=1;end产生的波形如图所示。
11、产生的波形如图所示。InitialInitial语句中的赋值语句用时延控语句中的赋值语句用时延控制产生波形。此外,制产生波形。此外,语句内时延语句内时延也能够按如下实例所示产生也能够按如下实例所示产生波形波形。因为使用的是阻塞性过因为使用的是阻塞性过程赋值,上面语句中的程赋值,上面语句中的时延是相对时延。时延是相对时延。2.12.1、值序列、值序列B B、若要若要重复产生重复产生一个值序列,可以使用一个值序列,可以使用alwaysalways语句替代语句替代initialinitial语句。语句。Parameter REPEAT_DELAY=35;Integer CoinValue;alway
12、sbeginCoinValue=0;#7 CoinValue=25;#2 CoinValue=5;#8 CoinValue=10;#6 CoinValue=5;#REPEAT_DELAY;end这是因为这是因为initialinitial语句只执行一语句只执行一次而次而alwaysalways语句会重复执行语句会重复执行2.22.2、重复模式、重复模式A A、重复模式的生成通过使用如下的连续赋值形式加重复模式的生成通过使用如下的连续赋值形式加以简化以简化:assign#(PERIOD/2)Clock=Clock;但是这种做法并不完全正确。但是这种做法并不完全正确。问题在于问题在于ClockCl
13、ock是一个线网是一个线网(只有线网能够在连续赋值中被赋值只有线网能够在连续赋值中被赋值),它的初始值是,它的初始值是z z,并,并且,且,z z等于等于x x,x x等于等于x x。因此。因此ClockClock的值永远固定为值的值永远固定为值x x。现在需要一种初始化现在需要一种初始化ClockClock方法。可用方法。可用initialinitial语句实现。语句实现。initial initial Clock Clock=0;=0;但是现在但是现在ClockClock必须是寄存器数据类型必须是寄存器数据类型(因为只有寄存器因为只有寄存器数据类型能够在数据类型能够在initialinit
14、ial语句中被赋值语句中被赋值),因此连续赋值语句,因此连续赋值语句需要被变换为需要被变换为alwaysalways语句。语句。always always#(PERIOD/2)Clock=Clock;2.22.2、重复模式、重复模式B1B1、下面是一个完整的时钟产生器模块。下面是一个完整的时钟产生器模块。Module Gen_Clk_A(Clk_A);output Clk_A;reg Clk_A;parameter tPERIOD=10;initialClk_A=0;always#(tPERIOD/2)Clk_A=Clk_A;endmodule2.22.2、重复模式、重复模式B2B2、下面给出
15、了产生周期性时钟波形的另一种可选方式。下面给出了产生周期性时钟波形的另一种可选方式。Module Gen_Clk_B(Clk_B);output Clk_B;reg Start;initialbeginStart=1;#5 Start=0;endnor#2(Clk_B,Start,Clk_B);endmoduleinitialinitial语句将语句将StartStart置为置为1 1,这促,这促使或非门的输出为使或非门的输出为0(0(从从x x值中获得值中获得)。5 5个时间单位后,在个时间单位后,在StartStart变为变为0 0时,或非门反转产生带有周期为时,或非门反转产生带有周期为4
16、 4个时间单位的时钟波形。个时间单位的时钟波形。2.22.2、重复模式、重复模式B3B3、如果要产生高低电平持续时间不同的时钟波形,可用如果要产生高低电平持续时间不同的时钟波形,可用alwaysalways语句建立模型。语句建立模型。Module Gen_Clk_C(Clk_C);Parameter tON=5,tOFF=10;Output Clk_C;Reg Clk_C;always begin#tON Clk_C=0;#tOFF Clk_C=1;end endmodule3 3、测试验证程序实例、测试验证程序实例outabslselbselansl u2 u3 u4 u1module mu
17、x2_m(out,a,b,module mux2_m(out,a,b,sl);sl);input a,b,sl;input a,b,sl;output out;output out;wire sela,nsl,selb wire sela,nsl,selb not u1 not u1(ns1ns1,slsl););and#1 u2 and#1 u2(selasela,a a,nslnsl););and#1 u3 and#1 u3(selbselb,b b,slsl)or#2 u4 or#2 u4(out out,selasela,selbselb)endmoduleendmodule3 3、测
18、试验证程序实例、测试验证程序实例module t;reg a,b,sel;wire out;mux2_m tt(out,a,b,sel);/引用多路器实例引用多路器实例initial begin a=0;b=1;sel=0;#10 b=0;#10 b=1;sel=1;#10 a=1;#10$stop;end/加入激励信号加入激励信号initial begin$monitor($time,“out=%b a=%b b=%b sel=%b”,out,a,b,sel);endendmodule3 3、测试验证程序实例、测试验证程序实例下例是下例是D D触发器及其测试模块。触发器及其测试模块。modu
19、le MSDFF(D,C,Q,Qbar);input D,C;output Q,Qbar;reg Q;always (posedge C)Q ModelSim 这是设计加载前的提示符这是设计加载前的提示符 能浏览帮助能浏览帮助,编辑库编辑库,编辑源代码而不用调用一个设计编辑源代码而不用调用一个设计 VSIM VSIM 设计加载后显示的提示符设计加载后显示的提示符 告诉我们仿真器的行为动作告诉我们仿真器的行为动作 命令命令 信息信息 声明声明4.3.2 ModelSim4.3.2 ModelSim实现方法实现方法 交互式的命令行交互式的命令行(Cmd)(Cmd)唯一的界面是控制台的命令行唯一的界
20、面是控制台的命令行,没有用户界面没有用户界面 用户界面用户界面(UI)(UI)能接受菜单输入和命令行输入能接受菜单输入和命令行输入 课程主要讨论课程主要讨论 批处理模式批处理模式 从从DOSDOS或或UNIXUNIX命令行运行批处理文件命令行运行批处理文件 不讨论不讨论4.3.34.3.3基本仿真步骤基本仿真步骤1 1 创建一个工程创建一个工程2 2 编写源代码和测试程序编写源代码和测试程序3 3 编译源代码编译源代码和测试程序和测试程序-所有所有HDLHDL代码必须经过编译才能进行仿真代码必须经过编译才能进行仿真-Verilog-Verilog和和VHDLVHDL的编译命令不同的编译命令不同
21、4 4 启动仿真器启动仿真器5 5 运行仿真器运行仿真器创建一个工程创建一个工程1 1 UI)UI)选择主窗口中的菜单:选择主窗口中的菜单:File-New ProjectFile-New Project 输入项目名称:输入项目名称:MUX24MUX24 项目保存的目录项目保存的目录 默认的库名:默认的库名:workwork 2 2 编写源代码和测试程序编写源代码和测试程序在在ProjectProject下点击右键:下点击右键:选择选择Add to ProjectAdd to Project 选选New FileNew File 输入文件名(注意不要加后缀输入文件名(注意不要加后缀.v).v)
22、在在Add file as typeAdd file as type中务必要选中务必要选VerilogVerilog 同样的方法加入相应的测试文件。同样的方法加入相应的测试文件。3 3 编译源代码编译源代码(Verilog)(Verilog)UI)UI)Compile-Compile allCompile-Compile all在在ProjectProject下点击右键:下点击右键:选择选择compilecompilecompilecompile all allCmdCmd)vlogvlog-work-work .v.v .v.v文件按列出的顺序编译文件按列出的顺序编译编译顺序无关紧要编译顺序
23、无关紧要缺省编译到缺省编译到workwork库中库中例:例:vlogvlog my_design.v my_design.v注意注意:当项目中涉及的设计文件被改变时必须重新编译。当项目中涉及的设计文件被改变时必须重新编译。编译编译出错信息出错信息4 4 启动仿真器启动仿真器UI)UI)Simulate-SimulateSimulate-SimulateCmdCmd)vsimvsim-lib-lib VHDLVHDLvsimvsim top_entity top_architecture top_entity top_architecture仿真仿真Entity/ArchitectureEnti
24、ty/Architecture对对也可以选择一个也可以选择一个ConfigurationConfigurationVerilogVerilogvsimvsim top_level1 top_level2 top_level1 top_level2仿真多个顶层仿真多个顶层ModulesModules启动仿真器启动仿真器(UI)(UI)选择顶层选择顶层module或或entity/architecture选择仿真精度选择仿真精度选择库选择库vsimvsim命令参数命令参数参数参数-t-t 指定仿真时间精度指定仿真时间精度单位可以是单位可以是 fsfs,psps,ns,ms,sec,min,hr,n
25、s,ms,sec,min,hr如果使用了如果使用了 VerilogVerilog中的中的timescaletimescale编译指令,仿真将使用所编译指令,仿真将使用所有设计文件中最小的时间精度有设计文件中最小的时间精度该参数是可选的该参数是可选的 (默认值是默认值是ns)ns)-sdfminsdfmin|-|-sdftypsdftyp|-|-sdfmaxsdfmax =标注标注SDFSDF文件文件该参数是可选的该参数是可选的实例名也是可选的;如果没有指定,实例名也是可选的;如果没有指定,SDFSDF将用于顶层设计将用于顶层设计5 5 运行仿真器运行仿真器UI)UI)RunRunCmdCmd)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- modelsim 软件 使用
限制150内