在Systemverilog中有一些与时间相关的系统函数在TB打印log的时候会使用到,在打印log时间的时候,如果与我们预期的不一致,可以在这方面找原因。下面列出相关的系统函数
$time
$stime
$realtime
`timescale
$printtimescale
$time: 返回module 64bit 整数时间单位,这里的时间单位做一下说明,比如 `timescale 10ns/1ns , 时间单位就是10ns
`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类型的单位时间,(注意时间精度即可)
`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)
`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可以用来设置时间单位和时间精度
$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中使用