Verilog 的系统任务和系统函数主要用于仿真。本节介绍常用的系统任务和系统函数。这些系统任务和系统函数提供了各种功能,比如实时显示当前仿真时间($time
)、显示信号的值($display
、$monitor
)及控制模拟的执行过程暂停仿真($stop
)、结束仿真($finish
)等。
系统任务和系统函数有以下一些共同的特点:系统任务和系统函数一般以符号“$
”开头,如$monitor
、$readmemh
等;
在使用不同的 Verilog 仿真工具(如 VCS、Verilog-XL、ModelSim 等)进行仿真时,这些系统任务和系统函数在使用方法上可能存在差异,应根据使用手册来使用;一般在 initial或 always 过程块中调用系统任务和系统函数;用户可以通过编程语言接口(PLI)将自己定义的系统任务和系统函数加到语言中,以进行仿真和调试。
下面介绍常用的系统任务和系统函数,多数仿真工具都支持这些任务和函数,且基本能够满足般的仿真测试需要。
1.$display 与 $write
$display
和$write
是两个系统任务,两者的功能相同,都用于显示模拟结果,其区别是$display
在输出结束后能白动换行,而$write
不能。
$dispaly
和$write
的使用格式为
$dispaly("格式控制符",输出变量名列表);
$write("格式控制符",输出变量名列表);
比如
$display($time,,,"a=%h,b=%h,c=%h",a,b,c);
该语句定义了信号显示的格式,即以十六进制格式显示信号a,b,c
的值,两个相邻的都好“,,
”表示加入一个空格。
格式控制符及其说明如表所示:
格式控制符 | 说明 |
---|---|
%h或%H | 以十六进制形式显示 |
%d或%D | 以十进制形式显示 |
%o或%O | 以八进制形式显示 |
%b或%B | 以二进制形式显示 |
%c或%C | 以ASCII字符形式显示 |
%v或%V | 显示net型数据的驱动强度 |
%m或%M | 显示层次名 |
%s或%S | 字符串形式输出 |
%t或%T | 以当前的时间格式显示 |
也可用display
显示字符串,比如
$display("I am great!\n");
该语句表示直接输出引号中的字符串,其中\n
是转义字符,表示换行。Verilog定义的转义字符如表所示:
转义字符 | 说明 |
---|---|
\n | 换行 |
\t | Tab键 |
\ | 符号\ |
" | 符号“ |
\ddd | 八进制数ddd对应的ASCII字符 |
%% | 符号% |
2.$monitor 与 $strobe
$monitor
、$strobe
与$display
、$write
一样,也属于输出控制类的系统任务,$monitor
与$strobe
都提供了监控和输出参数列表中字符或变量的值的功能,其使用格式为:
$monitor("格式控制符",输出变量名列表);
$strobe("格式控制符",输出变量名列表);
此处的格式控制符、输出变量名列表与$display
和$write
中定义的完全相同。
比如:
$monitor($timem,"a=%b,b=%h",a,b);
每次a或b信号的值发生变化,都会激活上面的语句,并显示当前仿真时间、二进制格式的a信号和十六进制格式的b信号。
可将$monitor
想象为一个持续监控器,一旦被调用,就相当于启动了一个实时监控器,如果输出变量名列表中的任何变量发生了变化,则系统将按照$monitor
语句中所规定的格式将结果输出一次。而$strobe
相当于选通监控器,$strobe
只有在模拟时间发生改变,并且所有的事件都已处理完毕后,才将结果输出。$strobe
更多地用来显示用非阻塞方式赋值的变量的值。
比如
$monitor($time,,,"a=%d,b=%d,c=%d"