这是有问题的代码:
function automatic [31:0] W;
input [6:0] param;
W = (param<16) ? 32'b0 : W(param-7);
endfunction
基本上,iverilog(Icarus Verilog)只给我一个Segmentation fault: 11 vvp svsim
错误。
我尝试了一些调试,似乎不喜欢递归,即使我有一个递归锚
尽管从内部调用函数不是问题。也测试了。
任何帮助表示赞赏!
修改
在这里,我有一段调用此函数的代码失败:
always @(negedge clk) begin
t1 <= W(j);
end
答案 0 :(得分:1)
将您的代码更改为
function automatic [31:0] W (input [6:0] param);
if (param>=16)
W = W(param-7);
else
W = 0;
endfunction
这样,如果param未知,它就不会进入无限递归。
答案 1 :(得分:0)
如果您提供有效输入,那么您不应该看到任何Seg故障。如果你仍然看到,那么需要与工具供应商核实。
答案 2 :(得分:0)
正如@ sharvil111建议的那样,我在那个时间点传递的值是1'bX
所以我确保在打电话之前把它设置为0
感谢其他建议,但是@ dave_59所说的并没有在我的情况下做到这一点,因为param
并不是太小,它还没有定义。