2

「Verilog合成でのノンブロッキング割り当て、殺すコーディングスタイル!」を読みました。クリフォードカミングスによる。彼は、次のコード(12ページ、簡略化)は、教科書でよく使用されるフリップフロップの正しい実装であると述べています。この文書は最優秀論文賞を受賞したので、その主張は真実だと思います。

module ff (q, d, clk)
  output q;
  input d, clk;
  reg q;

  always @(posedge clk)
    q = d;
endmodule

これらのフリップフロップを2つ以上直列に接続した場合に、なぜこれが正しく機能し続けるのかを知りたいです。言う

module two_ffs (q, d, clk)
  input d, clk;
  output q;

  wire tmp;

  ff firstff (tmp, d, clk);
  ff secondff (q, tmp, clk);
endmodule

私の見方では、tmpの値がsecondffによって使用される前に更新される可能性があるため、2つではなく1つのフリップフロップになります。誰かが基準のどの部分が起こり得ないと言っているか教えてもらえますか?どうもありがとう。

[そのようなコードを書くことを考えたことはありません。コーディングスタイルが貧弱で意味が自明でない場合でも、ブロック/非ブロックの動作を理解したいだけです]

後で追加:

私は今、その論文が正しくない可能性が高いと思います。1364-2201Verilog標準のセクション5「SchedulingSemantics」では、何が起こるかについて説明しています。特に、68ページのセクション5.6.6「ポート接続」では、単方向ポートは連続割り当てとまったく同じであると述べています。同様に、継続的な割り当ては、常にすべてに敏感なブロックです。つまり、以下の私の例でのffの2つのインスタンス化は、複数のalways句を持つモジュールと同等であり、誰もが同意するだろうということです。

Clive Cummingsが質問に答えた後に追加されました:

規格のセクション5から抜粋した上記のステートメントは、更新イベントのタイミングのみを参照しており、一部の継続的な割り当てと常にブロックの間の文字通りの同等性を意味するものではないことを指摘してくれたCCに感謝します。それでも、一部のシミュレーター(Icarus Verilogなど)が「フリップフロップ」でブロッキングと非ブロッキングの割り当てを使用して異なるシミュレーション結果を生成する理由を説明していると思います。[より大きな例では、ブロッキング割り当てで2つの明らかなffが得られ、非ブロッキング割り当てで正しい5つが得られました。]他のシミュレーター(たとえば、デフォルトオプションまたはCverを備えたModelsim)は、どの形式でも同じ結果を生成するようです。割り当てが使用されます。

4

2 に答える 2

7

全て -

いくつかの修正と更新。2001 Verilog Standardのセクション5.6.6には、「単方向ポートは連続割り当てのようなもの」ではなく、「ポートは暗黙の連続割り当てステートメントを介してプロセスを接続する」と記載されています。以下に注意する違いがあります。

第二に、「継続的な割り当ては、常にすべてに敏感なブロックである」というのは真実ではありません。継続的な割り当てVerilog標準で説明されているように、事前定義された解決機能を備えた他のソースによって駆動できるネットに値を駆動します変数の変更値を常にブロックし、最後の手続き型変更が優先されます(解決なし)。

1-alwaysブロックフリップフロップの説明に関して、論文での私の説明は100%正確ではありません(ただし、通常は正確です)。理論的には、2インスタンス化されたフリップフロップモデルには競合状態がありますが、めったに見られません。出力として宣言された変数に常にブロック代入を行うと、Verilogコンパイラは自動的に「暗黙の連続代入ステートメント」(IEEE-1364-2001、セクション5.6.6、第1段落)をスローするため、競合はめったに見られません。手続き型変数をネットに変換する割り当て(これが発生することは決してありません!)この変換は通常、ポートに非ブロッキング割り当て遅延と同等のものを導入するのに十分であるため、シミュレーションは機能します。私は過去に、フリップフロップ間のモジュールポートを効果的に削除するコンパイラ最適化スイッチを試し、不要な競合状態を観察したので、技術的には、大丈夫1-常にブロッキング割り当てフリップフロップの説明は100ではありません% 正しい; したがって、このペーパーで説明されている非ブロッキング割り当てを引き続き使用する必要があります。

同じモジュールの2-alwaysblocking-assignmentの例には、明確な競合状態があります。書かれているように、ほとんどのコンパイラはコードをトップダウンで実行するため、おそらく機能しますが、alwaysブロックの順序を逆にすると、おそらく競合が発生します。

よろしく-CliffCummings-Verilog&SystemVerilog Guru

于 2012-06-27T17:53:46.727 に答える
0

ペーパーのバージョン1.3 、セクション9例13を読んでください。その下のテキストは、モジュールに単一のalwaysブロックしか含まれていなくても問題ないことを説明しています。私の現在の理解は、それは別々のモジュール間の問題ではないということです。例を機能させる。ただし、モジュールに複数のalwaysブロックが含まれている場合、実行の順序は定義されておらず、ペーパーのセクション2で説明されている競合状態につながります。

以下の例は、質問の2フロップの例とほぼ同じですが、1つのモジュールにあり、実行順序が定義されていないため、これは機能しない可能性があります。

module ff (q, d, clk)
  output reg q;
  input d, clk;
  reg d_delay ;

  always @(posedge clk)
    d_delay = d;

  always @(posedge clk)
    q = d_delay;

endmodule
于 2012-06-26T19:18:33.327 に答える