web-dev-qa-db-ja.com

推定ラッチとは何か、if条件でelseステートメントが欠落している場合にどのように作成されるか。誰かが簡単に説明できますか?

推論されたラッチとそれが内部的に必要な理由を理解しようとしましたが、十分な詳細を持つリソースを見つけることができませんでした。

12
user3429606

ネットが既知の値に割り当てられていない組み合わせブロック内でラッチが推論されます。それ自体にネットを割り当てても、ラッチは推測されます。ラッチは、感度リストとフィードバックループを形成する信号の欠落によって推測することもできます。

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の前)の初期値を与えます。
  • 入力の送信元と出力の送信先を把握します。
    • 組み合わせロジックの入力はフロップである必要がありますor出力の組み合わせロジックはフロップである必要があります。
  • コードレビューを行い、リンティングツールと論理的等価性チェックツールを使用します。
    • コードレビューでは、レビュー担当者はラッチがどこに隠れるかを知る必要があります。
    • SystemVerilogのalways_combを使用すると、リンティングツールと論理的等価性チェックツールで推論されたラッチを特定できます。

最悪のシナリオでは、すべてのロジックを同期ブロック内に配置します。すべての推論されたラッチは推論されたフリップフロップになります。これは、不必要にゲート数を増やし、ルーティングを増やし、タイミングに影響を与える可能性があるため、通常は悪い考えです。

17
Greg

ラッチは、組み合わせロジックの出力に未定義の状態がある場合、つまり以前の値を保持する必要がある場合に推論されます。

組み合わせロジックには、状態を保持するフリップフロップがないため、出力は常に入力によって定義される必要があります。

短い例は次のとおりです。

always @* begin
  if (a == 1'b1) begin
    b =  x|y|z;
  end
end

bとはa == 1'b0bはオーバーライドされないため、その値を保持します。状態の概念がない場合、その値を保持するにはどうすればよいですか。ラッチを推測して状態を導入する必要があります。これは通常、非常に悪いことです。

ラッチを暗示してタイミングなどに注意することができますが、推論されたラッチは名目上バグのあるコードからのものです。

2
Morgan

ラッチは組み合わせのalwaysブロックでのみ生成されます。シーケンシャルロジックはラッチを生成しません。

トランスペアレントラッチの作成方法とラッチの推論を回避する方法 の詳細については、

2
Russell