0

这是有问题的代码:

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
4

3 回答 3

1

将您的代码更改为

function automatic [31:0] W (input [6:0] param);
    if (param>=16)
       W = W(param-7);
    else
       W = 0;
endfunction

这样如果参数未知,它就不会进入无限递归。

于 2018-02-04T15:55:35.363 回答
1

正如@sharvil111 建议的那样,当时我传递的值是 1'bX。
所以我确保在调用之前将其设置为 0。
感谢其他建议,但例如@dave_59 所说的在我的情况下并没有起到作用,因为param它不是太小,只是还没有定义。

于 2018-02-08T00:10:02.407 回答
0

如果您提供有效的输入,那么您应该不会看到任何 Seg 错误。如果您仍然看到,则需要与工具供应商确认。

于 2018-02-06T23:30:18.727 回答