如何让 Vivado 正确尊重递归模块实例化?

问题描述 投票:0回答:1

我正在尝试在 Verilog 中递归实例化一个模块。该模块的 RTL 位于我的 github 上

当我使用 Icarus Verilog 模拟该模块时,它工作正常。但是,当我尝试使用 Vivado 综合设计时,它失败并显示以下错误消息:

ERROR: [Synth 8-316] illegal module recursion detected [/home/centos/repos/aws-fpga/hdk/cl/examples/cl_hello_world/build/src_post_encryption/recursive_matrix.v:11]

在失败之前,Vivado 表示它正在尝试实例化模块,如下所示:

INFO: [Synth 8-6157] synthesizing module 'recursive_matrix' [/home/centos/repos/aws-fpga/hdk/cl/examples/cl_hello_world/build/src_post_encryption/recursive_matrix.v:11]
        Parameter N bound to: 0 - type: integer
        Parameter NUM_WEIGHTS bound to: 31 - type: integer
        Parameter WIRE_DELAY bound to: 32 - type: integer
        Parameter NUM_LUTS bound to: 2 - type: integer
        Parameter DIAGONAL bound to: 0 - type: integer
        Parameter TRANSPOSE bound to: 0 - type: integer

从代码来看,这应该是不可能的。看来子模块正在覆盖其父模块的

N
参数的值,这种行为对我来说没有多大意义,也不遵循 Verilog 2005 规范。

知道这是怎么回事吗?

我尝试使用 localparams,将参数名称从

N
切换为其他名称,添加包装模块以防止直接递归,并在将文件视为 Verilog2001、Verilog2005 和 SystemVerilog 之间切换。

recursion parameter-passing verilog vivado iverilog
1个回答
0
投票

我解决了这个问题!显然,Vivado 为 Verilog-2005 模块提供递归支持,但不支持 SystemVerilog 模块(根据这个有用的 Reddit 评论)。

事实证明,如果您

include
来自 SystemVerilog 模块的文件,它会强制将该文件解析为 SystemVerilog,即使该文件之前已作为 Verilog-2005 文件包含在内。通过删除
include
语句,我能够成功地详细说明模块!

我希望这可以帮助其他人在将来遇到这个奇怪的问题。

© www.soinside.com 2019 - 2024. All rights reserved.