程序块中systemverilog方法的生命周期

The lifetime of systemverilog method in the program block

`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

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

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