第14章对验证的支持.ppt
《第14章对验证的支持.ppt》由会员分享,可在线阅读,更多相关《第14章对验证的支持.ppt(50页珍藏版)》请在三一文库上搜索。
1、第14章 对验证的支持,学习内容 理解Verilog文本输出 理解不同的读取仿真时间的系统函数 理解 Verilog文件I/O功能,验证系统中的任务(task)及函数(function),Verilog读取当前仿真时间的系统函数 $time $stime $realtime Verilog支持文本输出的系统任务: $display $strobe $write $monitor,仿真时间,访问仿真时间 $time,$realtime,和$stime函数返回当前仿真时间。 这些函数的返回值使用调用模块中timescale定义的时间单位 $time返回一个64位整数时间值。 $stime返回一个3
2、2位整数时间值。 $realtime返回一个实数时间值。 $stime函数返回一个32位整数时间值。对大于232的时间,返回模232的值。使用它可以节省显示及打印空间。,输出格式化时间信息,timescale 10ns / 100ps module top; reg in1; not m1( o1, in1); initial begin $timeformat(-9, 2, “ns“, 10); in1 = 0; #8 in1 = 1; #10 $display(“%t %b %b“, $realtime, in1, o1); #10 $finish; end endmodule,unit:
3、0(s)到-15(fs)之间的整数,表示时间度量 precision:要显示的十进制小数位数。 suffix:在时间值后显示的字符串 min_width:显示前三项的最小宽度,若使用多个timescale,以最小的时间精度显示时间值。 可用系统任务$timeformat结合格式符%t全局控制时间显示方式。 $timeformat系统任务的语法为: $timeformat(,);,输出格式化时间信息,timescale 1 ns / 10 ps module top; reg in1; not #9.53 n1 (o1, in1); initial begin $display(“time re
4、altime stime t in1 t o1 “); $timeformat(-9, 2, “ns“, 10); $monitor(“%d %t %d t %b t %b“, $time, $realtime, $stime, in1, o1); in1 = 0; #10 in1 = 1; #10 $finish; end endmodule,time realtime stime in1 o1 0 0.00ns 0 0 x 10 9.53ns 10 0 1 10 10.00ns 10 1 1 20 19.53ns 20 1 0,输出格式化时间信息,对#延迟,Verilog将延迟值舍入最近(
5、四舍五入)时间精度值。 例如,上面的例子修改为:,timescale 1ns/ 100ps not #9.42 n1 (o1, in1); 结果为: time realtime stime in1 o1 0 0.00ns 0 0 x 9 9.40ns 9 0 1 10 10.00ns 10 1 1 19 19.40ns 19 1 0,timescale 1ns/ 100ps not #9.49 n1 (o1, in1); 结果为: time realtime stime in1 o1 0 0.00ns 0 0 x 9 9.50ns 9 0 1 10 10.00ns 10 1 1 19 19.5
6、0ns 19 1 0,显示信号值 $display,$display输出参数列表中信号的当前值。 语法:$display(“ format_specifiers”, ) $display输出时自动换行。 $display ($ time, “%b t %h t %d t %o”, sig1, sig2, sig3, sig4); $display ($ time, “%b t”, sig1, “%h t”, sig2, “% d t”, sig3, “%o”, sig4); $display支持二进制、八进制、十进制和十六进制。缺省基数为十进制。 $display (sig1, sig2, s
7、ig3, sig4); $displayb (sig1, sig2, sig3, sig4); $displayo (sig1, sig2, sig3, sig4); $displayh (sig1, sig2, sig3, sig4);,格式符,转义符,显示信号值$write和$strobe,$write与$display相同,不同的是不会自动换行。 $write($time, “%b t %h t %d t %o t”, sig1, sig2, sig3, sig4); $strobe与$display相同,不同的是在仿真时间前进之前的信号值。而$display和$write立即显示信号值
8、。也就是说$strobe显示稳定状态信号值,而$display和$write可以显示信号的中间状态值。 $strobe($time, “%b t %h t %d t %o t”, sig1, sig2, sig3, sig4); $write和$strobe都支持多种数基,缺省为十进制。 $writeb $strobeb $writeo $strobeo $writeh $strobeh,显示信号值$write和$strobe,下面是模块textio仿真的输出: $writeb输出: 0 xxxxxxxx x 注意data是32位数据,由8位十六进制数表示。时间以没有前导零的十进制形式输出。
9、缺省情况下,值以十进制显示,忽略前导零,与%0d格式符相同。可以在一个格式化符前插入一个0使Verilog忽略开头的零。 $displayh: 00000000000000f 00000010 1 注意当前时间,一个64位量,需要16个十六进制的数。 $display: 10 20 $strobe: 10 30,module textio; reg flag; reg 31: 0 data; initial begin $writeb(“%d“, $time, ,“%h t“, data, , flag, “n“); #15 flag = 1; data = 16; $displayh($ti
10、me, ,data, , flag); end initial begin #10 data = 20; $strobe($time, , data); $display($time, , data); data = 30; end endmodule,监视信号值$monitor,$monitor持续监视参数列表中的变量。 在一个时间片中,参数表中任何信号发生变化,$monitor将在仿真时间前进前显示参数表的信号值。 后面的$monitor将覆盖前面的$monitor。 可以用系统任务$monitoron和$monitoroff控制持续监视。 $monitor支持多种基数。缺省为十进制。 $
11、monitor ($ time, “%b t %h t %d t %o”, sig1, sig2, sig3, sig4);,监示信号值$monitor,$monitor是唯一的不断输出信号值的系统任务。其它系统任务在返回值之后就结束。 $monitor和$strobe一样,显示参数列表中信号的稳定状态值,也就是在仿真时间前进之前显示信号。在一个时间步中,参数列表中信号值的任何变化将触发$monitor 。但$time,$stime,$realtime不能触发。 任何后续的$monitor覆盖前面调用的$monitor。只有新的$monitor的参数列表中的信号被监视,而前面的$monitor
12、的参数则不被监视。 可以用$monitoron和$monitoroff系统任务控制持续监视,使用户可以在仿真时只监视特定时间段的信号。 $monitor参数列表的形式与$display相同。 $monitor支持多种基数。缺省为十进制。 $monitorb $monitoro $monitorh,文件输出,$fopen打开一个文件并返回一个多通道描述符(MCD)。 MCD是与文件唯一对应的32位无符号整数。 如果文件不能打开并进行写操作,MCD将等于0。 如果文件成功打开,MCD中的一位将被置位。 以$f开始的显示系统任务将输出写入与MCD相对应的文件中。,. . . integer MCD1
13、; MCD1 = $fopen(“); $fdisplay( MCD1, P1, P2, , Pn); $fwrite( MCD1, P1, P2, , Pn); $fstrobe( MCD1, P1, P2, , Pn); $fmonitor( MCD1, P1, P2, , Pn); $fclose( MCD1); . . .,文件输出,$fopen打开参数中指定的文件并返回一个32位无符号 整数MCD,MCD是与文件一一对应的多通道描述符。如果文件不能打开并进行写操作,它返回0。 $fclose关闭MCD指定的通道。 输出信息到log文件和标准输出的四个格式化显示任务($display,
14、 $write, $monitor, $strobe)都有相对应的任务用于向指定文件输出。 这些对应的任务($fdisplay,$fwrite,$fmonitor,$fstrobe)的参数形式与对应的任务相同,只有一个例外:第一个参数必须是一个指定向何哪个文件输出的MCD。MCD可以是一个表达式,但其值必须是一个32位的无符号整数。这个值决定了该任务向哪个打开的文件写入。 MCD可以看作由32个标志构成的组,每个标志代表一个单一的输出通道。,文件输出,. . . integer messages, broadcast, cpu_chann, alu_chann; initial begin c
15、pu_chann = $fopen(“ cpu.dat“); if(! cpu_chann) $finish; alu_chann = $fopen(“ alu.dat“); if(! alu_chann) $finish; / channel to both cpu. dat and alu. dat messages = cpu_chann | alu_chann; / channel to both files, standard out, and verilog. log broadcast = 1 | messages; end always ( posedge clock) / p
16、rint the following to alu. dat $fdisplay( alu_chann, “acc= %h f=%h a=%h b=%h“, acc, f, a, b); /* at every reset print a message to alu. dat, cpu. dat, standard output and the verilog. log file */ always ( negedge reset) $fdisplay( broadcast, “system reset at time %d“, $time); . . .,必须声明为integer,通道0(
17、编号为1)为标准输出及verilog.log,文件输入,Verilog中有两个系统任务可以将数据文件读入寄存器组。一个读取二进制数据,另一个读取十六进制数据: $readmemb $readmemb (“file_name“, ); $readmemb (“file_name“, , ); $readmemb (“file_name“, , , ); $readmemh $readmemh (“ file_name“, ); $readmemh (“ file_name“, , ); $readmemh (“ file_name“, , , );,文件输入,系统任务$readmemb和$rea
18、dmemh从一个文本文件读取数据并写入存储器。 如果数据为二进制,使用$readmemb;如果数据为十六进制,使用$readmemh。 filename指定要调入的文件。 mem_name指定存储器名。 start和finish决定存储器将被装载的地址。Start为开始地址,finish为结束地址。如果不指定开始和结束地址,$readmem按从低端开始读入数据,与说明顺序无关。,文件输入,$readmemb和$readmemh的文件格式 : $readmemb(“mem_file. txt“, mema);,0000_0000 0110_0001 0011_0010 / 地址3255没有定义
19、100 / hex 1111_1100 /地址2571022没有定义 3FF 1110_0010,文本文件:mem_file.txt,声明的存储器组 reg 0:7 mema0:1023,module readmem; reg 0:7 mema 0:1023 initial $readmemb(“mem_file.txt”, mema); endmodule,文件输入,$readmemb和$readmemh的文件格式 : $readmemb(“mem_file. txt“, mema);,可以指定二进制(b)或十六进制(h)数 用下划线(_)提高可读性。 可以包含单行或多行注释。 可以用空格和
20、换行区分存储器字。 可以给后面的值设定一个特定的地址,格式为: (hex_address) 十六进制地址的大小写不敏感。 在和数字之间不允许有空格。,复习,问题: 哪个系统任务显示参数列表中信号的稳定状态值? 每次能打开多少个输出文件?,解答: 系统任务$monitor和$strobe显示参数列表中信号的稳定状态值。这些任务在时间前进之前输出信号值。 每次只能打开一个输出文件,包括已由仿真器打开的任何log文件。,第十五章 Verilog Test Bench使用简介,学习内容: 用一个复杂的test bench复习设计的组织与仿真 建立test bench通常使用的编码风格及方法,设计组织,
21、虚线表示编译时检测输入文件是否存在及可读并允许生成输出文件。,test bench组织,简单的test bench向要验证的设计提供向量,人工验证输出。 复杂的test bench是自检测的,其结果自动验证。,简单的test bench,复杂的test bench,并行块,forkjoin块在测试文件中很常用。他们的并行特性使用户可以说明绝对时间,并且可以并行的执行复杂的过程结构,如循环或任务。,module inline_ tb; reg 7: 0 data_ bus; / instance of DUT initial fork data_bus = 8b00; #10 data_bus
22、= 8h45; #20 repeat (10) #10 data_bus = data_bus + 1; #25 repeat (5) #20 data_bus = data_bus 1; #140 data_bus = 8h0f; join endmodule,上面的两个repeat循环从不同时间开始,并行执行。象这样的特殊的激励集在单个的beginend块中将很难实现。,Time | data_ bus 0 | 8b0000_0000 10 | 8b0100_0101 30 | 8b0100_0110 40 | 8b0100_0111 45 | 8b1000_1110 50 | 8b100
23、0_1111 60 | 8b1001_0000 65 | 8b0010_0000 70 | 8b0010_0001 80 | 8b0010_0010 85 | 8b0100_0100 90 | 8b0100_0101 100 | 8b0100_0110 105 | 8b1000_1100 110 | 8b1000_1101 120 | 8b1000_1110 125 | 8b0001_1100 140 | 8b0000_1111,包含文件,包含文件用于读入代码的重复部分或公共数据。,module clk_gen (clk); output clk; reg clk; include “comm
24、on.txt“ initial begin while ($ time sim_end) begin clk = initial_clock; #(period/2) clk = !initial_clock; #(period/2); end $finish; end endmodule,在上面的例子中,公共参数在一个独立的文件中定义。此文件在不同的仿真中可被不同的测试文件调用。,/ common. txt / clock and simulator constants parameter initial_clock = 1; parameter period = 15; parameter
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 14 验证 支持
链接地址:https://www.31doc.com/p-2576790.html