Что такое предполагаемая защелка и как она создается, если в ней отсутствует оператор else, если условие. Кто-нибудь может объяснить вкратце?
Я попытался выяснить предполагаемую защелку и зачем она нужна для внутреннего использования, но я не смог найти ресурсов с достаточной детализацией.
3 ответа
Защелка выводится в комбинаторном блоке, где сеть не присваивается известному значению. Присвойте себе сеть, все равно сделаете вывод защелки. Защелки также могут быть выведены из-за отсутствия сигналов из списка чувствительности и петель обратной связи.
Правильный способ определения предполагаемой защелки в 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 @*
или SystemVerilog'salways_comb
, - Убедитесь, что все переменные, назначенные в комбинаторных логических блоках, имеют начальное или заданное по умолчанию назначение.
case
заявления должны иметьdefault
состояние.if
заявления должны иметь соответствующийelse
,- Когда комбинаторные логические блоки присваивают много переменных, давая каждой переменной начальное значение в начале блока (перед любым
case
или жеif
).
- Знайте, откуда поступают входы и куда направляются выходы.
- Входы комбинаторной логики должны быть флопами или выходы комбинаторной логики должны быть флопами.
- Делайте обзоры кода, используйте инструменты linting и инструменты проверки логической эквивалентности.
- Проверка кода требует, чтобы рецензент (ы) знал, где могут скрываться защелки.
- Использование SystemVerilog's
always_comb
может помочь идентифицировать предполагаемые защелки с помощью инструментов linting и проверки логической эквивалентности.
В худшем случае поместите всю логику в синхронные блоки. Все предполагаемые защелки становятся выведенными шлепанцами. Обычно это плохая идея, потому что это может излишне увеличить количество шлюзов, создать больше маршрутизации и повлиять на время.
Защелка выводится, когда вывод комбинаторной логики имеет неопределенные состояния, то есть он должен содержать свое предыдущее значение.
Комбинаторная логика не имеет триггера для удержания состояния, поэтому выход всегда должен определяться входами.
Краткий пример может быть:
always @* begin
if (a == 1'b1) begin
b = x|y|z;
end
end
Что такое b
когда a == 1'b0
, b
не переопределяется, поэтому он будет сохранять свою ценность. Как что-то может удерживать свою ценность, если у него нет понятия государства. Вы должны ввести состояние, выведя защелку. Обычно это очень плохо.
Вы можете подразумевать защелки и быть осторожными с синхронизацией и т. Д., Но предполагаемые защелки номинально являются ошибочными кодами.
Защелки генерируются только с комбинационными блоками всегда. Последовательная логика никогда не будет генерировать защелку.
Для получения дополнительной информации прочитайте о том, как создаются прозрачные защелки и как избежать вывода защелки