7

最近、Verilog で次のような D フリップフロップ RTL コードを見たことがあります。

    module d_ff(
            input d,
            input clk,
            input reset,
            input we,
            output q
    );

    always @(posedge clk) begin
            if (~reset) begin
                    q <= 1'b0;
            end
            else if (we) begin
                    q <= d;
            end
            else begin
                    q <= q;
            end
    end
    endmodule

陳述書はq <= q;必要ですか?

4

2 に答える 2

7

ステートメントq<=q; 必要?

いいえ、そうではありません。ASICの場合、実際には面積と消費電力が増加する可能性があります。最新のFPGAがこれをどのように処理するかはわかりません。合成中、ツールはそのステートメントを確認し、クロックの正のエッジごとにqを更新する必要があります。その最後のelse句がないと、ツールはq指定された条件が満たされた場合にのみ更新できます。

ASICでは、これは、合成ツールがマルチプレクサの代わりにクロックゲート(ライブラリにクロックゲートがある場合)を挿入できることを意味します。単一のDFFの場合、クロックゲートは通常マルチプレクサよりもはるかに大きいため、これは実際にはさらに悪い場合がありますが、qが32ビットの場合、節約は非常に重要になる可能性があります。最新のツールは、共有イネーブルを使用するDFFの数が特定のしきい値を満たしているかどうかを自動的に検出し、クロックゲートまたはマルチプレクサを適切に選択できます。

最後のelse句付き

この場合、ツールには3つのマルチプレクサと追加のルーティングが必要です

always @(posedge CLK or negedge RESET)
  if(~RESET)
    COUNT <= 0;
  else if(INC)
    COUNT <= COUNT + 1;
  else
    COUNT <= COUNT;

最後のelse句なし

ここで、ツールはすべてのDFFに単一のクロックゲートを使用します

always @(posedge CLK or negedge RESET)
  if(~RESET)
    COUNT <= 0;
  else if(INC)
    COUNT <= COUNT + 1;

ここからの画像

于 2012-06-13T14:47:25.700 に答える
1

シミュレーションに関する限り、qはreg型(またはSystemVerilogのロジック)であり、その値を保持する必要があるため、そのステートメントを削除しても何も変更されません。

また、qは非ブロッキング割り当てを使用して更新されるため、ほとんどの合成ツールはどちらの場合も同じ回路を生成する必要があります。おそらく、より良いコードは、alwaysではなくalways_ffを使用することです(ツールがそれをサポートしている場合)。このようにして、コンパイラは、qが常に非ブロッキング割り当てを使用して更新され、シーケンシャルロジックが生成されることを確認します。

于 2012-06-13T07:00:39.623 に答える