淘先锋技术网

首页 1 2 3 4 5 6 7

文章目录

        概述

        $time

        $stime

        $realtime

        总结与参考


概述

        在做仿真的时候,常常需要获取仿真时间以便了解被测模块的测试情况。Verilog语法提供了3个系统任务----$time、$stime、$realtime,这3个系统任务都可以在仿真时(无法综合)获取当前仿真时刻的时间值,但其使用也有一点小小的区别。


$time

        调用系统任务$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

        仿真结果如下: 

  • 在上面的例子中,将仿真时间单位定义成了10ns,而时间精度则定义为1ns。
  • 第1行,set未赋值,所以输出 set = x,此时时间为0
  • 第2行,set赋值为0,所以输出 set = 0,此时时间为1.55*10=15.5ns,由于精度为1ns,所以四舍五入到16ns,同时由于时间单位为10ns,所以不能表示16ns,而是表示四舍五入后的2(单位10ns)
  • 第3行,set赋值为1,所以输出 set = 1,此时时间为16+1.55*10=31.5ns,由于精度为1ns,所以四舍五入到32ns,同时由于时间单位为10ns,所以不能表示32ns,而是表示四舍五入后的3(单位10ns)

        接下来我们把上述代码的仿真时间单位改为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

        仿真结果如下:

  • 在上面的例子中,将仿真时间单位定义成了1ns,而时间精度则定义为1ns。
  • 第1行,set未赋值,所以输出 set = x,此时时间为0
  • 第2行,set赋值为0,所以输出 set = 0,此时时间为1.55*1=1.55ns,由于精度为1ns,所以四舍五入到2ns,时间单位为1ns,所以直接显示2(单位1ns)
  • 第3行,set赋值为1,所以输出 set = 1,此时时间为2+1.55*1=3.55ns,由于精度为1ns,所以四舍五入到4ns,时间单位为1ns,所以直接显示4(单位1ns)

$stime

        调用系统任务$stime,将会获得一个32位的无符号integer型变量,其表示调用该系统任务时的仿真时间。需要注意的是,其值同样会自动缩放到`timescale任务所定义的时间单位。

        这个系统任务的用法基本上和 $time是一样的,只不过由于其只有32位,所以表示的时间范围会比较小,使用的时候注意别溢出了。


$realtime

        调用系统任务$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

        仿真结果如下:

  • 在上面的例子中,将仿真时间单位定义成了10ns,而时间精度则定义为1ns。
  • 第1行,set未赋值,所以输出 set = x,此时时间为0
  • 第2行,set赋值为0,所以输出 set = 0,此时时间为1.55*10=15.5ns,由于精度为1ns,所以四舍五入到16ns,同时由于时间单位为10ns,所以不能表示16ns,而是表示1.6(可以表示小数了,单位10ns)
  • 第3行,set赋值为1,所以输出 set = 1,此时时间为16+1.55*10=31.5ns,由于精度为1ns,所以四舍五入到32ns,同时由于时间单位为10ns,所以不能表示32ns,而是表示3.2(可以表示小数了,单位10ns)

总结与参考

  • $time、$stime、$realtime这三个系统任务都可以获取当前仿真时间,区别在于返回的时间值的类型不同,一般的应用使用$time即可
  • 在仿真时获取仿真时间可以观察、监测被测模块的测试情况,有利于提高测试效率

        参考资料1:IEEE Standard for Verilog® Hardware Description Language(IEEE Std 1364™-2005)


  • 📣博客主页:wuzhikai.blog.csdn.net
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵
  • 📣您有任何问题,都可以在评论区和我交流📞!
  • 📣创作不易,您的支持是我持续更新的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!