2016-08-31 5 views
0

パラメータに応じて変数インスタンシエーションを操作する方法はありますか?Verilog/SV条件変数定義

たとえば、ちょうどbit [WIDTH-1:0] a;を入れてDEPTH == 1に設定すると、幅は0になり、bit [-1:0] a;は意味をなさないでしょう。

以下の例のようにコードを書くと、2番目の$ディスプレイに "Undeclared identifier:a"というエラーが表示されます。 Verilog/SVでこれを達成する方法はありますか?またはコードにエラーがありますか?

module test #(
    parameter DEPTH = 2, 
    parameter WIDTH = $clog2(DEPTH) 
)(); 

    generate 
    if (WIDTH == 0) begin 
     bit    a; 
    end else begin 
     bit [WIDTH-1:0] a; 
    end 
    endgenerate 

    initial begin 
    $display("WIDTH: %d", WIDTH); 
    $display("Bit width of a: %d", $bits(a)); 
    end 
endmodule: test 

答えて

3

すべてを行う必要が

bit [(WIDTH>0 ? WIDTH-1 : 0):0] a; 
+0

wow:|それが可能であることを知りませんでした。素晴らしい答え、ありがとうございます。 – evilpascal

0

使用しているのVerilogのバージョンですか? $ clog2はVerilog-2005で導入されました。以前の実装は、奇妙な結果をもたらす可能性があります。

以下を参照して、clog2の結果に対する深さの増分を示すループを作成しました。 4の値を表すために2の値を表すために

CLOG2(0) =   0 
CLOG2(1) =   0 
CLOG2(2) =   1 
CLOG2(3) =   2 
CLOG2(4) =   2 

1の値を表現するために、例えば、あなたが1ビットを必要とし、0でない 、あなたは2ビットを必要としない... 1. 、あなたは3ビットが必要です。トランジションポイントでCLOG2は常に1です。あなたが成長するにつれて、従来の解決策はそれを説明しません。

あなたは

WIDTH = $clog(DEPTH+1); 

を言うのであれば、私はあなたが自動的にあなたが望む結果を得るだろうと思います。

+0

私はSystemVerilogを使用しています。残念ながら、私はCLOG2(1)とCLOG2(2)の結果を両方とも1にしたいので、これは私が必要とするものではありません。 – evilpascal