1 系统函数
Verilog 语言中预先定义了一些任务和函数,用于完成一些特殊的功能,它们被称为系统任务和系统函数,这些函数大多数都是只能在 Testbench 仿真中使用的,使我们更方便的进行验证。
1.1 时间预编译指令及延时
时间精度:决定时间相关量的精度及仿真显示的最小刻度。
例如:`timescale 1ns/10ps 精度0.01,
时间单位不能比时间精度小,下面这种写法就是错误的:
例如:`timescale 100ps/1ns
如:#10.11 表示延时10110ps。
1.2 $display
类似于C语言中的printf函数,可自动换行。
以上例子 “” 内的内容被打印,将a以二进制形式输出,b以二进制形式输出,然后将C以十进制输出。
1.3 $write
用$display差不多,但要手动换行。
实例:
(左图中18行应还有endmodule)
由于write没有自动换行,由代码第10行和第11行可知其两行字应该在一起,EmbedFire加了换行符后换行了。
1.4 $strobe
无论此函数在哪里写,都是在文件的最后才编译。
实例(代码不完整,主要为了展示其最后才编译的特点):
strobe在display前,但还是strobe的最后才来打印。
1.5 $monitor
monitor中的语句只要“”内的任何一个变量发生变化,就会打印一遍该语句。
实例:
如图,可以看到,第11行,a变量被赋值,即发生变化,打印(此时bc未赋值故为x),第13行,b又被赋值,即发生变化,打印(此时c未被赋值为x),第15行,c又被赋值,即发生变化,直接打印,故有三条打印结果。
1.6 $stop和$finish
$stop是暂停仿真,$finish是结束仿真,直接使用即可。
实例:
可以看到,输出“Stop Simulation ”后,黄色划线部分对应于暂停了仿真,然后暂停仿真后继续仿真是从原来暂停的位置继续的,而不是从头来!红色划线则刚好对应结束仿真。
1.7 $time和$random
$time为时间函数,返回64位当前仿真时间(即显示当前仿真时间);
$random用于产生随机数,返回随机数。
实例:
看这个实例,第6行表示每延迟10ns,a赋值一个随机值,然后第八行,用monitor进行打印(只要a变化就打印一次此时的a值),且使用了$time,会打印此时仿真对应的时间。
看结果,代码编写是每延迟10ns,a赋值一个随机值,打印对应的仿真时间也是每行相差10ns。
1.8 $readmemb 和 $readmemh
看最后一个字母,b表示二进制,h表示十进制。故$readmemb为读取二进制文件,$readmemh为读取十进制文件。
存贮器名就是将读取的文件赋值到这里。
注:本节为学习了哔哩哔哩网站上“野火”官方号视频所得个人经验,如有侵权,请联系我,欢迎指正~