Что подразумевается под защелкой и как она создается, когда отсутствует инструкция 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.
  • Все комбинаторные логические блоки должны быть определены с помощью always @* или SystemVerilog always_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 не переопределяется, поэтому он сохраняет свою ценность. Как может что-то сохранить свою ценность, если у нее нет концепции государства. Вы должны ввести состояние, выведя защелку. Это, как правило, очень плохо.

Вы можете указать защелки и быть осторожными относительно времени и т.д., но предполагаемые защелки номинально являются ошибками.