程序块中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 以找出程序块中方法的默认生命周期,但我没有得到关于它的明确描述。有人可以帮我澄清一下吗?
您看到的差异不是由于 sum 方法的生命周期,而是表达式 n + sum(n-1)
中函数调用的求值顺序,这是不确定的。如果将表达式反转为 sum(n-1) + n
,所有工具都会为具有静态生命周期的函数提供正确的结果。
顺便说一句,我强烈 recommend that you never use program blocks 在 SystemVerilog 中。请改用模块。
`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 以找出程序块中方法的默认生命周期,但我没有得到关于它的明确描述。有人可以帮我澄清一下吗?
您看到的差异不是由于 sum 方法的生命周期,而是表达式 n + sum(n-1)
中函数调用的求值顺序,这是不确定的。如果将表达式反转为 sum(n-1) + n
,所有工具都会为具有静态生命周期的函数提供正确的结果。
顺便说一句,我强烈 recommend that you never use program blocks 在 SystemVerilog 中。请改用模块。