我是靠谱客的博主 虚拟未来,最近开发中收集的这篇文章主要介绍Systemverilog中时间单位以及相关系统函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

最后

以上就是虚拟未来为你收集整理的Systemverilog中时间单位以及相关系统函数的全部内容,希望文章能够帮你解决Systemverilog中时间单位以及相关系统函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部