北京大学Verilog教程14-16

  • 格式:pps
  • 大小:237.50 KB
  • 文档页数:50

第14章对验证的支持学习内容1.理解Verilog文本输出2.理解不同的读取仿真时间的系统函数3.理解Verilog文件I/O功能验证系统中的任务(task)及函数(function)•Verilog读取当前仿真时间的系统函数$time$stime$realtime

•Verilog支持文本输出的系统任务:$display$strobe$write$monitor仿真时间访问仿真时间•$time,$realtime,和$stime函数返回当前仿真时间。•这些函数的返回值使用调用模块中`timescale定义的时间单位•$time返回一个64位整数时间值。•$stime返回一个32位整数时间值。•$realtime返回一个实数时间值。

$stime函数返回一个32位整数时间值。对大于232的时间,返回模232的值。使用它可以节省显示及打印空间。输出格式化时间信息`timescale 10ns / 100psmodule 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;endendmodule

在这个例子中,显示的时间为:180.00 ns

unit:0(s)到-15(fs)之间的整数,表示时间度量

precision:要显示的十进制小数位数。

suffix:在时间值后显示的字符串

min_width:显示前三项的最小宽度

•若使用多个`timescale,以最小的时间精度显示时间值。•可用系统任务$timeformat结合格式符%t全局控制时间显示方式。•$timeformat系统任务的语法为:$timeformat(,,,);输出格式化时间信息`timescale 1 ns / 10 psmodule top;reg in1;not #9.53n1 (o1, in1);initialbegin$display("time realtime 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;endendmodule

time realtime stime in1 o10 0.00ns 0 0 x10 9.53ns 10 0 110 10.00ns 10 1 120 19.53ns 20 1 0输出格式化时间信息对#延迟,Verilog将延迟值舍入最近(四舍五入)时间精度值。例如,上面的例子修改为:

`timescale1ns/100psnot#9.42n1(o1,in1);结果为:timerealtimestimein1o100.00ns00x99.40ns9011010.00ns10111919.40ns19`timescale1ns/100psnot#9.49n1(o1,in1);结果为:timerealtimestimein1o1

00.00ns00x

99.50ns901

1010.00ns1011

1919.50ns19显示信号值—$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, sig3, sig4);$displayb (sig1, sig2, sig3, sig4);$displayo (sig1, sig2, sig3, sig4);$displayh (sig1, sig2, sig3, sig4);

%h %o %d %b %c %s %v %m %thex octal decimal binary ASCII string strength module time

\t \n \\\" \< 1-3 digit octal number> %0dtab 换行反斜杠双引号上述的ASCII表示无前导0的十进制数

格式符转义符显示信号值—$write和$strobe•$write与$display相同,不同的是不会自动换行。$write($time, “%b \t %h \t %d \t %o \t”, sig1, sig2, sig3, sig4);•$strobe与$display相同,不同的是在仿真时间前进之前的信号值。而$display和$write立即显示信号值。也就是说$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位十六进制数表示。时间以没有前导零的十进制形式输出。

缺省情况下,值以十进制显示,忽略前导零,与%0d格式符相同。可以在一个格式化符前插入一个0使Verilog忽略开头的零。•$displayh:00000000000000f 00000010 1注意当前时间,一个64位量,需要16个十六进制的数。•$display:10 20•$strobe:10 30

module textio;reg flag;reg [31: 0] data;initialbegin$writeb("%d", $time, ,"%h \t",data, , flag, "\n");#15 flag = 1; data = 16;$displayh($time, ,data, , flag);endinitialbegin#10 data = 20;$strobe($time, , data);$display($time, , data);data = 30;endendmodule监视信号值—$monitor•$monitor持续监视参数列表中的变量。•在一个时间片中,参数表中任何信号发生变化,$monitor将在仿真时间前进前显示参数表的信号值。•后面的$monitor将覆盖前面的$monitor。•可以用系统任务$monitoron和$monitoroff控制持续监视。•$monitor支持多种基数。缺省为十进制。$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的参数则不被监视。•可以用$monitoron和$monitoroff系统任务控制持续监视,使用户可以在仿真时只监视特定时间段的信号。•$monitor参数列表的形式与$display相同。•$monitor支持多种基数。缺省为十进制。$monitorb$monitoro$monitorh文件输出•$fopen打开一个文件并返回一个多通道描述符(MCD)。–MCD是与文件唯一对应的32位无符号整数。–如果文件不能打开并进行写操作,MCD将等于0。–如果文件成功打开,MCD中的一位将被置位。•以$f开始的显示系统任务将输出写入与MCD相对应的文件中。

. . .integerMCD1;MCD1= $fopen("");$fdisplay( MCD1, P1, P2, .., Pn);$fwrite( MCD1, P1, P2, .., Pn);$fstrobe( MCD1, P1, P2, .., Pn);$fmonitor( MCD1, P1, P2, .., Pn);$fclose( MCD1);. . .