




已阅读5页,还剩64页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
逻辑设计与FPGA,仿真软件Modelsim的基本知识,福州大学微电子系,仿真与验证,1、编写测试验证程序1.1、测试验证程序有三个主要目的1.2、典型的测试验证程序形式2、激励波形产生2.1、值序列2.2、重复模式3、测试验证程序实例3.1、解码器3.2、触发器,Verilog模块的测试,目的:如何编写的测试文件,对所做的设计进行完整的测试和验证。掌握组织模块测试的常用方法学会编写常用的测试代码。,模块的测试,1、编写测试验证程序,测试验证程序用于测试和验证设计的正确性。VerilogHDL提供强有力的结构来编写测试验证程序。,1、编写测试验证程序,1.1、测试验证程序有三个主要目的:1)产生模拟激励(波形);2)将输入激励加入到测试模块并收集其输出响应;3)将响应输出与期望值进行比较。,1.2、典型的测试验证程序形式,moduleTest_Bench;(不做端口声明)/通常测试验证程序没有输入和输出端口。Local_reg_and_net_declarations(端口声明)Generate_waveforms_using_initial_reg;/被测模块输入变量类型定义wire;/被测模块输出变量类型定义initialbegin;end/产生测试信号alwaysbegin;end/产生测试信号tsintm(.in1(ina),.in2(inb),.out1(outa),.out2(outb);/被测模块的实例引用initialbegin.;.;end/记录输出和响应endmodule,1.2、典型的测试验证程序形式,测试模块中常用的过程块:,always,所有的过程块都在0时刻同时启动;它们是并行的,在模块中不分前后。initial块只执行一次。always块只要符合触发条件可以循环执行。,1.2、典型的测试验证程序形式,如何描述激励信号:modulet;rega,b,sel;/被测模块的输入信号用寄存器赋值wireout;/被测模块的输出信号/引用多路器实例mux2m(out,a,b,sel);/加入激励信号initialbegina=0;b=1;sel=0;#10b=0;#10b=1;sel=1;#10a=1;#10$stop;end,1.2、典型的测试验证程序形式,如何观察被测模块的响应:在initial块中,用系统任务$time和$monitor$time返回当前的仿真时刻$monitor只要在其变量列表中有某一个或某几个变量值发生变化,便在仿真单位时间结束时显示其变量列表中所有变量的值。例:initialbegin$monitor($time,“out=%ba=%bb=%bsel=%b”,out,a,b,sel);end,2、激励波形产生,有两种产生激励值的主要方法:产生值序列,即在确定的离散时间间隔加载激励。2)产生重复模式的波形。,2.1、值序列,A1、产生值序列的最佳方法是使用initial语句。initialbeginReset=0;#100Reset=1;#80Reset=0;#30Reset=1;end产生的波形如图所示。Initial语句中的赋值语句用时延控制产生波形。此外,语句内时延也能够按如下实例所示产生波形。,因为使用的是阻塞性过程赋值,上面语句中的时延是相对时延。,2.1、值序列,B、若要重复产生一个值序列,可以使用always语句替代initial语句。ParameterREPEAT_DELAY=35;IntegerCoinValue;alwaysbeginCoinValue=0;#7CoinValue=25;#2CoinValue=5;#8CoinValue=10;#6CoinValue=5;#REPEAT_DELAY;end,这是因为initial语句只执行一次而always语句会重复执行,2.2、重复模式,A、重复模式的生成通过使用如下的连续赋值形式加以简化:assign#(PERIOD/2)Clock=Clock;但是这种做法并不完全正确。问题在于Clock是一个线网(只有线网能够在连续赋值中被赋值),它的初始值是z,并且,z等于x,x等于x。因此Clock的值永远固定为值x。现在需要一种初始化Clock方法。可用initial语句实现。initialClock=0;但是现在Clock必须是寄存器数据类型(因为只有寄存器数据类型能够在initial语句中被赋值),因此连续赋值语句需要被变换为always语句。always#(PERIOD/2)Clock=Clock;,2.2、重复模式,B1、下面是一个完整的时钟产生器模块。ModuleGen_Clk_A(Clk_A);outputClk_A;regClk_A;parametertPERIOD=10;initialClk_A=0;always#(tPERIOD/2)Clk_A=Clk_A;endmodule,2.2、重复模式,B2、下面给出了产生周期性时钟波形的另一种可选方式。ModuleGen_Clk_B(Clk_B);outputClk_B;regStart;initialbeginStart=1;#5Start=0;endnor#2(Clk_B,Start,Clk_B);endmodule,initial语句将Start置为1,这促使或非门的输出为0(从x值中获得)。5个时间单位后,在Start变为0时,或非门反转产生带有周期为4个时间单位的时钟波形。,2.2、重复模式,B3、如果要产生高低电平持续时间不同的时钟波形,可用always语句建立模型。ModuleGen_Clk_C(Clk_C);ParametertON=5,tOFF=10;OutputClk_C;RegClk_C;alwaysbegin#tONClk_C=0;#tOFFClk_C=1;endendmodule,3、测试验证程序实例,out,modulemux2_m(out,a,b,sl);inputa,b,sl;outputout;wiresela,nsl,selbnotu1(ns1,sl);and#1u2(sela,a,nsl);and#1u3(selb,b,sl)or#2u4(out,sela,selb)endmodule,3、测试验证程序实例,modulet;rega,b,sel;wireout;mux2_mtt(out,a,b,sel);/引用多路器实例initialbegina=0;b=1;sel=0;#10b=0;#10b=1;sel=1;#10a=1;#10$stop;end/加入激励信号initialbegin$monitor($time,“out=%ba=%bb=%bsel=%b”,out,a,b,sel);endendmodule,3、测试验证程序实例,下例是D触发器及其测试模块。moduleMSDFF(D,C,Q,Qbar);inputD,C;outputQ,Qbar;regQ;always(posedgeC)Q这是设计加载前的提示符能浏览帮助,编辑库,编辑源代码而不用调用一个设计VSIM设计加载后显示的提示符告诉我们仿真器的行为动作命令信息声明,4.3.2ModelSim实现方法,交互式的命令行(Cmd)唯一的界面是控制台的命令行,没有用户界面用户界面(UI)能接受菜单输入和命令行输入课程主要讨论批处理模式从DOS或UNIX命令行运行批处理文件不讨论,4.3.3基本仿真步骤,1创建一个工程2编写源代码和测试程序3编译源代码和测试程序-所有HDL代码必须经过编译才能进行仿真-Verilog和VHDL的编译命令不同4启动仿真器5运行仿真器,创建一个工程,1,UI)选择主窗口中的菜单:File-NewProject输入项目名称:MUX24项目保存的目录默认的库名:work,2编写源代码和测试程序,在Project下点击右键:选择AddtoProject选NewFile输入文件名(注意不要加后缀.v)在Addfileastype中务必要选Verilog同样的方法加入相应的测试文件。,3编译源代码(Verilog),UI)Compile-Compileall在Project下点击右键:选择compilecompileallCmd)vlog-work.v.v文件按列出的顺序编译编译顺序无关紧要缺省编译到work库中例:vlogmy_design.v注意:当项目中涉及的设计文件被改变时必须重新编译。,编译,出错信息,4启动仿真器,UI)Simulate-SimulateCmd)vsim-libVHDLvsimtop_entitytop_architecture仿真Entity/Architecture对也可以选择一个ConfigurationVerilogvsimtop_level1top_level2仿真多个顶层Modules,启动仿真器(UI),选择顶层module或entity/architecture,选择仿真精度,选择库,vsim命令参数,参数-t指定仿真时间精度单位可以是fs,ps,ns,ms,sec,min,hr如果使用了Verilog中的timescale编译指令,仿真将使用所有设计文件中最小的时间精度该参数是可选的(默认值是ns)-sdfmin|-sdftyp|-sdfmax=标注SDF文件该参数是可选的实例名也是可选的;如果没有指定,SDF将用于顶层设计,5运行仿真器,UI)RunCmd)run可按指定时间步长运行仿真器,运行仿真器,run命令参数,可选参数-指定运行的时间步长单位可以是fs,ps,ns,ms,sec-step执行到下一个HDL表达式-continue在step或断点之后继续执行余下的仿真-all运行仿真器,直到不再有事件发生,run命令例子,run1000从当前位置开始,仿真器运行1000个时间单位run2500ns从当前位置开始,仿真器运行2500nsrun3000仿真器运行到3000个时间单位的时刻停止,4.3.3仿真器的激励,测试平台(Testbench)可用Verilog或VHDL编写用于非常复杂的仿真和交互式仿真force命令用于简单模块的仿真直接从命令控制台输入可以使用.DO文件(宏文件),DO文件,DO文件是自动运行仿真步骤的宏文件建库编译仿真强制仿真器激励可以运用于所有ModelSim模式UI)Tools-ExecuteMarcoCmd)do.do可以调用其他DO文件,cdc:mydirvlibworkvlogcounter.vvsimcounterview*addwave/*addlist/*dorun.do,DO文件例子,用ModelSim进行仿真,演示,4.4从例子开始学习ModelSim,例子是一个分频电路的设计。分频电路:是将较高频率的时钟分频,得到较低频率的时钟,分频电路的使用较为广泛。例如,我们要编写一个显示时间的电路就需要一个分频器,将晶振的频率分频得到1Hz的时钟信号。分频有几种方法,对于较为规则的分频,如2分频、4分频、8分频等可以调用ISE本身的库函数来实现;对于较不规则的分频,我们也有两种方法,一种是利用计数器的某一位来作为分频输出,一种是计数器计数到某一数值时,分频时钟信号翻转来实现分频。两种方法都可以从其仿真结果得到。,图形界面对设计进行仿真,Modelsim快速上手四部曲分别是:创建工程、添加Verilog代码文件、编译、仿真。下面简单给出这四步:初学者可以按照如下步骤开始:1、运行ModelSim,方法是点击开始-程序-ModelSimSE6.2b-ModelSim或双击桌面上的快捷方式,会出现界面,如果上一次使用ModelSim建立过工程,这时候会自动打开上一次所建立的工程;,图形界面对设计进行仿真,图形界面对设计进行仿真,2、点击File-New-Project,会出现如图4-3-2所示的界面,在ProjectName中我们输入建立的工程名字为DivClkSimu,在ProjectLocation中输入工程保存的路径为D:/yuProj/modelsim/DivClk,注意ModelSim不能为一个工程自动建立一个目录,这里我们最好是自己在ProjectLocation中输入路径来为工程建立目录,在DefaultLibraryName中为我们的设计编译到哪一个库中,这里我们使用默认值,这样,在我们编译设计文件后,在Workspace窗口的Library中就会出现work库。这里我们输入完以后,点击OK;,图形界面对设计进行仿真,新建工程窗口,图形界面对设计进行仿真,3、这时有对话框图所示,提示我们给定的工程路径不存在,是否建立该路径,我们的目的就是为工程建立一个新目录,因此,点击确定;,确认建立新的工程目录,图形界面对设计进行仿真,4、这时候出现如图所示的界面,可以点击不同的图标来为工程添加不同的项目,点击CreateNewFile可以为工程添加新建的文件,点击AddExistingFile为工程添加已经存在的文件,点击CreateSimulation为工程添加仿真,点击CreateNewFolder可以为工程添加新的目录。这里我们点击CreateNewFile;,5、出现界面如图,我们在FileName中输入DivClk作为文件的名称,Addfileastype为输入文件的类型为VHDL、Verilog、TCL或text,这里我们设置Verilog,Folder为新建的文件所在的路径,TopLevel为在我们刚才所设定的工程路径下。点击OK;并在AdditemstotheProject窗口点击Close关闭该窗口;,图形界面对设计进行仿真,图形界面对设计进行仿真,6、这时候在Workspace窗口中出现了Project选项卡,在其中有DivClk.v,其状态栏有一个问号,表示未编译,我们双击该文件,这时候出现窗口edit-DivClk.v的编辑窗口,在其中输入我们的设计文件如下:,图形界面对设计进行仿真,modulediv(clk_i,clk_o,reset);parameterDIV_N=4;inputclk_i,reset;outputclk_o;regclk_o;integercount;always(negedgeresetorposedgeclk_i)beginif(!reset)count=0;elseif(count=3)count=0;elsecount=count+1;endalways(negedgeresetorposedgeclk_i)beginif(!reset)clk_o=0;elsebeginif(count=(DIV_N/2-1)clk_oClose);8、在WorkSpace窗口的DivClk.v上点击右键,选择Compile-CompileAll,如图所示;,图形界面对设计进行仿真,9、在脚本窗口中将出现一行绿色字体CompileofDivClk.vwassuccessful.,说明文件编译成功,在该文件的状态栏后有一绿色的对号,表示编译成功;10、下面我们开始仿真,点击菜单Simulate-Simulate,会出现如下图所示的界面,我们展开Design选项卡下的work库,并选中其中的div,这时候在Simulate中出现了work.div表示我们所要仿真的对象,Resolution为仿真的时间精度,这里我们使用默认值,点击OK;,图形界面对设计进行仿真,选择仿真对象,图形界面对设计进行仿真,11、为了观察波形窗口,我们点击菜单View-debugwindows-Wave;12、这时候出现的Wave窗口为空,里面什么都没有,我们要为该窗口添加我们需要观察的对象,首先在workspace窗口中右击instance的中例化模块div,选择add-addtowave可得如下图所示,这时候在波形窗口中就可以看到所有的信号了。,图形界面对设计进行仿真,信号窗口,图形界面对设计进行仿真,13、下面我们就开始仿真了,在主窗口中输入命令对信号进行驱动,对时钟信号输入驱动:forceclk_i00,110-r20对reset信号输入驱动:forcereset00,13其中force为命令,clk表示为clk信号驱动,00表示在零时刻该值为0,110表示在10ns处值为1,-r20表示从20ns处开始重复(repeat),可以看出我们这里的输入时钟为50MHz,即周期为20ns;,采用testbench实现仿真,include“DivCLK.v”moduletestdiv;regclk_i;regreset;wireclk_o;always#10clk_i=clk_i;initialbegin#0reset=0;clk_i=0;#5reset=1;#2000$stop;enddivdiv1(.clk_i(clk_i),.clk_o(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工商银行2025秋招无领导模拟题角色攻略安徽地区
- 2025年3D打印技术的工业应用扩展
- 中国银行2025秦皇岛市秋招面试典型题目及参考答案
- 辅导员入职培训课件
- 交通银行2025黑河市秋招面试典型题目及参考答案
- 2025行业国际竞争力分析
- 工商银行2025上饶市小语种岗笔试题及答案
- 邮储银行2025阜阳市秋招英文面试题库及高分回答
- 工商银行2025秋招无领导小组面试案例库陕西地区
- 中国银行2025周口市秋招笔试英语题专练及答案
- 房屋租赁交接家私清单
- 公对私转账借款协议书
- 《思想道德与法治》课件第四章明确价值要求践行价值准则第三节积极践行社会主义核心价值观
- 高等土力学土的本构关系
- GB/T 29494-2013小型垂直轴风力发电机组
- GB/T 19188-2003天然生胶和合成生胶贮存指南
- 2023年化工检修钳工题库及答案
- 酒店文化全套教学课件
- 基于位置的服务LBS课件
- 9.软件质量保证计划
- 收益权投资协议书范本
评论
0/150
提交评论