ブロッキング割り当てと非ブロッキング割り当ての違いVerilog

このページを読んでいた http://www.asic-world.com/verilog/verilog_one_day3.html 次のことに遭遇したとき:

通常、フリップフロップをリセットする必要があるため、時計が0から1(ポーズ)に遷移し、リセットがアサートされているかどうかを確認し(同期リセット)、通常のロジックを続行します。よく見ると、組み合わせロジックの場合、割り当てには「=」があり、シーケンシャルブロックには「< =」演算子があることがわかります。 「=」はブロック割り当てであり、「< =」は非ブロック割り当てです。 “=”はbegin / end内でコードを順番に実行しますが、ノンブロッキング “< =”は並行して実行されます。

ブロッキング割り当てが並列であるのに対し、非ブロッキング割り当てはシーケンシャルであるとかなり確信していました。結局のところ、alwaysブロックの外側のassignステートメントを使用してブロッキング割り当てを行うことができ、それらはすべて並行して実行されます。これは間違いですか、それともalwaysブロック内での動作が異なりますか?また、alwaysブロック内で動作が異なる場合、alwaysブロック外で非ブロッキング割り当てを行うことはできますか?

回答

は、ブロッキング割り当てが並列であるのに対し、非ブロッキング割り当てが順次であることをかなり確信していました。

ブロック割り当ては、次のステートメントの実行が完了するまでブロックするため、「連続して」実行されます。したがって、次のステートメントの結果は、最初に完了したステートメントによって異なる場合があります。

非ブロッキング割り当ては、すべて同時に発生する割り当てを記述しているため、並行して実行されます。 2行目のステートメントの結果は、1行目のステートメントの結果に依存しません。代わりに、2行目は1行目がまだ発生していないかのように実行されます。

コメント

  • では、代入ステートメントについてはどうでしょうか。それらは独自のクラス全体に含まれていますか?
  • はい、assignステートメントは常にブロックの外側で発生し、一般に組み合わせ(ラッチなし)を説明するために使用されます)ロジック(一部の例外を除いて、常にブロックしますが、シーケンシャルロジックを記述します)。 AFAIK、assignステートメントは、LHSの値が変更されるたびに、常に"並列"を実行します。 。
  • わかりました… ' Verilogが'最も多くないという印象を受け始めていますエレガントにデザインされた言語。これは、Cの学習のようになります。
  • Verilogは、既存のハードウェアを"説明するように設計されています。"ハードウェアを設計(合成)するための言語として使用するのはハックです。
  • Verilog "がC "は問題です、VHDLを見てください。一部の人々はどちらか一方にかなり強い好みを持っています。一部の人にとって、VHDLは冗長すぎます。私にとって、それは'はるかによく考えられています。 (たとえば、シグナル/変数割り当てのセマンティクスは、ブロッキング/非よりもはるかに明確です)。 stackoverflow.com/questions/13954193/ … および sigasi .com / content / vhdls-crown-jewel あなたはそれを好むかもしれないし嫌うかもしれません。ただし、'一見の価値があります。

回答

割り当てステートメントは「ブロック」でも「非ブロック」でもありません。「継続的」です。割り当てステートメントの出力は、その入力の指定された関数と常に等しくなります。「ブロック」および「非ブロック」割り当ては、alwaysブロック内にのみ存在します。

ブロック割り当ては、処理されるとすぐに有効になります。非ブロッキング割り当ては、現在の「タイムデルタ」の処理の最後に行われます。

常にブロックを使用して、組み合わせロジックまたはシーケンシャルロジックをモデル化できます(systemverilogにはalways_combとalways_ffがあり、これを明示的にします)。組み合わせロジック=通常は使用する方が効率的ですが、通常は実際には重要ではありません。

シーケンシャルロジック(たとえば、常に@(posedge clk))をモデル化する場合、通常はノンブロッキング代入を使用します。 「クロックエッジ前の状態」の観点から「クロックエッジ後の状態」を決定します。

シーケンシャル常にブロックでブロック割り当てを「変数」として使用すると便利な場合があります。これを行うと、覚えておくべき2つの重要なルールがあります。

  1. アクセスしないでください割り当てられているalwaysブロックの外側からシーケンシャルalwaysブロック内のブロッキング割り当てで設定されているreg。
  2. 同じregへのブロッキング割り当てと非ブロッキング割り当てを混在させないでください。

これらのルールに違反すると、合成が失敗したり、シミュレーションと合成の動作に違いが生じたりする可能性があります。

コメント

  • " "シーケンシャルalwaysブロック内のブロック割り当てで設定されたregに、alwaysブロックの外側からアクセスしないでください" "説明してもらえますか?
  • 異なるシーケンシャル常にブロックには定義されていません注文。したがって、あるalwaysブロックから別のalwaysブロックにブロックアセスメントが設定された" reg "を読み取ると、予測できない動作が発生します。
  • シミュレーションで機能しているように見えても、合成ツールはそれを見て" nope "と言う必要があります。これらの中間変数にはローカルレジスタを使用し、読み取られる前にすべてのクロックで常に割り当てられるようにして、' storage 'が暗示されます。
  • 少なくともクォータスではIIRCは、エラーではなく警告と見なされるだけです。
  • 組み合わせロジックでノンブロッキング割り当てを使用しないでください。ロックアップする可能性があります。シミュレーション。詳細については、次の回答を参照してください: electronics.stackexchange.com/a/506047/238188

回答

ブロック割り当てという用語は、ブロックという単語が時系列ロジックを示唆しているように見えるため、人々を混乱させます。ただし、合成ロジックでは、すべてがで動作するため、はこれを意味しません parallel

おそらく、混乱の少ない用語は即時割り当てであり、それでも組み合わせロジックの中間結果を割り当ての遅延が発生する可能性のある不透明なメモリ要素(クロックレジスタなど)への入力。

法的な観点からは、すべて非常にうまく機能します。実際、=は、always_combブロッキング(時系列)操作と見なすことができます。 >シーケンス。ただし、この場合、iv id = “f5c869a134″であるため、時系列と並列の区別はまったく違いがありません >

ブロックは、命令シーケンスが安定状態に収束するまで繰り返すように定義されています。これは、ハードウェア回路が実行することとまったく同じです(タイミング要件を満たしている場合)。

の合成可能なサブセットVerilog(特にSystemVerilog)は非常にシンプルで、必要なイディオムがわかれば簡単に使用できます。言語のいわゆる行動要素に関連する用語の巧妙な使用を乗り越える必要があります。

コメント

  • 行動コーディングスタイル( RTLと比較)では、ブロッキングと非ブロッキングの区別が関係する場合があります。場合によっては、合成ツールが動作コンポーネントの設計から機能的に同等のRTLを推測できる場合があります。
  • もちろん、 手続き型 SystemVerilogのモード。特にinitialブロック内のinitialステートメントに適用可能で、(時系列の)ブロッキング割り当てを使用します。 のみ。これはテストベンチの設計には役立ちますが、通常はRTL仕様には役立ちません。
  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です