宣言とパラメータ
宣言
前回ポートを宣言して使用する場合を例を利用して説明しました。その際inputとoutputでポートを宣言しました。これらの宣言子の他にレジスタ(reg)や配線(wire)などの宣言子も用意されています。
宣言は
宣言子 幅 オブジェクト名;
の形式に従います。幅はオブジェクトの持つビット幅を指定します。オブジェクトは複数列挙できます。列挙する際は","で区切ります。幅の指定は例えば
[7:0]
のように記述すれば8ビット幅を指定できます。この場合、降順で7, 6, 5,..., 2, 1, 0と各ビットが並びます。昇順での指定も可能です。またソフトウェアプログラム同様にSVでも0から始まります。
定数で幅を指定する場合、複数のオブジェクトで同じ目的で同じ幅を指定したい時がよくあります。またその幅を変えてみたいこともよくあります。特にモジュールを再利用したい場合にこのような要望が発生します。
パラメータ
SVではパラメータを設定することでこれを可能にしています。モジュール内でのみパラメータを使用したい場合、
localparam ローカルパラメータ名 = 値;
とローカルで使用することを宣言するlocalparam宣言子を使用して記述します。ローカルパラメータの値は数式で与えることもできます。先の例の場合
localparam WIDTH = 8;
wire [WIDTH-1:0] w_a;
wire [WIDTH-1:0] w_b;
のように使用します。値を修正するだけで、同じローカルパラメータ指定しているすべてのオブジェクトに対して適用されるので、いちいち各オブジェクトを修正する手間を省けます。
さらにモジュールを使用する際にも幅といった値を個々に対して変えたい場合もあります。
この時は例えば
module instance_name
#(
parameter パラメータ名 = 値
)( ... );
...
endmodule
としてパラメータを宣言して使用します。このパラメータ宣言ではデフォルトの値を指定します。パラメータの値は数式で与えることもできます。このモジュールを使用する場合、たとえばパラメータとしてparam_hogeを宣言している場合は
instance_name #(
.param_hoge( 8 )
) object_name1 (
...
);
...
instance_name #(
.param_hoge( 5 )
) object_name2 (
...
);
...
instance_name #(
.param_hoge( param_foo )
) object_name3 (
...
);
といった形で指定します。コンマ+パラメータ名+(+値+)で記述します。また列挙する際は","で区切ります。この例では3つめのオブジェクトではパラメータあるいはローカルパラメータでパラメータ渡しています。オブジェクト宣言でパラメータ指定を省略した場合、デフォルト値が暗黙に用いられます。