私のコンパイラは、コンビナトリアルループ(always @(*)
Verilogの)でのラッチの推測について不満を言っています。また、推測されるラッチはなるべく避けるべきだと言われました。
推定ラッチの正確な問題点は何ですか?確実に組み合わせループを作成しやすくします。
私のコンパイラは、コンビナトリアルループ(always @(*)
Verilogの)でのラッチの推測について不満を言っています。また、推測されるラッチはなるべく避けるべきだと言われました。
推定ラッチの正確な問題点は何ですか?確実に組み合わせループを作成しやすくします。
回答:
「ラッチ」は「フリップフロップ」とは異なり、FFはクロックエッジに応じて出力を変更するだけです。ラッチは、クロック以外の何かに応じて出力を変更できます。たとえば、SRラッチにはセット入力とリセット入力があり、どちらかがアクティブな場合、出力が変更される可能性があります。SR-FFは、クロックエッジがある場合にのみセットまたはリセットに応答します。
FPGAでは、ロジックを完全に同期させる必要があります。つまり、すべてのストレージエレメント(FFなど)はすべて単一のクロックソースからクロックされます。そのクロックに対して非同期なものは、非常に慎重に扱う必要があります。そうしないと、タイミングエラーが発生します。
ラッチは基本的に非同期ストレージ要素です。クロック入力がないため、どのクロックとも同期できません。非同期リセットおよびリセット入力を備えたFFがあることに注意してください。これらは通常のラッチと同じ注意で処理する必要があります。
ラッチが引き起こす可能性のあるすべてのタイミングの問題に取り組むことは、ここで説明できる範囲をはるかに超えていますが、例を挙げてみましょう。
SRラッチがあり、8ビットカウンターが特定の値に達するたびに設定するようにしたいとしましょう。Verilogコードがどうなるかはわかりませんが、VHDLのコードは次のとおりです。set <= '1' when count = "11010010" else '0'; そのセット信号は、SRラッチのセット入力に送られます。
生成されるロジックは純粋に組み合わせです。ANDゲート、ORゲート、インバーター(またはLUT)の組み合わせ。しかし、その組み合わせロジックを通る信号パスは必ずしも完全ではなく、「セット」信号に不具合がある可能性があります。ゲートの特定のグループを通る信号パスは、別のグループよりも長くかかる可能性があり、出力が最終状態に落ち着く前に、セット出力が短時間アクティブになることがあります。
この出力グリッチにより、SR-Latchが設定されていたとしても、設定されることがありました。SR-LatchからSR-FFに切り替えて、カウンターと同じクロックをオフにすると、SR-FFは状態を変更する前に1クロックサイクルだけ待機します。本質的に、それは見る前にセット信号が落ち着くのを待ちます。
セット信号の組み合わせロジックを通るパスの経路が異なる場合(遅延が異なる場合)、グリッチの動作も変わります。ロジックは正常に機能する可能性がありますが、まったく関係のない何かを変更したため、このロジックは別の方法でルーティングされるため、バグが発生します。温度と電圧も信号のタイミングを変更するため、グリッチの動作を変更できます。
タイミングが不確実であるため、ロジックのラッチを回避する必要があります。FFはより安全に使用できます。これは、誤ってラッチを作成するのは簡単であり、おそらくそこにそれを望んでいないため、コンパイラがラッチについて警告している理由です。
もちろん、ラッチが必要な場合があります。絶対に必要な場合にのみ、非常にまれにそれらを使用する必要があります。その後、グリッチが発生しないようにロジックを正しく設計する必要があります。
推測ラッチを作るものは何ですか?
組み合わせロジックの場合、回路の出力は入力のみの関数であり、メモリまたは内部状態(ラッチ)を含めることはできません。
Verilogでは、常にブロック内の値が割り当てられていない場合、変数は以前の値を保持します。この現在の値を保存するには、ラッチを作成する必要があります。
不完全なif-elseステートメントはラッチを生成します。if-else出力状態はすべての可能な入力条件のために定義されていない場合、文は「不完全」と考えられています。不完全なcaseステートメント、またはデフォルトの item を持たないcaseステートメントについても同様です。
推定ラッチが悪いのはなぜですか?
推論されたラッチは、ロジックデザインが意図したとおりに実装されていない可能性があることを示す「警告サイン」として機能します。重要な if-elseまたは caseステートメントが設計から欠落している可能性があります。
ラッチはタイミングの問題や競合状態につながる可能性があります。これらは、組み合わせフィードバック(出力を入力に戻すルーティング)につながる可能性があり、これは予測できない場合があります。
推定ラッチの作成を回避するには:
P. Chuによる「Verilogの例によるFPGAプロトタイピング」から言い換えられた一部
組み合わせロジックとフィードバックを使用して構築されたシーケンシャルロジックデザインは、一般に、物理ゲートを使用する場合に合理的と思われる仮定を行います:ゲートの出力は、入力が実際に変更された後まで、入力の変更に応じて変更されません。実際のゲートを使用するときにその仮定が成り立たない場合があります(たとえば、高速NORゲートと高速インバーターの両方がVSSからVDDにゆっくりと上昇する信号によって駆動され、NORが1.2ボルトでスイッチングする場合ゲートは1.7ボルトまで切り替わらないため、NORゲートは、ゆっくり上昇する信号が高くなる前にインバータの出力が低くなる場合がありますが、このような問題は一般に、ゆっくり変化するたびにバッファを追加することで解決できます信号は複数の宛先にルーティングされます。残念ながら、
問題は、特に明記されていない限り、FPGAコンパイラが組み合わせ回路を、同じ定常状態の動作をするまったく異なる回路に任意に置き換えることができるが、タイミングがまったく異なる場合があることです。たとえば、複雑な組み合わせ関数FがUからZまでの6つの入力をとるとします。Fは回路Pに直接供給され、(F NAND Z)は回路Qに供給されます。コンパイラーは、Qに供給される値はZが高い場合のF。Zが高いと想定されることを除いて、Fと同様の関数F 'を計算できます。Qには、(F NAND Z)ではなく(F 'NAND Z)を入力できます。Pの最も効率的な実現には5つのゲート遅延がありますが、Qの最も効率的な実現には2つのゲート遅延しかありません。したがって、
回路に組み合わせフィードバックループがある場合、FPGAコンパイラは、物理的に正の遅延を持つ物理信号ノードを追加する必要があります(実際には、ゼロ遅延フィードバックループは存在できません)が、保証はありませんこのようなノードは、回路を希望どおりに動作させるために必要な場所に追加されます。また、設計をわずかに変更しても、コンパイラが実世界で機能する任意の配置から失敗する別の任意の配置に変更されないという保証もありません。
デザインでラッチをキャッチする方法の詳細は、このリンクで簡単に説明されています。