第10章 Verilog行为仿真_第1页
第10章 Verilog行为仿真_第2页
第10章 Verilog行为仿真_第3页
第10章 Verilog行为仿真_第4页
第10章 Verilog行为仿真_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章Verilog行为仿真测试程序TestBench一个完整的简单例子testfixture被测试器件DUT是一个二选一多路器。测试程序(testfixture)提供测试激励及验证机制。Testfixture使用行为级描述,DUT采用门级描述。下面将给出Testfixture的描述、DUT的描述及如何进行混合仿真。DUT被测器件(deviceundertest)moduleMUX2_1(outputwireout,inputwirea,b,sel);

//wiresel,a1,b1;//Thenetlist

not(sel_,sel);

and(a1,a,sel_);

and(b1,b,sel);

or(out,a1,b1);endmodule已定义的Verilog基本单元的实例a,b,sel是输入端口,out是输出端口。所有信号通过这些端口从模块输入/输出。另一个模块可以通过模块名及端口说明使用多路器。实例化多路器时不需要知道其实现细节。这正是自上而下设计方法的一个重要特点。模块的实现可以是行为级也可以是门级,但并不影响高层次模块对它的使用。TestFixturetemplatemoduletestfixture;//Datatypedeclaration//Instantiatemodules//Applystimulus//Displayresultsendmodule为什么没有端口?由于testfixture是最顶层模块,不会被其它模块实例化。因此不需要有端口。TestFixture—如何说明实例moduletestfixture;//Datatypedeclaration//Instantiatemodules

MUX2_1

mux(o,a,b,s);//MUX2_1mux(.out(o),.a(a),.b(b),.sel(s));//Applystimulus//DisplayresultsendmodulemoduleMUX2_1(out,a,b,sel);//Portdeclarationsoutputout;inputa,b,sel;wireout,a,b,sel;wiresel_,a1,b1;//Thenetlist

not(sel_,sel);

and(a1,a,sel_);

and(b1,b,sel);

or(out,a1,b1);endmoduleMUX的实例化语句包括:模块名称:与引用模块相同实例名称:任意,但要符合标记命名规则端口列表:与引用模块的次序相同Testfixture激励描述moduletestfixture;//Datatypedeclaration

rega,b,s;

wireo;

//MUXinstanceMUX2_1mux(o,a,b,s);//Applystimulusinitialbegin

a=0;b=1;s=0;#5b=0;#5b=1;s=1;#5a=1;#5$finish;end//DisplayresultsendmoduleTimeValues abs0 01050001001115111例子中,a,b,s说明为reg类数据。reg类数据是寄存器类数据信号,在重新赋值前一直保持当前数据。#5用于指示等待5个时间单位。$finish是结束仿真的系统任务。完整的TestFixturemoduletestfixture;

//数据类型说明rega,b,s;wireo;

//MUX实例化MUX2_1mux(o,a,b,s);

//施加激励initialbegina=0;b=1;s=0;#5b=0;#5b=1;s=1;#5a=1;#5$finish;end//显示结果initial$monitor($time,,"o=%ba=%bb=%bs=%b",o,a,b,s);endmodule0o=0a=0b=1s=05o=0a=0b=0s=010o=1a=0b=1s=115o=1a=1b=1s=1结果输出系统任务与系统函数

◆系统任务和系统函数一般以符号“$”开头。例如:$monitor,$finish等。◆使用不同的Verilog仿真工具(如:VCS、Verilog-XL、ModelSim等)进行仿真时,这些系统任务和系统函数在使用方法上可能存在差异,应根据使用手册来使用。◆一般在intial或always过程块中,调用系统任务和系统函数。◆用户可以通过编程语言接口(PLI)将自己定义的系统任务和系统函数加到语言中,以进行仿真和调试。$display和$write是两个系统任务,两者的功能相同,都用于显示模拟结果,其区别是$display在输出结束后能自动换行,而$write不能。$display和$write的使用格式为:$display(“格式控制符”,输出变量名列表);$write(“格式控制符”,输出变量名列表);1.$display与$write格式控制符说明%h或%H以16进制形式显示%d或%D以10进制形式显示%o或%O以8进制形式显示%b或%B以2进制形式显示%c或%C以ASCII字符形式显示%v或%V显示net型数据的驱动强度%m或%M显示层次名%s或%S以字符串形式输出%t或%T以当前的时间格式显示转义字符说明\n换行\tTAB键\\符号\\“符号“\ddd八进制数ddd对应的ASCII字符%%符号%格式控制符转义字符$monitor、$strobe与$display、$write一样也是属于输出控制类的系统任务,$monitor与$strobe都提供了监控和输出参数列表中字符或变量的值的功能,其使用格式为:$monitor(“格式控制符”,输出变量名列表);$strobe(“格式控制符”,输出变量名列表);这里的格式控制符、输出变量名列表与$display和$write中定义的完全相同。2.$monitor与$strobe$time、$realtime是属于显示仿真时间标度的系统函数。这两个函数被调用时,都返回当前时刻距离仿真开始时刻的时间量值。$time函数以64位整数值的形式返回模拟时间,$realtime函数则以实数型数据返回模拟时间。3.$time与$realtime系统任务$finish与$stop用于对仿真过程进行控制,分别表示结束仿真和中断仿真。$finish与$stop的使用格式如下:$stop;$stop(n);$finish;$finish(n);n是$finish和$stop的参数,n可以是0、1、2等值,分别表示如下含义。0:不输出任何信息;1:给出仿真时间和位置;2:给出仿真时间和位置,还有其他一些运行统计数据。4.$finish与$stop$random:产生随机数的系统函数,每次调用该函数将返回一个32位的随机数,该随机数是一个带符号的整数。一般用法为:$random%b其中b>0,它给出了一个范围在0~b-1之间的随机数。$random%15,产生一个0~14之间的随机数。6.$random和文件操作文件操作:与c语言类似,Verilog也提供了很多文件输出类的系统任务,可将结果输出到文件中。这类任务有:$fopen用于打开某个文件并准备写操作,$fclose用于关闭文件,$fdisplay、$fwrite、$fmonitor等系统任务则用于把文本写入文件。用户定义的原语用户自定义元件

利用UDP(UserDefinedPrimitives)用户可以自己定义基本逻辑元件的功能,用户可以象调用基本门元件一样来调用这些自己定义的元件。UDP关键词为primitive和endprimitive。与一般的模块相比,UDP模块具有下面一些特点:◆UDP的输出端口只能有一个,且必须位于端口列表的第一项。只有输出端口能被定义为reg类型。◆UDP的输入端口可有多个,一般时序电路UDP的输入端口可多至9个,组合电路UDP的输入端口可多至10个。◆所有的端口变量必须是1位标量。◆在table表项中,只能出现0、1、x三种状态,不能出现z状态。primitive元件名(输出端口,输入端口1,输入端口2,…)output输出端口名;input输入端口1,输入端口2,…;reg输出端口名;initialbegin输出端口或内部寄存器赋初值(0,1或x);endtable//输入1输入2……:输出真值列表endtableendprimitive定义UDP的语法组合逻辑示例:2-1多路器举例说明primitivemultiplexer(o,a,b,s);outputo;inputs,a,b;table//abs:o0?1:0;1?1:1;?00:0;?10:1;00x:0;11x:1;endtableendprimitive原语名输出端口必须为第一个端口注:在模块外定义UDP。如果在表中没有规定输入组合,将输出不确定逻辑值(x)。表的列中元素的顺序应与端口列表中的一致。表中的?的意义是:重复的输入0,1或任意不确定逻辑值(x)。表中开始两行表示:当s等于1时,不管b逻辑值如何变化,输出o将与输入a保持一致。表中的下两行表示:当s等于0时,不管a逻辑值如何变化,输出o将与输入b保持一致。表中的最后两行使此器件的描述更加的全面、准确。它们表示:当输入a和b的逻辑值相同时,如果sel逻辑值不确定,则输出o的值将与输入a和b的值相同。这种行为不能使用Verilog语言提供的基本原语元件进行建模。UDP将x作为实际的未知值,而不是Verilog语言逻辑值来进行处理,因此使其比Verilog语言提供的基本原语元件更加准确。举例说明可以只使用两个UDP来描述全加器的逻辑功能。//全加器进位实现部分primitiveU_ADDR2_C(CO,A,B,CI);outputCO;inputA,B,CI,table//ABCI:CO11?:1;1?1:1;?11:1;00?:0;0?0:0;?00:0;endtalbeendprimitive组合逻辑示例:全加器向上一级进位下一级来的进位//全加器求和实现部分primitiveU_ADDR2_S(S,A,B,CI);outputS;inputA,B,CI;table//ABCI:S000:0;001:1;010:1;011:0;100:1;101:0;110:0;111:1;endtableendprimitive组合逻辑示例:全加器若使用UDP设计全加器,仅需要两个UDP;而使用Verilog原语元件,则需要5个Verilog语言提供的基本原语元件。当设计需要使用大量全加器时,采用UDP来表示全加器,将大大减少内存的需要。事件的数目将大大降低。?表示逻辑值可以为0,1或x。组合逻辑示例:全加器primitivelatch(q,clock,data);outputq;regq;inputclock,data;initialq=1’b1;table//clockdatacurrentnext//statestate01:?1;00:?0;1?::-;endtableendprimitive电平敏感的时序逻辑示例:锁存器注意此寄存器的用法,此寄存器用来存储。输出初始化为1‘b1.?表示无须考虑输入和当前状态的值注:锁存器的动作行为如下:当时钟信号为0时,输入数据的值直接传给输出。当时钟信号为1时,输出保持当前状态不变。nextstate栏中的“-”表示输出保持不变。输出必须定义为寄存器类型,用来保存前一个状态。initialq=1’b1;是时序UDP的初始化语句。使用此语句可以在仿真的开始对输出进行赋值。在实际的部件模型中,很少使用初始赋值。但在测试UDP的功能时,初始赋值相当有用。电平敏感的时序逻辑示例:锁存器primitived_edge_ff(q,clk,data);outputq;inputclk,data;re

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论