iverilog递归函数导致分段错误

时间:2018-02-04 00:54:42

标签: recursion verilog iverilog icarus

这是有问题的代码:

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

3 个答案:

答案 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并不是太小,它还没有定义。