• 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平台🐵
    • 📣您有任何问题,都可以在评论区和我交流📞!
    • 📣创作不易,您的支持是我持续更新的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

  • 相关阅读:
    Eotalk Vol.03:结合 API & DaaS,让使用数据更方便
    Python爬虫实战:图片爬取与保存
    5道面试中的常见的统计学问题
    过滤表filter达式cql相互转化
    【Java】常用的文件操作
    【经验总结】Ubuntu 源代码方式安装 Microsoft DeepSpeed
    什么是V2X?如何通过V2X技术实现5G智慧交通?(二)
    Java简单实现图片上传与下载
    NCCL源码解析⑥:Channel搜索
    Spring中shutdown hook作用
  • 原文地址:https://blog.csdn.net/wuzhikaidetb/article/details/125998654