「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 サイトで置き換えられたものとしてリストされていますが、置き換えられたものはわかりません。]