Search the Community
Showing results for tags 'infinite loop'.
-
SystemVerilog always_comb infinite loop
dxp posted a topic in Языки проектирования на ПЛИС (FPGA)
Всем привет! Вопрос по планировщику симулятора. Пример привожу примитивный, чтобы только принцип продемонстрировать. Вот предположим есть код в двух комбинационных блоках: logic a = 0; logic b = 0; always_comb begin a = 0; if(<true_cond>) a = 1; if(b) ... end always_comb begin b = 0; if(a) begin b = 1; end По логике работы симулятора получается, что в первом блоке переменная a даёт результат 1, при этом она меняет значение: на входе 0, после условия 1, т.е. как бы происходит событие (event). Это событие триггерит второй блок, где с переменной b происходит аналогичная картина - т.е. изменение переменной b, что есть тоже событие, и это событие должно триггернуть первый блок, т.к. там есть ссылка на b в условии if. Но прогон (evaluation) первого блока снова сгенерит событие (т.к. a поменялась внутри блока), которое запустит второй блок. И так далее без конца. На практике такой простой код, однако, не вызывает этого бесконечного цикла - очевидно, симулятор как-то "соображает", что реально-то события не должно возникать. Но вот у меня в рабочем проекте это тем не менее произошло. Там код не такой простой, но схематично аналогичный: вместо первого блока там описание логики переходов FSM, в другом - сигналы, которые используют fsm_next значение. Реально петли по сигналам там нет - та же Vivado не находит при синтезе. Т.е. как и в примере выше, сигналы a и b не образуют петлю, т.к. b на a не влияет, просто описана в том же блоке. И насколько понимаю, если бы симулятор анализировал переменную при прогоне блока только в конце по её результирующему значению, он бы "увидел", что реально переменная не меняется и поэтому события возникать не должно. Вот тут аналогичная проблема, и там посоветовали использовать для симулятора опцию командной строки -delay_trigger (там кэденсовский симулятор), которая, как объяснил советующий, заставляет симулятор как раз вести себя так, чтобы он не спешил генерить события, а дожидался окончания прогона блока. Но насколько это корректный путь? И зачем режим без этой опции, если он работает вот так "странно". Существуют ли какие-то приёмы борьбы с этим эффектом? Кто-нибудь и как часто с этим сталкивался? В общем, прошу высказываться. P.S. Симулятор: квеста.- 26 replies