Я пытаюсь рекурсивно создать экземпляр модуля в 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](https://i.imgur.com/Hl2feR7b.png)
Я решил проблему! Судя по всему, Vivado предлагает поддержку рекурсии для модулей Verilog-2005, но не для модулей SystemVerilog (согласно этому полезному комментарию Reddit).
Также оказывается, что если вы include файл из модуля SystemVerilog, он принудительно анализирует этот файл как SystemVerilog, даже если этот файл ранее был включен как файл Verilog-2005. Удалив операторы include, я смог успешно разработать модуль!
Я надеюсь, что это поможет кому-нибудь еще столкнуться с этой странной проблемой в будущем.