Я получаю неправильное «CombLoopException» при передаче сложной записи (Bundle на основе пар ключ-значение) в качестве UInt и преобразовании UInt обратно в запись с помощью asUInt() и asTypeOf(...).
При соединении двух записей напрямую без шага преобразования UInt исключение CombLoopException отсутствует. Я провел несколько дней, пытаясь решить/воспроизвести проблему. Вот почему я совершенно уверен, что не должно быть исключений CombLoopException.
К сожалению, нет небольшого фрагмента кода, который я мог бы предоставить для воспроизведения ошибки, так как я работаю над пользовательской модификацией Rocket Chip Generator, и проблема возникает только при сложной модификации Bundle.
Мой вопрос: как использовать параметр «--no-check-comb-loops», чтобы избежать исключения CombLoopException? Есть ли способ добавить эту опцию в build.sbt?
Я также хотел бы дать подробное описание этого конкретного случая, если это необходимо, чтобы помочь решить эту редкую проблему: Отключить проход FIRRTL, который проверяет комбинационные циклы
Очевидно, это зависит от вашего конкретного кода, но я бы все же посоветовал избегать создания ложного комбинационного цикла. Скорее всего, это ложная петля, но такие инструменты, как Verilator, скорее всего, тоже будут с ней бороться.
При этом вы можете отключить проверку, передав --no-check-comb-loops
шагу компиляции FIRRTL (также известному как шаг генерации Verilog). В Rocket-Chip это зависит от того, в каком каталоге симуляции вы работаете, но в vsim
это здесь, в эмуляторе это здесь.
Инструменты синтеза сообщают об обратной связи по комбинационной логике. Vivado сообщает что-то вроде «предполагаемой защелки». Если синтез НЕ сообщает об этом как о защелке, вероятно, все в порядке. Найдите в файле журнала строку «защелка». Вы также можете проверить отчет об использовании послемаршрута на наличие макроса-защелки или примитива. Важнее то, что у вас есть лучшие инструменты, чем lint; используй их.