iverilog递归函数导致分段错误
iverilog recursive function causes segmentation fault
这是有问题的代码:
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
将您的代码更改为
function automatic [31:0] W (input [6:0] param);
if (param>=16)
W = W(param-7);
else
W = 0;
endfunction
这样如果参数未知,就不会无限递归。
如果您提供了有效的输入,那么您应该看不到任何段错误。如果您仍然看到,则需要与工具供应商核实。
正如@sharvil111 所建议的,我当时传递的值是 1'bX。
所以我确保在调用之前将其设置为 0。
感谢您的其他建议,但例如@dave_59 所说的对我来说没有用,因为 param
不是太小,只是还没有定义。
这是有问题的代码:
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
将您的代码更改为
function automatic [31:0] W (input [6:0] param);
if (param>=16)
W = W(param-7);
else
W = 0;
endfunction
这样如果参数未知,就不会无限递归。
如果您提供了有效的输入,那么您应该看不到任何段错误。如果您仍然看到,则需要与工具供应商核实。
正如@sharvil111 所建议的,我当时传递的值是 1'bX。
所以我确保在调用之前将其设置为 0。
感谢您的其他建议,但例如@dave_59 所说的对我来说没有用,因为 param
不是太小,只是还没有定义。