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

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

Защелки генерируются только с комбинационными блоками всегда. Последовательная логика никогда не будет генерировать защелку.

Для получения дополнительной информации прочитайте о том, как создаются прозрачные защелки и как избежать вывода защелки

Другие вопросы по тегам