パラメータ

パラメータの宣言

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));