Я попытался выяснить предполагаемую защелку и почему она нужна внутренне, но я не мог найти никаких ресурсов с достаточной детализацией.
Что подразумевается под защелкой и как она создается, когда отсутствует инструкция else в условии if. Кто-нибудь может объяснить вкратце?
Ответ 1
Защелка выведена в комбинаторном блоке, где сеть не назначается известному значению. Присвоить сеть себе все равно вывести защелку. Защелки также могут быть выведены отсутствующими сигналами из списка чувствительности и контуров обратной связи.
Правильный способ вывода предполагаемой защелки в Verilog/SystemVerilog:
/* Verilog */ //// /* SystemVerilog */
always @* //// always_latch
begin //// begin
if (en) q = d; //// if (en) q = d;
end //// end
Случайные выводы затвора:
-
Отсутствует сигнал для списка чувствительности (поэтому следует использовать
@*
):always @(a or b) // inferred latch :: "c" missing for the sensitivity list. begin out = a + b + c; end
-
Отсутствует условие:
always @* begin case(in[1:0]) 2'b00: out = 1'b0; 2'b01: out = 1'b1; 2'b10: out = 1'b1; // inferred latch "out" :: missing condition 2'b11/default endcase end always @* begin next0 = flop0; next1 = flop1; // inferred latch "next2" :: missing initial condition next3 = flop3; case(a[2:0]) 3'b001: next0 = in; 3'b010: if(b) next1 = in; 3'b100: if(c) next2 = in; default: if(!b&&!c) next3 = in; endcase end
-
Обратная связь:
assign out = en ? in : out; // inferred latch "out" :: feedback to mux assign a = en ? z : c; // ... any amount of code between ... assign z = en ? a : y; // inferred latch "a" :: feedback chain
- Циклы обратной связи могут проходить через иерархию и дизайн.
Как уменьшить риск непреднамеренных защелок:
- Сделать запланированные защелки простыми и идентифицируемыми:
- Положите задвижки в свои собственные блоки с минимальной комбинаторной логикой; идеально сочетать комбинаторную логику затворов в своем отдельном всегда блоке. Быть таким же явным и идентифицировать намеченные защелки. Используйте комментарии, метки и, если возможно, используйте SystemVerilog
always_latch
.
- Положите задвижки в свои собственные блоки с минимальной комбинаторной логикой; идеально сочетать комбинаторную логику затворов в своем отдельном всегда блоке. Быть таким же явным и идентифицировать намеченные защелки. Используйте комментарии, метки и, если возможно, используйте SystemVerilog
- Все комбинаторные логические блоки должны быть определены с помощью
always @*
или SystemVerilogalways_comb
. - Убедитесь, что все переменные, назначенные в комбинаторных логических блоках, имеют начальное или стандартное назначение.
- Операторы
-
case
должны иметь условиеdefault
. Операторы -
if
должны иметь соответствующийelse
. - Когда комбинаторные логические блоки присваивают множество переменных, каждая переменная получает начальное значение в начале блока (перед любыми
case
илиif
).
- Знайте, откуда поступают входы и куда идут выходы.
- Входы комбинаторной логики должны быть флопами или, то комбинаторная логика выходов должна быть flops.
- Просматривайте код, используйте инструменты для переливания и инструменты проверки логической эквивалентности.
- Проверка кода требует, чтобы рецензент знал, где могут скрываться защелки.
- Использование SystemVerilog
always_comb
может помочь идентифицировать выведенные защелки с помощью инструментов литинга и проверки логической эквивалентности.
В худшем случае сценарий помещает всю логику в синхронные блоки. Все намеченные защелки становятся выведенными триггерами. Это, как правило, плохая идея, потому что она может излишне увеличивать количество ворот, создавать больше маршрутизации и время воздействия.
Ответ 2
Защелка выводится, когда выход комбинаторной логики имеет состояние undefined, то есть он должен удерживать свое предыдущее значение.
Комбинаторная логика не имеет никакого триггера для удержания, поэтому выход всегда должен определяться входами.
Короткий пример может быть:
always @* begin
if (a == 1'b1) begin
b = x|y|z;
end
end
Что такое b
, когда a == 1'b0
. b
не переопределяется, поэтому он сохраняет свою ценность. Как может что-то сохранить свою ценность, если у нее нет концепции государства. Вы должны ввести состояние, выведя защелку. Это, как правило, очень плохо.
Вы можете указать защелки и быть осторожными относительно времени и т.д., но предполагаемые защелки номинально являются ошибками.
Ответ 3
Защелки генерируются только с комбинационными всегда блоками. Последовательная логика никогда не будет создавать защелку.
Подробнее о о том, как создаются прозрачные защелки и как избежать выводов защелок