• Verilog的时间格式系统任务----$printtimescale、$timeformat


    概述

            在这篇文章中你真的会用`timescale吗?曾讨论了Verilog中的时间格式设置系统任务`timescale。本文再来介绍两种与时间格式相关的系统任务,分别是:

    • 时间格式显示系统任务:$printtimescale
    • 时间格式设置系统任务:$timeformat

    $printtimescale

            顾名思义,就是打印时间格式`timescale,它的语法格式如下:

                    printtimescale_task ::=$printtimescale [ ( hierarchical_identifier ) ] ;

            其中的hierarchical_identifier代表模块层次,这意味着其不仅可以打印当前module的时间格式,同样可以打印指定module的时间格式。

            其输出内容如下:

                    Time scale of (module_name) is unit / precision

            举个例子:

    1. //module test_a定义
    2. `timescale 1 ms / 1 us //单位1ms,精度1us
    3. module test_a;
    4. initial begin
    5. $printtimescale(test_a); //打印module test_a的时间格式
    6. $printtimescale(test_b_inst); //打印module test_b_inst(被例化的test_b module)的时间格式
    7. end
    8. test_b test_b_inst(); //例化module test_b
    9. endmodule
    10. //module test_b定义
    11. `timescale 1 ns / 1 ps //单位1ns,精度1ps
    12. module test_b;
    13. endmodule

            在上述testbench中,将模块test_a的时间单位/时间精度分别设置成了1ms/1us;同时在模块test_a中例化了模块模块test_b,其时间单位/时间精度分别设置成了1ns/1ps;然后分别打印了两个模块的时间格式,仿真结果(打印内容)如下:

            与预期设计一致。


    $timeformat

            timeformat用于配置其他打印系统任务中($write, $display,$strobe, $monitor, $fwrite, $fdisplay, $fstrobe, and $fmonitor)%t类型的打印格式,它的语法格式如下:

                    timeformat_task ::= $timeformat [ ( units_number , precision_number , suffix_string , minimum_field_width ) ] ;

            其中的units_number使用下表中的数字来表示对应的时间单位:

            0对应1s,-1则对应100ms,````以此类推,-15则对应1fs,可以看到这个对应关系基本上就是时间单位换算关系,非常好记。一般多使用-9即ns的打印方法。

            其中的precision_number 表示时间精度,即需要打印到小数点后几位。

            其中的suffix_string 用来在时间后打印一个用户自定义的字符串。

            其中的minimum_field_width 表示时间值字符串与后缀字符串合起来的这部分字符串的最小长度,若这部分字符串不足这个长度,则在这部分字符串之前补空格。

            如果没有调用该系统函数对时间格式进行设置,则其默认设置如下:

            即时间单位为`timescale设置的时间精度,不精确到小数点后,打印的字符串为空,最小长度为20个长度。

            举个例子:分别打印在默认格式下和设置时间格式为单位1ns,精度小数点后3位,打印字符串 ns,最小打印长度10的情况下的仿真时间。如下:

    1. `timescale 1 ns / 1 ps //单位1ns,精度1ps
    2. module test_a;
    3. initial begin
    4. #10
    5. $display("%t",$realtime); //打印默认格式的仿真时间
    6. #10
    7. $timeformat(-9,3," ns",10);
    8. $display("%t",$realtime); //打印用户设定的格式的仿真时间
    9. end
    10. endmodule

            其仿真结果如下: 

     

    • 第1次打印的是默认格式,所以其值为10000(10ns用精度ps表示即10000,不精确到小数点后,不打印字符串,整体长度为20)
    • 第2次打印的是用户自定的格式,所以其值为20.000(20ns用精度ns表示,同时精确到小数点3位即20.000,打印字符串 ns,整体长度为10)

    总结与参考

    • 这两个系统任务一个可以打印当前仿真时间的格式,另一个则可以设置仿真时间的格式,这给仿真测试提供了很大的灵活性与便利性
    • 在仿真时获取仿真时间可以观察、监测被测模块的测试情况,有利于提高测试效率

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


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

  • 相关阅读:
    【设计模式】 - 创建者模式 -建造者模式
    地空智能SLAM100移动式激光雷达扫描仪
    JAVA创新创业竞赛管理系统2021计算机毕业设计Mybatis+系统+数据库+调试部署
    车载-QNX渲染
    mysql为什么用b+树
    堡垒机部署
    【2021-TITS】Deep Learning in Lane Marking Detection: A Survey
    Python使用MySQL数据库
    基于热交换优化的BP神经网络(分类应用) - 附代码
    jenkins
  • 原文地址:https://blog.csdn.net/wuzhikaidetb/article/details/125998654