• Verilog的时间系统任务----$time、$stime、$realtime


    文章目录

            概述

            $time

            $stime

            $realtime

            总结与参考


    概述

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


    $time

            调用系统任务$time,将会获得一个64位的integer型变量,其表示调用该系统任务时的仿真时间。需要注意的是,其值会自动缩放到`timescale任务所定义的时间单位。下面举个例子:

    1. `timescale 10 ns / 1 ns
    2. module tb_time_test;
    3. reg set;
    4. parameter p = 1.55;
    5. initial begin
    6. $monitor($time,,"set=",set);
    7. #p set = 0;
    8. #p set = 1;
    9. end
    10. 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,这样看起来会好理解一些。

    1. `timescale 1 ns / 1 ns
    2. module tb_time_test;
    3. reg set;
    4. parameter p = 1.55;
    5. initial begin
    6. $monitor($time,,"set=",set);
    7. #p set = 0;
    8. #p set = 1;
    9. end
    10. 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型,所以其可以表示小数时间。同样以上面的代码为例:

    1. `timescale 10 ns / 1 ns
    2. module tb_time_test;
    3. reg set;
    4. parameter p = 1.55;
    5. initial begin
    6. $monitor($realtime,,"set=",set);
    7. #p set = 0;
    8. #p set = 1;
    9. end
    10. 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平台🐵
    • 📣您有任何问题,都可以在评论区和我交流📞!
    • 📣创作不易,您的支持是我持续更新的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

  • 相关阅读:
    Java语言中的泛型的概念和使用方法
    【LeetCode】No.108. Convert Sorted Array to Binary Search Tree -- Java Version
    java锁
    2022R2移动式压力容器充装考题及答案
    SpringBoot【SpringBoot指标监控、SpringBoot日志管理、SpringBoot项目部署、 SpringBoot容器化部署】(五)-全面详解(学习总结---从入门到深化)
    SVG鼠标漫游
    瑞合信LED字幕WiFi卡使用教程(8.0版)
    ClickHouse(24)ClickHouse集成mongodb表引擎详细解析
    Android app保活(前台服务)
    6.Tomcat概述与部署
  • 原文地址:https://blog.csdn.net/wuzhikaidetb/article/details/125992226