在Systemverilog中有一些与时间相关的系统函数在TB打印log的时候会使用到,在打印log时间的时候,如果与我们预期的不一致,可以在这方面找原因。下面列出相关的系统函数
$time
$stime
$realtime
`timescale
$printtimescale
$time: 返回module 64bit 整数时间单位,这里的时间单位做一下说明,比如 `timescale 10ns/1ns , 时间单位就是10ns
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | `timescale 10ns/1ns module test; logic a; parameter p=1.55; initial begin #p a=1; $display($time,"a is %b",a); #p a=0; $display($reatime,"a is %b",a); end endmodele //最终的结果 2: a is 1 3: a is 0 |
这里第一次#p=1.55(1.55 X 10ns,实际是1.6 X10,有时间精度),取整2
这里第二次#p=1.55(3.2X 10ns), 取整3
所以$time返回的的是时间单位的整数倍(四舍五入取整)
$stime:返回的是32bit unsigned 整数,规则与上面的 $time一样
$realtime:返回的是real类型的单位时间,(注意时间精度即可)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | `timescale 10ns/1ns module test; logic a; parameter p=1.55; initial begin #p a=1; $display($reatime,"a is %b",a); #p a=0; $display($reatime,"a is %b",a); end endmodele //最终的结果 1.6: a is 1 3.2: a is 0 |
`timescale:
$printtimescale: 这与时间单位 和时间精度相关(time unit time precision)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | `timescale 10ns/1ns module test; logic a; parameter p=1.55; initial begin $printtimescale(); #p a=1; $display($reatime,"a is %b",a); #p a=0; $display($reatime,"a is %b",a); end endmodele //结果 10ns/1ns 1.6: a is 1 3.2: a is 0 |
在实际的工程中,打印log与自己预期不一致的情况多与time unit ,time precision有关,可以使用$printtimescale来显示当前module的设置
$printtimescale(hierarchical_identifier)可以显示指定层次的time unit ,time precision
$printtimescale()显示当前scope的time unit ,time precision
别的系统函数timeunit timeprecision可以用来设置时间单位和时间精度
1 2 3 4 5 | $timeformat [ ( units_number , precision_number , suffix_string , minimum_field_width ) ] ;这个函数用来控制%t的打印格式 units_number://时间数值 -9代表ns precision_number://时间精度 3代表小数点后有3位的精度 suffix_string: //打印的时间单位 minimum_field_width://数值宽度 |
注:在SV中,从standard 标准准,timeunit 和timeprecision只能使用与moduel,program,package,interface等scope中,不能在class中使用