Verilog基础:$timeformat系统任务的使用
相关阅读
Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482
$timeformat系统任务用于指定$write、$display、$strobe、$monitor、$fwrite、$fdisplay、$fstrobe和$fmonitor系统任务中的格式字符串中,转换说明%t如何对时间数据进行转换。在阅读本文之前,建议先学习编译指令`timescale和系统函数$time的使用,如下面两篇博客所示。Verilog基础:编译指令`timescalehttps://blog.csdn.net/weixin_45791458/article/details/134804982?sharetype=blogdetail&sharerId=134804982&sharerefer=PC&sharesource=weixin_45791458&spm=1011.2480.3001.8118
Verilog基础:$time、$stime和$realtime系统函数的使用https://blog.csdn.net/weixin_45791458/article/details/134815889?sharetype=blogdetail&sharerId=134815889&sharerefer=PC&sharesource=weixin_45791458&spm=1011.2480.3001.8118
首先给出$timeformat系统任务语法的BNF范式,有关BNF范式的内容可以在之前的文章中找到:
units_number参数代表了一个指定的单位,是一个范围从-15到0的整数,具体含义如下表所示。
数字 | 代表单位 | 数字 | 代表单位 |
0 | 1s | -8 | 10ns |
-1 | 100ms | -9 | 1ns |
-2 | 10ms | -10 | 100ps |
-3 | 1ms | -11 | 10ps |
-4 | 100us | -12 | 1ps |
-5 | 10us | -13 | 100fs |
-6 | 1us | -14 | 10fs |
-7 | 100ns | -15 | 1fs |
precision_number参数代表了小数点后的四舍五入的位数。
suffix_string参数代表了添加的后缀字符串。
minimum_field_width参数代表了输出最少占用的宽度。
从调用$timeformat系统任务的仿真时间开始,后续所有使用转换说明%t输出的时间,都会按照设置的单位、精度、后缀字符串和最小字段宽度进行转换。
默认情况下转换说明%t使用仿真时间精度作为单位(仿真时间精度是一个层次设计的所有模块中最小的时间精度),保留整数,不添加后缀,最小字段宽度为20。
首先以简单的例1进行说明,该例不涉及$time系统函数。
// 例1
`timescale 1 ns / 1 ps
module top;initial $timeformat(-10, 5, "", 10);initial #1 $display("%t", 5);
endmodule输出:
50.00000
由于转换说明%t对应了常数5,而top模块的时间单位为1ns,而$timeformat系统任务指定了单位是100ps,转换后原结果需要乘10,即50并保留5位小数。
再来看一下涉及到$time系统函数的例2。
// 例2
`timescale 10 ns / 1 ns
module top;initial $timeformat(-10, 2, "", 10);initial #1.55 $display("%t", $time);
endmodule输出:
200.00
正如编译指令`timescale一文中所说,$display系统任务在仿真时间为16ns的时候执行,此时$time系统函数尝试以10ns为单位返回时间值,即1.6,但$time系统函数只能返回整数值,因此四舍五入为2,top模块的时间单位为10ns,而$timeformat系统任务指定了单位是100ps,转换后原结果需要乘100,即200并保留5位小数。