0

この2つのステートメントの違いを知りたいだけです

always @(posedge CLK)
    begin
       state <= next_state;
    end

と:

always @(CLK)
    begin
     case(CLK)
        1'b1:
           state <= next_state;
        1'b0:
           state <= state;
    end

両方に違いはありますか?

ありがとう

4

5 に答える 5

9

そうではありません。posedgeこれらの遷移を (LRM から) 検出します。

Table 43—Detecting posedge and negedge
To   0       1       x       z
From
0    No edge posedge posedge posedge
1    negedge No edge negedge negedge
x    negedge posedge No edge No edge
z    negedge posedge No edge No edge

posedgeしたがって、たとえば0->x は aです。2 番目の例では、最終的CLKに 1 になるケースのみを検出するため、0->x と 0->z を見逃しています。

于 2013-05-30T16:24:44.133 に答える
3

IEEE 規格。Verilog レジスタ転送レベル合成標準である 1364.1(E):2002 (IEC 624142(E):2005) では、Sec. posedge5.1 センシティビティ リストに/negedgeイベントがない always ブロックは組み合わせロジックです。つまり、イベント リスト内の信号は無視され、暗黙的な式リスト ( @(*), @*) が使用されたかのようにブロックが合成されます。次の例は、規格に記載されています(「例4」(14ページ)):

always @ (in)
  if (ena)
    out = in;
  else
    out = 1’b1;
// Supported, but simulation mismatch might occur.
// To assure the simulation will match the synthesized logic, add ena
// to the event list so the event list reads: always @ (in or ena)

(コメントも標準ドキュメントからコピーされます)

つまり、合成ツールの場合、2 番目のブロックは実質的に次のようになります。

always @*
    begin
     case(CLK)
        1'b1:
           state <= next_state;
        1'b0:
           state <= state;
    end

CLKこれは、選択入力、アクティブ 1 入力、およびアクティブ 0 入力としてフィードバックされるnext_state出力 ( )を備えた単なるマルチプレクサです。stateスマート合成ツールは、これがイネーブル入力としての d 型ラッチと同一であることを検出しCLK、組み合わせループの代わりに d 型ラッチを作成する場合があります。コードはすべての分岐で明示的に代入するため、合成ツールはこのラッチを検出する必要がないことに注意してくださいstate(標準のセクション 5.3 を比較してください)。

いずれにせよ、これは最初のコード例が合成する d 型フリップフロップとは異なります。これは、Verilog コードがシミュレーションと合成で異なる意味を持つ多くのケースの 1 つです。したがって、(1) このようなケースを回避する方法で合成可能な Verilog コードを記述し、(2) デザインの合成後のシミュレーションを常に実行して (フォーマル検証も使用している場合でも!)、確実に回避できるようにすることが重要です。この落とし穴。

于 2013-06-01T15:28:52.987 に答える
1

2つのブロックは非常に異なります。

上のものはフリップフロップを提供し、下のものは選択信号として CLK を使用するマルチプレクサを備えたラッチを提供します。

2 つのブロックの決定的な違いは、上のブロックは同期ブロック、つまりポーズエッジ クロック部分であり、下のブロックはエッジではなく CLK レベルと非同期であることです。

于 2013-05-30T16:20:41.370 に答える