group-telegram.com/enginegger/88
Create:
Last Update:
Last Update:
Про асинхронный сброс и Verilator.
Вот типичный код асинхронного сброса:
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) ...
else ...
end
Обычно, код работает так же, как в железе. Однако, если в начале симуляции нет клока, то сброс может не сработать. Так выйдет, если
rst_n
присвоить 0 в нулевом времени через инициализацию в объявлении. Как можно догадаться, в этом случае события negedge rst_n
не случится, т.к. по стандарту присвоение в объявлении выполняется раньше присвоения в процессах.Очевидное решение - в объявлении
rst_n
присвоить 1 (или вообще ничего не присваивать, X->0 тоже считается за negedge
), а в initial
- 0:logic rst_n = 1'b1;
initial rst_n = 1'b0;
Или так:
logic rst_n;
initial begin
rst_n = 1'b1;
rst_n = 1'b0;
end
Однако, и здесь есть нюанс: Verilator не захотел регистрировать это событие, и не выполнил код процесса. Раньше такого в Вериляторе быть не могло, потому что до недавнего времени он был чисто clock-accurate симулятором. А раз клок всегда был, то события
negedge rst_n
можно было не дожидаться, процесс вызвался бы при первом posedge clk
. Но сейчас он стал фактически полноценным event-driven, по этому наверное дожен справляться с такими вещами.В связи со всем вышесказанным думаю самым правильным решением было бы присвоение
rst_n
единицы, а как минимум в следующем цикле симуляции сбрасывать его в ноль:logic rst_n = 1'b1;
initial #1 rst_n = 1'b0;
Запилил issue
BY Arnold Enginegger
Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260
Share with your friend now:
group-telegram.com/enginegger/88