仿真验证与Testbench编写.ppt
《仿真验证与Testbench编写.ppt》由会员分享,可在线阅读,更多相关《仿真验证与Testbench编写.ppt(132页珍藏版)》请在三一办公上搜索。
1、第五章 仿真验证与Testbench编写,5/31/2023,1,Microelectronics School Xidian University,5.1 Verilog HDL电路仿真和验证概述,仿真,也叫模拟,是通过使用EDA仿真工具,通过输入测试信号,比对输出信号(波形、文本或者VCD文件)和期望值,来确认是否得到与期望所一致的正确的设计结果,验证设计的正确性。验证是一个证明设计思路如何实现,保证设计在功能上正确的一个过程。验证在Verilog HDL设计的整个流程中分为4个阶段:阶段1:功能验证;阶段2:综合后验证;阶段3:时序验证;阶段4:板级验证。,5/31/2023,2,Mic
2、roelectronics School Xidian University,5.2 Verilog HDL测试程序设计基础,5.2.1 Testbench及其结构在仿真的时候Testbench用来产生测试激励给待验证设计(Design Under Verification,DUV),或者称为待测设计(Design Under Test,DUT)。,Testbench平台结构,测试程序的一般结构,由于Testbench是一个测试平台,信号集成在模块内部,没有输入输出。,在Testbench模块内,例化待测设计的顶层模块,并把测试行为的代码封装在内,直接对待测系统提供测试激励。,例5.2-1 T
3、触发器测试程序示例module Tflipflop_tb;/数据类型声明reg clk,rst_n,T;wire data_out;TFF U1(.data_out(data_out),.T(T),.clk(clk),.rst_n(rst_n);/对被测模块实例化always/产生测试激励#5 clk=clk;Initial begin clk=0;#3 rst_n=0;#5 rst_n=1;T=1;#30 T=0;#20 T=1;endInitial/对输出响应进行收集 begin$monitor($time,T=%b,clk=%b,rst_n=%b,data_out=%b,T,clk,rs
4、t_n,data_out);endendmodule,T触发器的仿真波形和部分文本输出结果:,部分文本输出结果:0T=x,clk=0,rst_n=x,data_out=x3T=x,clk=0,rst_n=0,data_out=05T=x,clk=1,rst_n=0,data_out=08T=1,clk=1,rst_n=1,data_out=110T=1,clk=0,rst_n=1,data_out=1,从图中可以清晰地看出Testbench的主要功能:(1)为DUT提供激励信号。(2)正确实例化DUT。(3)将仿真数据显示在终端或者存为文件,也可以显示在波形窗口中以供分析检查。(4)复杂设计可
5、以使用EDA工具,或者通过用户接口自动比较仿真结果与理想值,实现结果的自动检查。,在编写Testbench时需要注意的问题:(1)testbench代码不需要可综合Testbench代码只是硬件行为描述不是硬件设计。(2)行为级描述效率高Verilog HDL语言具备5个描述层次,分别为开关级、门级、RTL级、算法级和系统级。(3)掌握结构化、程式化的描述方式 结构化的描述有利于设计维护,可通过initial、always以及assign语句将不同的测试激励划分开来。一般不要将所有的测试都放在一个语句块中。,测试平台举例,DUT的仿真平台,测试平台需要产生时钟信号、复位信号和一系列的仿真向量,
6、观察DUT的响应,确认仿真结果。,(1)组合逻辑电路仿真环境的搭建,module adder1(a,b,ci,so,co);input a,b,ci;output so,co;assignco,so=a+b+ci;endmodule根据全加器的真值表(表5.2-1)编写的全加器测试程序如下:module adder1_tb;wire so,co;reg a,b,ci;adder1 U1(a,b,ci,so,co);/模块例化 initial/测试信号产生 begin a=0;b=0;ci=0;#20 a=0;b=0;ci=1;#20 a=0;b=1;ci=0;#20 a=0;b=1;ci=1;
7、#20 a=1;b=0;ci=0;#20 a=1;b=0;ci=1;#20 a=1;b=1;ci=0;#20 a=1;b=1;ci=1;#200$finish;end endmodule,全加器的输入a、b和ci定义为reg型变量;把输出so和co定义为wire型变量 用模块例化语句“adder1 U1(a,b,ci,so,co);”把全加器设计电路例化到测试仿真环境中;用initial块语句改变输入的变化并生成测试条件,输入的变化语句完全根据全加器的真值表编写 仿真结果:,(2)时序逻辑电路仿真环境的搭建,在于时序逻辑电路仿真环境中,需要考虑时序、定时信息和全局复位、置位等信号要求,并定义这
8、些信号。,用Verilog HDL编写的十进制加法计数器源程序代码是:module cnt10(clk,rst,ena,q,cout);input clk,rst,ena;output 3:0 q;output cout;reg 3:0 q;always(posedge clk or posedge rst)begin if(rst)q=4b0000;else if(ena)begin if(q9)q=q+1;else q=0;end end assign cout=q3 endmodule,Verilog HDL测试程序代码是:module cnt10_tb;reg clk,rst,ena;
9、wire 3:0 q;wire cout;cnt10 U1(clk,rst,ena,q,cout);/模块实例化 always#50 clk=clk;/时钟信号产生 initial begin clk=0;rst=0;ena=1;/控制信号产生#1200 rst=1;#120 rst=0;#2000 ena=0;#200 ena=1;#20000$finish;end endmodule,实例化语句“cnt10 U1(clk,rst,ena,q,cout);”把十进制计数模块例化到仿真环境中;在always中用语句“#50 clk=clk;”产生周期为100(标准时间单位)的时钟方波;用ini
10、tial块生成复位信号rst和使能控制信号ena的测试条件。测试结果如图:,5.2.3 Verilog HDL仿真结果确认,(1)直接观察波形通过直接观察各信号波形的输出,比较测试值和期望值的大小,来确定仿真结果的正确性。,(2)打印文本输出法,module adder1_tb;wire so,co;reg a,b,ci;adder1 U1(a,b,ci,so,co);/模块例化 initial/测试信号产生 begin a=0;b=0;ci=0;#20 a=0;b=0;ci=1;#20 a=0;b=1;ci=0;#20 a=0;b=1;ci=1;#20 a=1;b=0;ci=0;#20 a=
11、1;b=0;ci=1;#20 a=1;b=1;ci=0;#20 a=1;b=1;ci=1;#200$finish;end$monitor($time,%b%b%b-%b%b,a,b,ci,so,co);endmodule,其输出的结果是:0 0 0 0-0 0 20 0 0 1-1 0 40 0 1 0-1 0 60 0 1 1-0 1 80 1 0 0-1 0,系统任务打印任务:$display,直接输出到标准输出设备;$monitor,监控参数的变化;$fdisplay,输出到文件等,(3)自动检查仿真结果自动检查仿真结果是通过在设计代码中的关键节点添加断言监控器,形成对电路逻辑综合的注释
12、或是对设计特点的说明,以提高设计模块的观察性。(4)使用VCD文件Verilog HDL提供一系列系统任务用于记录信号值变化保存到标准的VCD(Value Change Dump)格式数据库中。VCD文件是一种标准格式的波形记录文件,只记录发生变化的波形。VCD文件将在第小节中详细讲述。,5.2.4 Verilog HDL仿真效率,因为要通过串行软件代码完成并行语义的转化,Verilog HDL行为级仿真代码的执行时间比较长。提高Verilog HDL代码的仿真代码执行时间:(1)减小层次结构 仿真代码的层次越少,执行时间就越短。(2)减少门级代码的使用由于门级建模属于结构级建模,建议仿真代码
13、尽量使用行为级语句,建模层次越抽象,执行时间就越短。,(3)仿真精度越高,效率越低计时单位值与计时精度值的差距越大,则模拟时间越长。timescale仿真时间标度将在第小节中详细讲述。(4)进程越少,效率越高代码中的语句块越少仿真越快,这是因为仿真器在不同进程之间进行切换也需要时间。(5)减少仿真器的输出显示Verilog HDL语言包含一些系统任务,可以在仿真器的控制台显示窗口输出一些提示信息,但会降低仿真器的执行效率。,5.3与仿真相关的系统任务,5.3.1$display和$write语法格式如下:$display(“”,);$write(“”,);“”通常称为“格式控制”“”则为“信号
14、输出列表”$display自动地在输出后进行换行$write输出特定信息时不自动换行,输出格式说明,由“%”和格式字符组成,其作用是将输出的数据转换成指定的格式输出。常用的几种输出格式如右表。,一些特殊的字符可以通过表中的转换序列来输出。,例5.3-1:$display和$write语句,module disp_tb;reg31:0 rval;pulldown(pd);initialbegin rval=101;$display(t%n123);$display(rval=%h hex%d decimal,rval,rval);$display(rval=%o otal%b binary,rv
15、al,rval);$display(rval has%c ascii character value,rval);$display(pd strength value is%v,pd);$display(current scope is%m);$display(%s is ascii value for 101,101);$write(“simulation time is”);$write(“%tn”,$time);endendmodule,其输出结果为:%Srval=00000065 hex 101 decimalrval=00000000145 octal 000000000000000
16、00000000001100101 binaryrval has e ascii character valuepd strength value is StXcurrent scope is dispe is ascii value for 101simulation time is 0,在$display中,输出列表中数据的显示宽度是自动按照输出格式进行调整的,总是用表达式的最大可能值所占的位数来显示表达式的当前值。,5.3.2$monitor和$strobe,$monitor与$stobe都提供了监控和输出参数列表中字符或变量的值的功能(1)$monitor语法格式:$monitor(”
17、,);任务$monitor提供了监控和输出参数列表中的表达式或变量值的功能。每当参数列表中变量或表达式的值发生变化时,整个参数列表中变量或表达式的值都将输出显示。例如:$monitor($time,rxd=%b txd=%b,rxd,txd);注意在上面的语句中,“,代表一个空参数。空参数在输出时显示为空格。,$monitoron和$monitoroff任务的作用是通过打开和关闭监控标志来控制监控任务$monitor的启动和停止,这样使得程序员可以很容易的控制$monitor何时发生。$monitor与$display的不同处在于$monitor往往在initial块中调用,只要不调用$mon
18、itoroff,$monitor便不间断地对所设定的信号进行监视。,例5.3-2:$monitor系统任务的应用实例module monitor_tb;integer a,b;initial begin a=2;b=4;forever begin#5 a=a+b;#5 b=a-1;end end initial#40$finish;initial$monitor($time,a=%d,b=%d,a,b);endmodule,输出结果为:0 a=2,b=45 a=6,b=410 a=6,b=515 a=11,b=520 a=11,b=1025 a=21,b=1030 a=21,b=2035 a=
19、41,b=20,(2)$strobe语法格式:$strobe();$strobe(“”,);探测任务用于在某时刻所有时间处理完后,在这个时间步的结尾输出一行格式化的文本。常用的系统任务如下:$strobe:在所有时间处理完后,以十进制格式输出一行格式化的文本;$strobeb:在所有时间处理完后,以二进制格式输出一行格式化的文本;$strobeo:在所有时间处理完后,以八进制格式输出一行格式化的文本;$strobeh:在所有时间处理完后,以十六进制格式输出一行格式化的文本。,$strobe任务在被调用的时刻所有的赋值语句都完成了,才输出相应的文字信息。$strobe任务提供了另一种数据显示机制
20、,可以保证数据只在所有赋值语句被执行完毕后才被显示。,例5.3-3:$strobe系统任务的应用实例module strobe_tb;reg a,b;initial begin a=0;$display(“a by display is:”,a);$strobe(“a by strobe is:”,a);a=1;endinitial begin b=0;$display(“b by display is:”,b);$strobe(“b by strobe is:”,b);,#5;$display(“#5 b by display is:”,b);$display(“#5 b by strobe
21、 is:”,b);b=1;endEndmodule显示结果是:a by display is:0 b by display is:x a by strobe is:1 b by strobe is:0#5 b by display is:0#5 b by strobe is:0,5.3.3$time和$realtime,用这两个时间系统函数可以得到当前的仿真时刻,所不同的是,$time函数以64位整数值的形式返回仿真时间,而$realtime函数则以实数型数据返回仿真时间。(1)系统函数$time,例5.3-4:$time系统任务的应用实例timescale 1ns/1nsmodule tim
22、e_tb;reg ts;parameter delay=2;initial begin#delay ts=1;#delay ts=0;#delay ts=1;#delay ts=0;endinitial$monitor($time,ts=%b,ts);/使用函数$time endmodule,输出结果为:0 ts=x3 ts=15 ts=08 ts=110 ts=0,(2)$realtime系统函数,$realtime返回的时间数字是一个实型数,该数字也是以时间尺度为基准的。,例5.3-5:$realtime系统任务的应用实例timescale1ns/1nsmodule realtime_tb
23、;reg set;parameter p=2;initial begin$monitor($realtime,set=b%,set);/使用函数$realtime#p set=0;#p set=1;endendmodule输出结果为:0 set=x2 set=04 set=1,5.3.4$finish和$stop,系统任务$finish和$stop是用于对仿真过程进行控制,分别表示结束仿真和中断仿真。其语法格式:$finish;$finish(n);$stop;$stop(n);其中,n是$finish和$stop的参数,n可以取0、1或2几个值,分别表示如下含义,如下表所示。,$finish
24、的作用是退出仿真器,返回主操作系统,也就是结束仿真过程。任务$finish可以带参数,根据参数的值输出不同的特征信息。如果不带参数,默认$finish的参数值为1。$stop任务的作用是把EDA工具(例如仿真器)置成暂停模式,在仿真环境下给出一个交互式的命令提示符,将控制权交给用户。这个任务可以带有参数表达式。根据参数值(0,1或2)的不同,输出不同的信息。参数值越大,输出的信息越多。,$finish和$stop实例,例5.3-6:$finish系统任务的应用实例module finish_tb;integer a,b;initial begin a=2;b=4;forever begin#5
25、 a=a+b;#5 b=a-1;end end initial#40$finish;initial begin$monitor($time,a=%d,b=%d,a,b);endendmodule在上例中,程序执行到40个时间单位时退出仿真器。,例5.3-7:$stop系统任务的应用实例module stop_tb;integer a,b;initial begin a=2;b=4;forever begin#5 a=a+b;#5 b=a-1;end end initial#40$stop;initial begin$monitor($time,a=%d,b=%d,a,b);endendmodu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 仿真 验证 Testbench 编写
链接地址:https://www.31ppt.com/p-5050917.html