Начал изучать verilog, но не могу избавиться от "сишной" привычки использовать if без else
Как перестать использовать защелки?
Как перестать использовать защелки?
Приветствую.
Начал изучать verilog, но не могу избавиться от "сишной" привычки использовать if без else
. Везде пишут, что это недопустимо, т.к. приводит к синтезу защелки (latch), надо обязательно ставить else или делать инициализацию. Это все понятно, но проблема именно в том, что данная конструкция "есть событие - меняем переменную, нет события - оставляем как было" очень удобная, но приходится постоянно выкручиваться и каждый раз что-то изобретать, чтобы ее не использовать. Вроде как старый инструмент отобрали, а новый не выдали - очень некомфортно
. Что посоветуете?
Начал изучать verilog, но не могу избавиться от "сишной" привычки использовать if без else
Re: Как перестать использовать защелки?
[uquote="Plazmoid",url="/forum/viewtopic.php?p=3177773#p3177773"]использовать if без else
. Везде пишут, что это недопустимо, т.к. приводит к синтезу защелки (latch)[/uquote]Это допустимо, например в обыкновенном счетчике с разрешением счета:
Защелки - это триггеры со статическим управлением, соответственно они появляются там где присваивание происходит не по фронту тактового сигнала. Например RS-триггер:Такое действительно не желательно, потому что затрудняет временной анализ САПР-у и создает значительные задержки.
Для того чтобы этого не происходило, достаточно в блоках always делать присваивание только по фронту тактового сигнала и не использовать блокирующие присваивания. Если требуется описать комбинационную логику отдельно, то хорошим вариантом будет использовать assign, а не always.
[uquote="Plazmoid",url="/forum/viewtopic.php?p=3177773#p3177773"]Что посоветуете?[/uquote]Изучить основы синтеза цифровых устройств на бумажке. Советую прорешать примеры из https://librusec.pro/b/474613 или чего-нибудь похожего.
Код: Выделить всё
always @(posedge clk) begin
if (enable) begin
cnt <= cnt + 1'b1;
end
endКод: Выделить всё
always @(S, R, C, Q)
if(C) begin
Q <= (~R & Q) | S;
end else begin
Q <= Q;
end
endДля того чтобы этого не происходило, достаточно в блоках always делать присваивание только по фронту тактового сигнала и не использовать блокирующие присваивания. Если требуется описать комбинационную логику отдельно, то хорошим вариантом будет использовать assign, а не always.
[uquote="Plazmoid",url="/forum/viewtopic.php?p=3177773#p3177773"]Что посоветуете?[/uquote]Изучить основы синтеза цифровых устройств на бумажке. Советую прорешать примеры из https://librusec.pro/b/474613 или чего-нибудь похожего.