Menu
Coddy logo textTech

Parameters

CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 11/90。

同じ module のコピーを多数作成し、それらを異なる場所で使用できます。これはmultiple instancesと呼ばれます。同じコードを何度も書く代わりに、一度だけ記述して、必要な回数だけ再利用します。各インスタンスは、チップ上のそのハードウェアの個別のコピーです。

しかし、それぞれのコピーを異なるものにする必要がある場合はどうでしょうか? たとえば、8ビットのcounterを1つ、16ビットのcounterを1つ、32ビットのcounterを1つです。parameterがなければ、3つの別々のmoduleを書く必要があります。

Parameters がこの問題を解決します。

parameter は、インスタンスを作成するときに設定できる定数値です。これにより、module の各コピーを異なる方法で設定できます。

パラメータの宣言

module counter #(
  parameter WIDTH = 8
)(
  input clk,
  output reg [WIDTH-1:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

#(parameter WIDTH = 8)は、デフォルト値が8のWIDTHというパラメータを定義します。

パラメータを宣言する際は、#記号をmodule名の直後かつポートリストの前に記述します。#は、後に続くものがmoduleを設定するパラメータのリストであることをVerilogに伝えます。moduleにパラメータがない場合は、#を完全に省略します。

パラメーターの使用

定数が必要な場所では、どこでもパラメーターを使用できます。

reg [WIDTH-1:0] data;        // ベクトルサイズ
count <= count + 1;           // 任意の幅で動作
assign out = data[WIDTH-1];   // MSBの位置

パラメータのオーバーライド

モジュールを使用するときは、パラメータの値を変更できます:

// デフォルトの幅(8ビット)
counter u1 (.clk(clk), .reset(reset), .count(count1));

// 16ビットにオーバーライド
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));

複数のパラメータ

複数のパラメータを使用できます:

module fifo #(
  parameter DEPTH = 16,
  parameter WIDTH = 8
)(
  input clk, wr_en, rd_en,
  input [WIDTH-1:0] data_in,
  output [WIDTH-1:0] data_out
);
  reg [WIDTH-1:0] memory [0:DEPTH-1];
endmodule

Localparam

localparam は似ていますが、外部から overridden にすることはできません:

module example;
  localparam STATE_IDLE = 2'b00;
  localparam STATE_RUN = 2'b01;
  localparam STATE_STOP = 2'b10;
  // These values are fixed inside this module
endmodule

変更されるべきでない定数には localparam を使用します。

challenge icon

チャレンジ

デフォルト値が4WIDTHという名前のパラメータを追加します。

行うこと:

  1. WIDTHという名前のパラメータを追加する
  2. デフォルト値を4に設定する
  3. パラメータは、モジュール名の後にある#( )の中に置く

自分で試してみよう

module counter #(
  // ここにパラメータ WIDTH をデフォルト 4 で追加
  
)(
  input clk,
  input reset,
  output reg [WIDTH-1:0] count
);

endmodule
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ