推定ラッチが悪いのはなぜですか?


22

私のコンパイラは、コンビナトリアルループ(always @(*)Verilogの)でのラッチの推測について不満を言っています。また、推測されるラッチはなるべく避けるべきだと言われました。

推定ラッチの正確な問題点は何ですか?確実に組み合わせループを作成しやすくします。


あなたがやっていることのHDLの例を含めるとよいでしょう
-shuckc

この質問が最近数回引用されていることに気付きました。この方法でやってくる専門家ではない人にとっては、Oli Glaser以外のすべての答えは、誤ったおよび/または役に立たないものの組み合わせであることに注意してください。
EML

推測されるラッチを避けるべきではなく、あなたが何をしているのか正確に知らない限り、一般に透過的なラッチを避けるべきです完全に安全)。
ピーターグリーン

回答:


20

「ラッチ」は「フリップフロップ」とは異なり、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または他の言語でラッチを明示的に指定し、ラッチに供給する組み合わせ遅延の組み合わせで正しく動作するように回路を設計する場合(つまり、ラッチは、ゼロ遅延ロジックパスと最大遅延ロジックパスの最悪の組み合わせでも、ラッチのタイミング要件が満たされるように、シンセサイザーが動作回路を生成するようにそうしますラッチ自体の遅延は負ではありません。ただし、
...-supercat

...非負の遅延が必要なノードを指定せずに、組み合わせロジックとフィードバックを使用します。同期ロジックは非同期よりも設計が簡単ですが、多くのデバイスは、完全に停止することなく電力を節約するために、スリープ時にクロックをシャットダウンする必要があります。完全に同期しているが、各ピンに「ピンが高い場合に実行」および「ピンが低い場合に実行」のためのロジック出力のカップルと、ピンが必要であることを示すピン。
-supercat

デバイスがスリープしている間に到着した入力は、入力が処理および確認されるのに十分な時間だけ内部発振器と回路を起動できるため、このような機能は非同期ロジックの必要性の多くを軽減します。このような機能は、単一の「ウェイクアップ」ピンを持つよりもはるかに汎用性がありますが、シングルウェイクアップの設計は標準的なようです。私が説明したようなマルチウェイクアップのアプローチは、余分なシリコンを消費しますか?シリコンの要件は、オンチップの他のすべてと比較してかなり小さいと思います。
-supercat

13

推測ラッチを作るものは何ですか?
組み合わせロジックの場合、回路の出力は入力のみの関数であり、メモリまたは内部状態(ラッチ)を含めることはできません。

Verilogでは、常にブロック内の値が割り当てられていない場合、変数は以前の値を保持します。この現在の値を保存するには、ラッチを作成する必要があります。

不完全なif-elseステートメントはラッチを生成します。if-else出力状態はすべての可能な入力条件のために定義されていない場合、文は「不完全」と考えられています。不完全なcaseステートメント、またはデフォルトの item を持たないcaseステートメントについても同様です

推定ラッチが悪いのはなぜですか?
推論されたラッチは、ロジックデザインが意図したとおりに実装されていない可能性があることを示す「警告サイン」として機能します。重要な if-elseまたは caseステートメントが設計から欠落している可能性があります。

ラッチはタイミングの問題や競合状態につながる可能性があります。これらは、組み合わせフィードバック(出力を入力に戻すルーティング)につながる可能性があり、これは予測できない場合があります。

推定ラッチの作成を回避するには:

  • ifまたはcaseステートメントのすべてのブランチを含める
  • すべてのブランチのすべての出力信号に値を割り当てます
  • 手順の開始時にデフォルトの割り当てを使用して、すべての信号が割り当てられるようにします。

P. Chuによる「Verilogの例によるFPGAプロトタイピング」から言い換えられた一部


2
「Verilogの例によるFPGAプロトタイプ」は、実用的な合成用Verilogを学ぶのに適した本です。基本的なコンビナトリアルなものから基本的なシーケンシャルまでいくつかの良いサンプルデザインがあり、UART、VGA、ソフトコアプロセッサ(Picoblaze)、さらにはポンゲームなどの便利なデザインにつながります。また、基本的なテストベンチとシミュレーションもカバーしています。@Randomblue、まだ手に入れていないなら、手に入れるべきです。彼もVHDLバージョンを作成したと思います。
オリグレイザー

8

ラッチはFPGAまたはCPLDで使用するのが非常に難しいため、多くの人は完全にそれらを避けています。理由の1つは、多くのFPGAにはラッチが組み込まれていないため、論理ゲートで構成されているため、タイミングの問題が発生する可能性があることです。
また、ラッチを使用する場合、タイミング遅延と競合状態を制御することはできません(ネイティブ要素がない場合)

ラッチなしでは絶対にできない(たとえば、必要な最大クロック周波数を満たすために時間を借りる)場合を除き、ラッチを使用しないことをお勧めします。


6

組み合わせロジックとフィードバックを使用して構築されたシーケンシャルロジックデザインは、一般に、物理ゲートを使用する場合に合理的と思われる仮定を行います:ゲートの出力は、入力が実際に変更された後まで、入力の変更に応じて変更されません。実際のゲートを使用するときにその仮定が成り立たない場合があります(たとえば、高速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コンパイラは、物理的に正の遅延を持つ物理信号ノードを追加する必要があります(実際には、ゼロ遅延フィードバックループは存在できません)が、保証はありませんこのようなノードは、回路を希望どおりに動作させるために必要な場所に追加されます。また、設計をわずかに変更しても、コンパイラが実世界で機能する任意の配置から失敗する別の任意の配置に変更されないという保証もありません。


0

デザインでラッチをキャッチする方法の詳細は、このリンクで簡単に説明されています。

https://www.doulos.com/knowhow/fpga/latches/


1
EE.SEへようこそ!リンクからいくつかの関連する詳細を含めることで、回答を改善できます。これにより、元のページが消えても、回答の質が高くなります。
デビッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.