//`timescale 10ps/1fs
module time_presion();
timeunit 100ps/10ps; //If We change this to 100ns/10ps it works fine
parameter p=11.49;
int a;
initial begin
$monitor("%t ,My values Changes %d",$time,a);
#p a = 10;
#p a = 30;
#p a = 40;
//#100us;
#p a = 50;
#1 $finish(1);
end
endmodule
当我运行此代码时,我收到错误
file: time_prcision.sv
timeunit 100ps/10ps;
|
ncvlog: *E,TUSERR (time_prcision.sv,4|11): timeunit is smaller than the specified time precision [IEEE Std 1800-2009].
module worklib.time_presion:sv
errors: 1, warnings: 0
如果我将时间单位更改为100ns / 10ps,那么代码可以正常运行上面代码中的错误
答案 0 :(得分:6)
来自SystemVerilog LRM 1800-2012,第3.14.2.2节:
时间单位和精度可以分别由timeunit和timeprecision关键字声明,并设置为时间字面值(见5.8)。
第timeunit 100ps/10ps;
行在本地定义当前模块,程序,包或界面中的时间单位。
如果指定,则timeunit和timeprecision声明应在当前时间范围中之前 。。
时间单位告诉您延迟(例如)延迟时间#1
。如果我们选择100ps
作为时间单位,则提供#1
延迟将导致 100ps 延迟。
时间精度告诉您可以在给定时间单位中配置的最小 延迟。精度表示将相对用于时间单位的精确度小数点的数量。例如:
timescale 100ps/10ps shall have a #1 delay of 100ps
while you can give #0.1 as the smallest delay i.e. of 10ps.
timescale 1ns/1ps shall have `#1` as 1ns and `#0.001`
as 1ps as the smallest delay.
在您的代码中,timescale 10ps/1fs
代表#1
10ps 延迟,#0.0001
是最小可衡量延迟。现在,出现错误:
timeunit is smaller than the specified time precision
直观地说,可以说时间单位必须永远小于时间精度。这在上面的错误中说明。
100ps/10ps
的时间刻度应四舍五入每个小数位后的延迟。提供11.49应四舍五入为 11.5 并乘以时间精度然后显示。
简而言之,使用timescale 1ns/1ps
,延迟被解释为以纳秒为单位,任何分数都被舍入到最接近的皮秒。我在display语句中使用$realtime
,输出如下。显示115
是由于时间格式中的默认时间缩放(time*timeunit/timeprecision)
。
0 ,My values Changes 0
115 ,My values Changes 10
230 ,My values Changes 30
345 ,My values Changes 40
460 ,My values Changes 50
有关详细信息,请参阅timeunit,difference between time unit and time precision和time scale tutorial链接。
答案 1 :(得分:1)
此错误已报告给Cadence,他们计划在以后的模拟器版本中对其进行修复。
如评论中所述,避免编译错误的解决方法是使用2条单独的语句:
timeunit 100ps;
timeprecision 10ps;
注意:在edaplayground(Incisive 15.20)上当前可用的Cadence模拟器版本中也会看到ncvlog: *E,TUSERR
错误。
答案 2 :(得分:0)
这是一个古老的问题,但是被人们高估的答案甚至都没有试图回答为什么您遇到错误。
最重要的是,我认为您的代码没有任何问题。我认为这是nc / irun / xrun的问题;即使最新版本仍然会出现此错误。另一方面,vcs可以毫无问题地进行编译。