【问题标题】:The lifetime of systemverilog method in the program block程序块中systemverilog方法的生命周期
【发布时间】:2022-01-22 19:40:55
【问题描述】:
`define NUM 100
program test;
  function automatic int sum(int n);
    if(n <= 1) 
      return n;
    else 
      return n + sum(n-1);          
  endfunction
  
  initial begin
    $display("sum(%0d)=%d",`NUM, sum(`NUM)); 
    
  end

endprogram

上面是一段代码,它对从 1 到 NUM 的增量整数的总和进行了递归练习。当我在 EDA 操场上的 vcs/xcelium/Questa 中运行它时,结果符合预期。

sum(100)=       5050

但是,当我尝试对 function int sum(int n) 的生命周期进行修改时:

program test;
  function int sum(int n);
    if(n <= 1) 
      return n;
    else 
      return n + sum(n-1);          
  endfunction
  
  initial begin
    $display("sum(%0d)=%d",`NUM, sum(`NUM)); 
    
  end
  
endprogram

结果很有趣:

VCS            : sum(100)=        100
Cadence xcelium: sum(100)=        5050
Questa         : sum(100)=        5050

我回到 IEEE1800-2017 以找出程序块中方法的默认生命周期,但我没有得到明确的描述。有人能帮我澄清一下吗?

https://www.edaplayground.com/x/v3gb

【问题讨论】:

    标签: system-verilog lifetime


    【解决方案1】:

    您看到的差异不是由于 sum 方法的生命周期,而是表达式 n + sum(n-1) 中函数调用的求值顺序,这是不确定的。如果将表达式反转为 sum(n-1) + n,所有工具都会为具有静态生命周期的函数提供正确的结果。

    顺便说一句,我在 SystemVerilog 中强烈 recommend that you never use program blocks。改用模块。

    【讨论】:

    • 嗨戴夫,感谢您的回答。我想了解更多关于表达式中函数调用的评估。它如何使工具混乱?你说得对,我是 Vera 用户。当我做一些简短的示例代码时,我曾经使用程序块。从您的链接中很好地了解程序块的使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2016-07-11
    相关资源
    最近更新 更多