Ответ 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
может помочь идентифицировать выведенные защелки с помощью инструментов литинга и проверки логической эквивалентности.
В худшем случае сценарий помещает всю логику в синхронные блоки. Все намеченные защелки становятся выведенными триггерами. Это, как правило, плохая идея, потому что она может излишне увеличивать количество ворот, создавать больше маршрутизации и время воздействия.