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),您的代码将在堆栈跟踪、无限零延迟循环下运行。在调用函数时检查 jx 还是 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递归函数导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章

递归函数中的分段错误

奇/偶递归函数中的分段错误

在递归函数上使用 unordered_map unordered_set 的分段错误

C函数调用分段错误[重复]

为啥 PHP 中的无限递归函数会导致段错误?

matlab分段+递归函数的表示方法