Systemverilog中时间单位以及相关系统函数

在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中使用