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