Как заставить Vivado правильно соблюдать рекурсивное создание экземпляров модулей?

Я пытаюсь рекурсивно создать экземпляр модуля в 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.

Учебная записка [Medium] Leetcode#22 Generate Parentheses
Учебная записка [Medium] Leetcode#22 Generate Parentheses
На этот раз мы собираемся решить еще одну классическую проблему, связанную с парными скобками, так называемую генерацию скобок.
0
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил проблему! Судя по всему, Vivado предлагает поддержку рекурсии для модулей Verilog-2005, но не для модулей SystemVerilog (согласно этому полезному комментарию Reddit).

Также оказывается, что если вы include файл из модуля SystemVerilog, он принудительно анализирует этот файл как SystemVerilog, даже если этот файл ранее был включен как файл Verilog-2005. Удалив операторы include, я смог успешно разработать модуль!

Я надеюсь, что это поможет кому-нибудь еще столкнуться с этой странной проблемой в будущем.

Другие вопросы по теме