4

「Verilog 合成でのノンブロッキング代入、キルするコーディング スタイル!」を読みました。クリフォード・カミングス著。彼は、この質問の下部にあるコードは、3 つのフリップフロップ パイプラインに合成されることが「保証されている」と述べていますが、正しくシミュレートされることは保証されていません (例 pipeb3、10 ページ、「保証された」コメントは 12 ページにあります)。 )。この文書は最優秀論文賞を受賞したので、その主張は正しいと思います。http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf

私の質問: Verilog 合成の正確性は、シミュレーション セマンティクスを参照しない場合、どのように定義されますか? どうもありがとう。

ボーナス ポイントの質問は次のとおりだと思います: 明確に定義された合成セマンティクスを持ち、明確に定義されたシミュレーション セマンティクスを持たない、可能な限り単純な Verilog プログラムを提供してください。再度、感謝します。

実際、シミュレートと合成の両方で明確に定義されているが、2 つの結果が異なる Verilog を誰か教えてもらえますか?

コード:

module pipeb3 q3, d, clk);
  output [7:0] q3;
  input [7:0] d;
  input clk;
  reg [7:0] q3, q2, q1;

  always @(posedge clk) q1=d;
  always @(posedge clk) q3=q2;
  always @(posedge clk) q1=d;
endmodule

PS: 誰かが気になる場合に備えて、正しい合成ツールのもっともらしい定義は、「合成されたハードウェアは、正しいシミュレーターができることを行う」という行に沿っている可能性があります。しかし、これは論文と矛盾しています。

[今、その論文は正しくないと思います。1364-2001 標準のセクション 5.2 は、Verilog プログラムの意味はそのシミュレーションによって定義され、その後標準が定義する (非決定性とすべて) ことを明確に述べています。合成ツールがシミュレーターに加えて提供しなければならない「保証」については、まったく言及されていません。

合成可能なサブセットを説明する別の標準 1364.1-2002 があります。合成されたハードウェアのセマンティクスがシミュレーションと何らかの形で異なるべきであるという明白な言及はありません。セクション 5.2.2「エッジに敏感なストレージ デバイスのモデル化」では、非ブロッキング割り当てを使用してフリップフロップをモデル化する必要があると述べています。標準的に言えば、それ以外の使用はサポートされていないことを意味します。

最後の注意として、前の段落で言及されたセクションでは、ブロッキング割り当てを使用して非ブロッキング割り当ての RHS を計算できると述べています。これは、カミングスの推奨事項 5 に違反しているようです。

Cliff Cummings は、1364.1-2002 標準のワーキング グループのメンバーとしてリストされています。この規格は、IEEE Web サイトで置き換えられたものとしてリストされていますが、置き換えられたものはわかりません。]

4

3 に答える 3

10

全て -

有益な背景情報と私自身の意見を述べる時が来ました。

まず、IEEE-1364.1-2002 Verilog RTL Synthesis Standard はどのベンダーによっても完全に実装されることはありませんでした。そのため、誰も急いで規格を更新したり、合成規格の SystemVerilog バージョンを提供したりしませんでした。私の知る限り、標準は「置き換え」られておらず、有効期限が切れたばかりです。私の知る限り、標準で説明されている属性は、どのベンダーによっても完全に実装されたことはありません。すべてのベンダーによって実装されたと私が考える標準の唯一の便利な機能は、ベンダーがユーザー コードを読み取る前にマクロ `define SYNTHESIS を設定することになっているため、`ifndef SYNTHESIS - `endif を一般的な置換として使用できるようになったことです。ベンダー固有の // synopsys translate_on - // synopsys translate_off プラグマ コメント用。

Verilog はシミュレーション言語として発明されたものであり、合成言語を意図したものではありませんでした。1980 年代後半、シノプシスは、エンジニアがこの Verilog シミュレーション言語を本当に気に入っていることを認識し、彼ら (シノプシス) が認識して合成を通じてハードウェアに変換する言語のサブセットを定義し始めました。現在、これを RTL 合成サブセットと呼んでいます。このサブセットは、合成ツール ベンダーが新しいタイプの記述をハードウェアに変換するためのユニークで創造的な方法を発見するにつれて、時間の経過とともに成長する可能性があります。

「定義された Verilog 合成の正確さ」は実際にはありません。Don Mills と私は 1999 年に「RTL Coding Styles That Yield Simulation and Synthesis Mismatches」というタイトルの論文を書き、合成されたハードウェアの動作が異なると推測できる正当な Verilog コーディング スタイルについてエンジニアに警告しました。 http://www.sunburst-design.com/papers/CummingsSNUG1999SJ_SynthMismatch.pdf

これを考慮してください。合成結果が常に Verilog シミュレーションの動作と一致する場合、ゲート シミュレーションを実行する必要はありません。RTL でシミュレートされたデザインは正しくなります。一致が保証されていないため、エンジニアはゲート シミュレーションを実行してゲートの動作が RTL の動作と一致することを証明するか、同等性チェック ツールを実行して、合成前の RTL コードが合成後のゲート モデルと同等であることを数学的に証明しようとします。 、gate-sims が必要ないようにします。

おまけの質問ですが、Verilog のセマンティクスはかなり明確に定義されているため、これは非常に難しいものです。

シミュレーションと合成で明確に定義されたコードで異なる結果が得られる限り、次の点を考慮してください。

module code1c (output reg o, input a, b);

  always
    o = a & b;
endmodule

シミュレーションでは、time-0 を超えることはありません。感度リストが欠落しているため、シミュレーションは永久にループします。合成ツールは、組み合わせロジックを推論する際にセンシティビティ リストを考慮しません。そのため、2 入力 AND ゲートが表示され、センシティビティ リスト項目の欠落に関する警告が表示されます。これにより、合成前と合成後のシミュレーションで不一致が発生する可能性があります。Verilog-2001 では、この一般的な問題を回避するために常に @* を追加し、SystemVerilog では、センシティビティ リストを削除して設計者が意図したロジックを合成ツールに通知するために always_comb を追加しました。

この論文が正しい合成動作を保証するべきかどうかについては、おそらくそうすべきではありませんが、私の論文で説明されている保証は、複数の合成ツールの経験に基づいて、エンジニアが合成ツールに何を期待できるかを定義しています。

「最後の注意として、前の段落で言及されているセクションでは、ブロッキング割り当てを使用して非ブロッキング割り当ての RHS を計算できると述べています。これはカミングスの推奨事項 5 に違反しているようです。」

おっしゃるとおり、これはコーディング ガイドライン #5 に違反しており、私の意見では使用すべきではありません。

VHDL 変数は別のプロセスをトリガーできないため、VHDL デザインではコーディング ガイドライン #5 に頻繁に違反します。この問題については、VHDL 陣営が均等に分かれていることがわかります。半分は変数の割り当てを使用すべきではないと言い、残りの半分は変数を使用してシミュレーションのパフォーマンスを向上させますが、他のプロセスをトリガーするために変数の割り当てと最終的な信号の割り当てを混在させる必要があります。

コーディング ガイドライン 5 に違反し、コードが正しい場合、シミュレーションは機能し、合成も機能しますが、コードに誤りがある場合、コーディング ガイドライン 5 に違反するデザインをデバッグすることは非常に困難です。コンビネーションピースの波形表示は意味がありません。波形表示の組み合わせロジックの出力は、リセットがアサートされていないクロック エッジでのみ更新されます。これは、実際の組み合わせハードウェアの動作ではありません。これは、波形表示を使用してこれらのデザインをデバッグするときに難しい問題であることが証明されています (Iこの情報は論文には含まれていません)。

よろしく - Cliff Cummings - Verilog & SystemVerilog Guru

于 2012-06-27T19:33:58.147 に答える
1

正しく合成される理由は、実際のシリコンでは「ブロッキング」と「非ブロッキング」の間に違いがないためだと思います。

あなたが説明したように、Synthesisはそれを読み取り、背中合わせにチェーンされた3つのフリップフロップを作成します。

実際のゲートは遅延を示すため、これは合成では問題になりません(フロップホールドタイムに違反していないと仮定します)。dclkの立ち上がりエッジでは、値がに伝播するのに数nsかかりますq1。にd伝播するまでにq1、ととq1同様に、2番目のフロップですでにサンプリングされています。q2q3

これがシミュレーションで機能しない理由は、ゲート遅延がないためです。クロックの立ち上がりエッジで、おそらく2番目のフロップでサンプリングされる前に、q1即座にに置き換えられます。実際の回路(適切なセットアップとホールドタイム)では、最初のフロップが出力値を変更する前に、クロックの立ち上がりエッジでサンプリングされることが保証されています。dq1q1

于 2012-06-26T00:17:06.867 に答える