相关阅读
Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html
$time、 $stime和$realtime这三个系统函数提供了返回当前仿真时间方法,在学习它们之前,可以先学习编译指令`timescale的使用,它用来指定时间单位和时间精度编译指令`timescale。
仿真的时间精度也是仿真器能维护和推进的最小时间,换句话说如果用仿真的时间精度作为仿真时间的单位则不会有小数。
1、$time
$time系统函数返回一个64位(bit)整数的时间值,这个时间值以调用该系统函数的模块的时间单位返回仿真时间,当出现小数时,会进行四舍五入,如例1所示。
// 例1
`timescale 10 ns / 1 ns
module test;
initial begin
#1.55 $display($time);
end
endmodule
输出:
2
根据编译指令`timescale,该模块(该例中也是仿真)的时间精度为1ns,$display系统任务在仿真时间为16ns的时候执行,此时$time系统函数尝试以10ns为单位返回时间值,即1.6,但$time系统函数只能返回整数值,因此四舍五入为2,代表2*10ns。因此在本例中,$display系统任务显示的时间值并不是$display系统任务真正执行的仿真时间。
此时用转换说明%t显示,则会将原结果转换为该模块(该例中也是仿真)的时间精度1ns(以仿真的时间精度为单位是系统函数$timeformat的默认行为),如例2所示。
// 例2
`timescale 10 ns / 1 ns
module test;
initial begin
#1.55 $display("%t", $time);
end
endmodule
输出:
20
2、$stime
$time系统函数和$time系统函数非常像,区别是只返回一个32个二进制位整数的时间值,如果时间值超过了32位,则只会返回低32位的时间值。
3、$realtime
$realtime系统函数可以返回一个实数时间值,这个时间值以调用该系统函数的模块的时间单位返回仿真时间但出现小数时无需四舍五入,这就代表着它能返回最精确的仿真时间。对于上面同样的例子,如果将例1的$display($time);改为$display($realtime);则返回值是1.6,即1.6*10ns,也就是真正$display系统任务执行的时间16ns。