文章目录
在做仿真的时候,常常需要获取仿真时间以便了解被测模块的测试情况。Verilog语法提供了3个系统任务----$time、$stime、$realtime,这3个系统任务都可以在仿真时(无法综合)获取当前仿真时刻的时间值,但其使用也有一点小小的区别。
调用系统任务$time,将会获得一个64位的integer型变量,其表示调用该系统任务时的仿真时间。需要注意的是,其值会自动缩放到`timescale任务所定义的时间单位。下面举个例子:
- `timescale 10 ns / 1 ns
-
- module tb_time_test;
-
- reg set;
- parameter p = 1.55;
-
- initial begin
- $monitor($time,,"set=",set);
- #p set = 0;
- #p set = 1;
- end
-
- endmodule
仿真结果如下:
接下来我们把上述代码的仿真时间单位改为1ns,时间精度保留为1ns,这样看起来会好理解一些。
- `timescale 1 ns / 1 ns
-
- module tb_time_test;
-
- reg set;
- parameter p = 1.55;
-
- initial begin
- $monitor($time,,"set=",set);
- #p set = 0;
- #p set = 1;
- end
-
- endmodule
仿真结果如下:
调用系统任务$stime,将会获得一个32位的无符号integer型变量,其表示调用该系统任务时的仿真时间。需要注意的是,其值同样会自动缩放到`timescale任务所定义的时间单位。
这个系统任务的用法基本上和 $time是一样的,只不过由于其只有32位,所以表示的时间范围会比较小,使用的时候注意别溢出了。
调用系统任务$realtime,将会获得一个real型变量,其表示调用该系统任务时的仿真时间。需要注意的是,其值会自动缩放到`timescale任务所定义的时间单位。
由于其返回值为实数real型,所以其可以表示小数时间。同样以上面的代码为例:
- `timescale 10 ns / 1 ns
-
- module tb_time_test;
-
- reg set;
- parameter p = 1.55;
-
- initial begin
- $monitor($realtime,,"set=",set);
- #p set = 0;
- #p set = 1;
- end
-
- endmodule
仿真结果如下:
参考资料1:IEEE Standard for Verilog® Hardware Description Language(IEEE Std 1364™-2005)