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

下载本文档

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

文档简介

1、第第10章章Verilog行为仿真行为仿真 测试程序测试程序TestBench一个完整的简单例子一个完整的简单例子 test fixture被测试器件被测试器件DUT是一个二选一多路器。测试程序是一个二选一多路器。测试程序(test fixture)提提供测试激励及验证机制。供测试激励及验证机制。Test fixture使用行为级描述,使用行为级描述,DUT采用门级描述。下面将给出采用门级描述。下面将给出Test fixture的描述、的描述、DUT的描述及如何进行混合仿真。的描述及如何进行混合仿真。DUT 被测器件被测器件 (device under test) module MUX2_1

2、( output wire out, input wire a, b, sel ); /wire sel, a1, b1; / The netlist not (sel_, sel); and (a1, a, sel_); and (b1, b, sel); or (out, a1, b1);endmodule已定义的已定义的 Verilog基基本单元的本单元的实例实例a, b, sel是输入端口,是输入端口,out是输出是输出端口。所有信号通过这些端口从模端口。所有信号通过这些端口从模块输入块输入/输出。输出。另一个模块可以通过模块名及端口另一个模块可以通过模块名及端口说明使用多路器。实例化

3、多路器时说明使用多路器。实例化多路器时不需要知道其实现细节。这正是自不需要知道其实现细节。这正是自上而下设计方法的一个重要特点。上而下设计方法的一个重要特点。模块的实现可以是行为级也可以是模块的实现可以是行为级也可以是门级,但并不影响高层次模块对它门级,但并不影响高层次模块对它的使用。的使用。Test Fixture templatemodule testfixture; / Data type declaration / Instantiate modules / Apply stimulus / Display resultsendmodule为什么没为什么没有端口?有端口?由于由于tes

4、tfixture是最顶层模是最顶层模块,不会被其它模块实例化。块,不会被其它模块实例化。因此不需要有端口。因此不需要有端口。Test Fixture 如何说明实例module testfixture; / Data type declaration / Instantiate modules MUX2_1 mux (o, a, b, s);/ MUX2_1 mux (.out(o), .a(a), .b(b), .sel(s); / Apply stimulus / Display resultsendmodulemodule MUX2_1 (out, a, b, sel); / Port d

5、eclarations output out; input a, b, sel; wire out, a, b, sel; wire sel_, a1, b1; / The netlist not (sel_, sel); and (a1, a, sel_); and (b1, b, sel); or (out, a1, b1);endmoduleMUXMUX的实例化语句包括:的实例化语句包括: 模块名称:与引用模块相同模块名称:与引用模块相同 实例名称:任意,但要符合标记命名规则实例名称:任意,但要符合标记命名规则 端口列表:与引用模块的次序相同端口列表:与引用模块的次序相同Test fix

6、ture 激励描述激励描述module testfixture; / Data type declaration reg a, b, s; wire o; / MUX instance MUX2_1 mux (o, a, b, s); / Apply stimulus initial begin a = 0; b = 1; s = 0; #5 b = 0; #5 b = 1; s = 1; #5 a = 1; #5 $finish; end / Display resultsendmoduleTime Values a b s0 0 1 05 0 0 010 0 1 115 1 1 1例子中,

7、例子中,a, b, sa, b, s说明为说明为regreg类数据。类数据。regreg类数据是寄存器类数据信号,在重新赋值类数据是寄存器类数据信号,在重新赋值前一直保持当前数据。前一直保持当前数据。#5 #5 用于指示等待用于指示等待5 5个时间单位。个时间单位。$ $finishfinish是结束仿真的系统任务。是结束仿真的系统任务。完整的完整的Test Fixturemodule testfixture; / 数据类型说明数据类型说明 reg a, b, s; wire o; / MUX实例化实例化 MUX2_1 mux (o, a, b, s); / 施加激励施加激励 initial

8、begin a = 0; b = 1; s = 0; #5 b = 0; #5 b = 1; s = 1; #5 a = 1; #5 $finish; end/ 显示结果显示结果 initial $monitor($time, o=%b a=%b b=%b s=%b, o, a, b, s);endmodule0 o= 0 a= 0 b= 1 s= 05 o= 0 a= 0 b= 0 s= 010 o= 1 a= 0 b= 1 s= 115 o= 1 a= 1 b= 1 s= 1结果输出结果输出系统任务与系统函数系统任务与系统函数 系统任务和系统函数一般以符号系统任务和系统函数一般以符号“$”

9、开头。例如:开头。例如: $monitor,$finish等。等。 使用不同的使用不同的Verilog仿真工具(如:仿真工具(如:VCS、Verilog-XL、ModelSim等)进行仿真时,这些系统任务和系统函数在使等)进行仿真时,这些系统任务和系统函数在使用方法上可能存在差异,应根据使用手册来使用。用方法上可能存在差异,应根据使用手册来使用。 一般在一般在intial或或always过程块中,调用系统任务和系统过程块中,调用系统任务和系统函数。函数。 用户可以通过编程语言接口(用户可以通过编程语言接口(PLI)将自己定义的系统)将自己定义的系统任务和系统函数加到语言中,以进行仿真和调试。任

10、务和系统函数加到语言中,以进行仿真和调试。$display和和$write是两个系统任务,两者的功能相同,是两个系统任务,两者的功能相同,都用于显示模拟结果,其区别是都用于显示模拟结果,其区别是$display在输出结束后在输出结束后能自动换行,而能自动换行,而$write不能。不能。$display和和$write的使用格式为:的使用格式为:$display(“格式控制符格式控制符”,输出变量名列表);,输出变量名列表);$write(“格式控制符格式控制符”,输出变量名列表);,输出变量名列表);1$display与与$write格式控制符格式控制符转义字符转义字符$monitor、$st

11、robe与与$display、$write一样也是属一样也是属于输出控制类的系统任务,于输出控制类的系统任务,$monitor与与$strobe都提供都提供了监控和输出参数列表中字符或变量的值的功能,其使了监控和输出参数列表中字符或变量的值的功能,其使用格式为:用格式为:$monitor(“格式控制符格式控制符”,输出变量名列表,输出变量名列表);$strobe(“格式控制符格式控制符”,输出变量名列表,输出变量名列表);这里的格式控制符、输出变量名列表与这里的格式控制符、输出变量名列表与$display和和$write中定义的完全相同。中定义的完全相同。2$monitor与与$strobe$

12、time、$realtime是属于显示仿真时间标度的系统函数。是属于显示仿真时间标度的系统函数。u这两个函数被调用时,都返回当前时刻距离仿真开始时这两个函数被调用时,都返回当前时刻距离仿真开始时 刻的时间量值。刻的时间量值。u$time 函数以函数以64位整数值的形式返回模拟时间,位整数值的形式返回模拟时间, $realtime 函数则以实数型数据返回模拟时间。函数则以实数型数据返回模拟时间。 3$time与与$realtime系统任务系统任务$finish与与$stop用于对仿真过程进行控制,分用于对仿真过程进行控制,分别表示结束仿真和中断仿真。别表示结束仿真和中断仿真。$finish与与$

13、stop 的使用格式如下:的使用格式如下:$stop;$stop(n);$finish;$finish(n);n是是$finish和和$stop的参数,的参数,n 可以是可以是0、1、2等值,分等值,分别表示如下含义。别表示如下含义。0:不输出任何信息;:不输出任何信息;1:给出仿真时间和位置;:给出仿真时间和位置;2:给出仿真时间和位置,还有其他一些运行统计数据。:给出仿真时间和位置,还有其他一些运行统计数据。4$finish与与$stop$random:产生随机数的系统函数,每次调用该函数将返回一个产生随机数的系统函数,每次调用该函数将返回一个32位的随机数,该随机数是一个带符号的整数。位

14、的随机数,该随机数是一个带符号的整数。一般用法为:一般用法为: $random % b其中其中b0,它给出了一个范围在,它给出了一个范围在0b-1之间的随机数。之间的随机数。$random%15,产生一个,产生一个014之间的随机数之间的随机数。6$random 和文件操作和文件操作文件操作:文件操作: 与与c 语言类似,语言类似,Verilog也提供了很多文件输出类的系统任务,可将也提供了很多文件输出类的系统任务,可将结果输出到文件中。这类任务有:结果输出到文件中。这类任务有:$fopen用于打开某个文件并准备写操作,用于打开某个文件并准备写操作,$fclose用于关闭文件,用于关闭文件,$

15、fdisplay、$fwrite、$fmonitor等系统任务则用于把文本写入文件。等系统任务则用于把文本写入文件。用户定义的原语用户定义的原语用户自定义元件用户自定义元件 利用利用UDP(User Defined Primitives)用户可以自己定义基本逻)用户可以自己定义基本逻辑元件的功能,用户可以象调用基本门元件一样来调用这些自己定义的辑元件的功能,用户可以象调用基本门元件一样来调用这些自己定义的元件。元件。 UDP关键词为关键词为primitive和和endprimitive。与一般的模块相比,。与一般的模块相比,UDP模块具有下面一些特点:模块具有下面一些特点: UDP的输出端口只

16、能有一个,且必须位于端口列表的第一项。只的输出端口只能有一个,且必须位于端口列表的第一项。只有输出端口能被定义为有输出端口能被定义为reg类型。类型。 UDP的输入端口可有多个,一般时序电路的输入端口可有多个,一般时序电路UDP的输入端口可多至的输入端口可多至9个,组合电路个,组合电路UDP的输入端口可多至的输入端口可多至10个。个。 所有的端口变量必须是所有的端口变量必须是1位标量。位标量。 在在table表项中,只能出现表项中,只能出现0、1、x三种状态,不能出现三种状态,不能出现z状态。状态。primitive 元件名(输出端口,输入端口元件名(输出端口,输入端口1,输入端口,输入端口2

17、,)output 输出端口名;输出端口名;input 输入端口输入端口1,输入端口,输入端口2,;reg输出端口名;输出端口名;initial begin 输出端口或内部寄存器赋初值(输出端口或内部寄存器赋初值(0,1或或x);); endtable /输入输入1 输入输入2 :输出:输出 真值列表真值列表endtableendprimitive定义定义UDP的语法的语法组合逻辑示例:组合逻辑示例:2-1 多路器多路器举例说明举例说明primitive multiplexer(o, a, b, s); output o; input s, a, b; table / a b s : o 0 ?

18、 1 : 0; 1 ? 1 : 1; ? 0 0 : 0; ? 1 0 : 1; 0 0 x : 0; 1 1 x : 1; endtableendprimitive原语名原语名输出端口必须为输出端口必须为第一个端口第一个端口注:注:在模块外定义在模块外定义 UDP 。如果在表中没有规定输入组合,将输出不确定逻辑值如果在表中没有规定输入组合,将输出不确定逻辑值 (x)。表的列中元素的顺序应与端口列表中的一致。表的列中元素的顺序应与端口列表中的一致。表中的表中的 ?的意义是:重复的输入?的意义是:重复的输入 0,1或或 任意不确定逻辑值任意不确定逻辑值(x)。表中开始两行表示:当表中开始两行表示

19、:当 s等于等于 1 时,不管时,不管 b 逻辑值如何变化,输出逻辑值如何变化,输出 o 将与将与 输入输入 a 保持一致。保持一致。 表中的下两行表示:当表中的下两行表示:当 s 等于等于 0 时,不管时,不管 a逻辑值如何变化,输出逻辑值如何变化,输出 o 将与输入将与输入 b 保持一致。保持一致。 表中表中 的最后两行使此器件的描述更加的全面、准确。它们表示:当输的最后两行使此器件的描述更加的全面、准确。它们表示:当输入入 a 和和 b 的逻辑值相同时,如果的逻辑值相同时,如果 sel 逻辑值不确定,则输出逻辑值不确定,则输出 o 的值的值 将将与输入与输入 a 和和 b 的值相同。这种

20、行为不能使用的值相同。这种行为不能使用 Verilog 语言提供的基本原语言提供的基本原语元件进行建模。语元件进行建模。UDP 将将 x 作为实际的未知值,而不是作为实际的未知值,而不是 Verilog 语言语言逻辑值来进行处理,因此使其比逻辑值来进行处理,因此使其比Verilog语言提供的基本原语元件更加语言提供的基本原语元件更加准确。准确。举例说明举例说明可以只使用两个可以只使用两个 UDP 来描述全加器的逻辑功能。来描述全加器的逻辑功能。/ 全加器进位实现部分全加器进位实现部分primitive U_ADDR2_C (CO, A, B, CI); output CO; input A,

21、B, CI, table / A B CI : CO 1 1 ? : 1; 1 ? 1 : 1; ? 1 1 : 1; 0 0 ? : 0; 0 ? 0 : 0; ? 0 0 : 0; endtalbeendprimitive组合逻辑示例:全加器组合逻辑示例:全加器向上一级进位下一级来的进位/全加器求和实现部分全加器求和实现部分primitive U_ADDR2_S(S, A, B,CI); output S; input A, B, CI; table / A B CI : S 0 0 0 : 0; 0 0 1 : 1; 0 1 0 : 1; 0 1 1 : 0; 1 0 0 : 1; 1

22、0 1 : 0; 1 1 0 : 0; 1 1 1 : 1; endtableendprimitive组合逻辑示例:全加器组合逻辑示例:全加器 若使用若使用 UDP 设计全加器,仅需要两个设计全加器,仅需要两个 UDP; 而使用而使用 Verilog 原语元件,原语元件,则需要则需要 5 个个Verilog语言提供的基本原语元件。语言提供的基本原语元件。当设计需要使用大量全加器时,采用当设计需要使用大量全加器时,采用UDP来表示全加器,将大大减少内来表示全加器,将大大减少内存的需要。存的需要。事件的数目将大大降低。事件的数目将大大降低。?表示逻辑值可以为?表示逻辑值可以为 0,1或或 x。组合

23、逻辑示例:全加器组合逻辑示例:全加器primitive latch(q, clock, data); output q; reg q; input clock, data; initial q=1b1; table / clock data current next / state state 0 1 : ? 1; 0 0 : ? 0; 1 ? : : -; endtableendprimitive电平敏感的时序逻辑示例:锁存器电平敏感的时序逻辑示例:锁存器注意此寄存器的用法,注意此寄存器的用法,此寄存器用来存储。此寄存器用来存储。输出初始化为输出初始化为 1b1.1b1. ? ? 表示无须考虑输入表示无须考虑输入和当前状态的值和当前状态的值注:注:锁存器的动作行为如下:锁存器的动作行为如下: 当时钟信号为当时钟信号为 0时,输入数据的值直接传给输出。时,输入数据的值直接

温馨提示

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

评论

0/150

提交评论