如何定义系统veriolg中的时间单位和时间精度

时间:2015-12-22 08:51:50

标签: system-verilog

//`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,那么代码可以正常运行上面代码中的错误

3 个答案:

答案 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

有关详细信息,请参阅timeunitdifference between time unit and time precisiontime scale tutorial链接。

答案 1 :(得分:1)

此错误已报告给Cadence,他们计划在以后的模拟器版本中对其进行修复。

如评论中所述,避免编译错误的解决方法是使用2条单独的语句:

timeunit     100ps;
timeprecision 10ps;

注意:在edaplayground(Incisive 15.20)上当前可用的Cadence模拟器版本中也会看到ncvlog: *E,TUSERR错误。

答案 2 :(得分:0)

这是一个古老的问题,但是被人们高估的答案甚至都没有试图回答为什么您遇到错误。

最重要的是,我认为您的代码没有任何问题。我认为这是nc / irun / xrun的问题;即使最新版本仍然会出现此错误。另一方面,vcs可以毫无问题地进行编译。