パラメータの宣言
Verilogでは以下のようにパラメータを設定することができます。parameterを設定することで、モジュールをパラメタイズすることができます。
parameter パラメータ名 = 値;
localparam パラメータ名 = 値;
以下に例を示します。
module ParameterSample(clock, reset);
parameter WIDTH = 4;
parameter INIT = 4'b0; // WIDTH'b0とはできない
// reg [4 - 1: 0] counter; として扱われる。
reg [WIDTH - 1: 0] counter;
...
always @(posedge clock) begin
if(reset) begin
// counter <= 4'b0; として扱われる。
counter <= INIT;
...
パラメータの上書き
parameter文で宣言された、下位モジュールのパラメータを上書きすることができます。上書きするには、defparam文を用います。
defparam
インスタンス名.パラメータ名 = 値
;
以下にdefparamの例を示します。
module SuperModule;
..
.
// 下位モジュールsampleのパラメータを上書き
defparam sample.WIDTH = 8;
defparam sample.INIT = 8'bFF;
ParameterSample sample(.clock(clock), .reset(reset));
...
Verilog 2001におけるパラメータ宣言
Verilog 2001においては、ポート宣言のようにパラメータを設定することができます。
module モジュール名 #(
parameter パラメータ名 = デフォルト値,
parameter パラメータ名 = デフォルト値,
...
parameter パラメータ名 = デフォルト値
) (
// ポート宣言
);
パラメータを上書きするには、以下のように記述します。
モジュール名 #(
.パラメータ名(値),
.パラメータ名(値),
...
.パラメータ名(値)
) インスタンス名 ( /* ポートの接続 */ );
例を以下に示します。
// 下位モジュール
module SubModule #(
parameter WIDTH = 2,
parameter INIT = 2'b0
) (
output reg [WIdTH - 1: 0] out,
input [WIDTH - 1: 0] in,
input clock, reset;
);
...
endmodule
// 上位モジュール
module SuperModule();
...
SubModule #(.WIDTH(4), .INIT(4'bF))
sub_module (.out(out), .in(in), .clock(clock), .reset(reset));