我正在尝试在 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 之间切换。
我解决了这个问题!显然,Vivado 为 Verilog-2005 模块提供递归支持,但不支持 SystemVerilog 模块(根据这个有用的 Reddit 评论)。
事实证明,如果您
include
来自 SystemVerilog 模块的文件,它会强制将该文件解析为 SystemVerilog,即使该文件之前已作为 Verilog-2005 文件包含在内。通过删除 include
语句,我能够成功地详细说明模块!
我希望这可以帮助其他人在将来遇到这个奇怪的问题。