Verilog $*命令,写testbench会用到
$display, $write, $fdisplay, $fopen, $fclose用于信息的显示和输出
%b或%B 二进制
%o或%O 八进制
%d或%D 十进制
%h或%H 十六进制
%e或%E 实数
%c或%C 字符
%s或%S 字符串
%v或%V 信号强度
%t或%T 时间
%m或%M 层次实例
\n 换行
\t 制表符
\\ 反斜杠\
\" 引号”
\%% 百分号%
调用方式:eg:$display("%b+%b=%b",a,b,sum);
$write("%b+%b=%b",a,b,sum);
注:如果没有在指定变量的显示格式,不会输出数值。如果没有指定变量显示的位置,变量值会在字符串部分之后直接显示出来,变量之间是没有间隔的,只是一次简单的显示。
$display, $write的区别是, $display会在每次显示信息后自动换行, $write不会换行。
$fopen,有以下两种用法
a. $fopen("<文件名>");
b. [文件句柄]=$fopen("<文件名>")
integer outfile;
outfile=$fopen("./eeprom.dat") //打开一个名为eeprom.dat的文件,文件句柄为outfile
$fdisplay,将数据写入指定文件
$fdisplay(outfile,"@%0h %0h",addr,data_to_eeprom);
$fclose,关闭文件
$fclose(outfile);
$strobe探测任务
探测任务的语法和显示任务完全相同,也是把信息显示出来。也有$strobe, $strobeb, $strobeo, $strobeh四种。两者的区别在于: $strobe 命令会在当前时间部结束时完成; 而 $display是只要仿真器看到就会立即执行。
$monitor监测任务
监测任务用于持续监测指定变量,只要这些变量发生了变化,就会立即显示对应的输出语句。
eg:
initial
begin
$monitor("x=%b,y=%b,cin=%b",x,y,cin);
end
同理,有 $monitor, $monitorb, $monitoro, $monitorh, 可用 $monitoroff, $monitoeron 关闭监事和打开监视。
$stop, $finish仿真控制任务
区别:$stop暂停当前方针, $finish终止当前方针。
$timeformat
语法:
$timeformat( Units, Precision, Suffix, MinFieldWidth )
规则:
- Unit 是 0 到-15 之间的整数值,表示打印的时间的单位:0 表示秒,-3 表示毫秒,-6 表示微秒。-9 表示毫微秒; -12 表示微微秒; -15 表示毫微微秒;中间值也可以使用:例如-10表示100ps单位。
- Precision 是在小数点后面要打印的小数位数。
- Suffix 是在时间值后面打印的一个字符串。
- MinFieldWidth 是打印的最小数量字符,包括前面的空格。如果要求更多字符,那么打印的字符更多。
- 如果没有指定变量,默认地使用下面的值:Units:仿真精度;Precision:0;Suffix:空字符串;MinFieldWidth:20 个字符。
$timeformat(-10, 2, " x100ps", 20); // 20.12 x100ps
提示:
用`timescale $timeformat 和 $realtime (带%t) 指定和显示仿真时间,用 $display $monitor 或其他显示任务。
$time
在Verilog HDL中有两类型的时间系统函数, $time和 $realtime。用这两个系统用函数可以的大当前的仿真时间。
$time可以返回一个64位的整数来表示当前仿真时刻值,该时刻是以模块的仿真时间尺度位基准的。
$realtime返回的时间数字是一个实型数。该数也是以时间尺度为基准的。
原文链接:https://www.jianshu.com/p/e886d80796ec