iverilog递归函数导致分段错误
Posted
技术标签:
【中文标题】iverilog递归函数导致分段错误【英文标题】:iverilog recursive function causes segmentation fault 【发布时间】:2018-02-04 00:54:42 【问题描述】:这是有问题的代码:
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
【问题讨论】:
函数怎么调用? @unixb0y 请发布MCVE 当我调用W(5)
或W(55)
时,代码运行良好。请注意,该函数将始终返回0
。
好的,我稍后会发布@sharvil111。您是否也使用了 Icarus Verilog 或其他工具?
如果 j
未知 (x
),您的代码将在堆栈跟踪、无限零延迟循环下运行。在调用函数时检查 j
是 x
还是 z
会很有帮助。 j
的驱动在当前代码中不清楚。
没关系.. 很高兴看到问题得到解决 :)
【参考方案1】:
将您的代码更改为
function automatic [31:0] W (input [6:0] param);
if (param>=16)
W = W(param-7);
else
W = 0;
endfunction
这样如果参数未知,它就不会进入无限递归。
【讨论】:
【参考方案2】:正如@sharvil111 建议的那样,当时我传递的值是 1'bX。
所以我确保在调用之前将其设置为 0。
感谢其他建议,但例如@dave_59 所说的在我的情况下并没有起到作用,因为 param
不是太小,只是还没有定义。
【讨论】:
【参考方案3】:如果您提供有效的输入,那么您应该不会看到任何 Seg 错误。如果仍然看到,则需要与工具供应商联系。
【讨论】:
以上是关于iverilog递归函数导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章