Verilog パラメータ
パラメーターは、モジュールを別の仕様で再利用できるようにする Verilog コンストラクトです。たとえば、4 ビットの加算器をパラメーター化してビット数の値を受け入れることができ、モジュールのインスタンス化中に新しいパラメーター値を渡すことができます。したがって、N ビットの加算器は、4 ビット、8 ビット、または 16 ビットの加算器になることができます。それらは、関数呼び出し中に渡される関数への引数のようなものです。
parameter MSB = 7; // MSB is a parameter with a constant value 7
parameter REAL = 4.5; // REAL holds a real number
parameter FIFO_DEPTH = 256,
MAX_WIDTH = 32; // Declares two parameters
parameter [7:0] f_const = 2'b3; // 2 bit value is converted to 8 bits; 8'b3
パラメータは基本的に定数であるため、実行時に値を変更することは違法です。ネット、変数、または別のパラメーターで既に使用されている名前を再宣言することは違法です。
パラメーターには、モジュール の 2 つの主要なタイプがあります。 そして指定 どちらも範囲指定を受け入れます。ただし、それらは通常、格納する値が必要とする幅に合わせて作成されるため、範囲指定は必要ありません。
モジュール パラメータ
モジュール パラメーターは、モジュール内のパラメーター定義をオーバーライドするために使用できます。これにより、コンパイル時にモジュールが異なるパラメーター セットを持つようになります。パラメータは defparam
で変更できます ステートメントまたはモジュール インスタンス ステートメント内。パラメータの名前に大文字を使用して、すぐに目立つようにするのが一般的な方法です。
以下に示すモジュールは、パラメーターを使用してバス幅、データ幅、およびデザイン内の FIFO の深さを指定し、モジュールがインスタンス化されるとき、または defparam
を使用して新しい値でオーバーライドできます。
// Verilog 1995 style port declaration
module design_ip ( addr,
wdata,
write,
sel,
rdata);
parameter BUS_WIDTH = 32,
DATA_WIDTH = 64,
FIFO_DEPTH = 512;
input addr;
input wdata;
input write;
input sel;
output rdata;
wire [BUS_WIDTH-1:0] addr;
wire [DATA_WIDTH-1:0] wdata;
reg [DATA_WIDTH-1:0] rdata;
reg [7:0] fifo [FIFO_DEPTH];
// Design code goes here ...
endmodule
新しい ANSI スタイルの Verilog ポート宣言では、次のようにパラメーターを宣言できます。
module design_ip
#(parameter BUS_WIDTH=32,
parameter DATA_WIDTH=64) (
input [BUS_WIDTH-1:0] addr,
// Other port declarations
);
パラメーターのオーバーライド
パラメータは、モジュールのインスタンス化中に新しい値でオーバーライドできます。最初の部分は、新しいパラメータが #( )
内で渡される名前 d0 で design_ip と呼ばれるモジュールをインスタンス化します . 2 番目の部分では、defparam
という Verilog コンストラクトを使用します。 新しいパラメータ値を設定します。最初の方法は、RTL デザインで新しいパラメーターを渡すために最も一般的に使用される方法です。 2 番目の方法は、テストベンチ シミュレーションで一般的に使用され、モジュールを再インスタンス化することなく、設計パラメーターをすばやく更新します。
module tb;
// Module instantiation override
design_ip #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [port list]);
// Use of defparam to override
defparam d0.FIFO_DEPTH = 128;
endmodule
例
モジュール カウンターには、それぞれ 2 と 0 の既定値を持つように宣言された 2 つのパラメーター N と DOWN があります。 N は、カウンターの幅を効果的に制御する出力のビット数を制御します。デフォルトでは、2 ビット カウンターです。パラメータ DOWN は、カウンタが増加するか減少するかを制御します。デフォルトでは、パラメーターが 0 に設定されているため、カウンターは減少します。
2ビットアップカウンター
module counter
#( parameter N = 2,
parameter DOWN = 0)
( input clk,
input rstn,
input en,
output reg [N-1:0] out);
always @ (posedge clk) begin
if (!rstn) begin
out <= 0;
end else begin
if (en)
if (DOWN)
out <= out - 1;
else
out <= out + 1;
else
out <= out;
end
end
endmodule
モジュール カウンターは、N を 2 としてインスタンス化されますが、既定値は 2 であるため必要ありません。DOWN はモジュールのインスタンス化中に渡されないため、既定値の 0 を使用してアップカウンターを作成します。
module design_top ( input clk,
input rstn,
input en,
output [1:0] out);
counter #(.N(2)) u0 ( .clk(clk),
.rstn(rstn),
.en(en));
endmodule
N が 2 で 2 ビット カウンタになり、DOWN が 0 でアップカウンタになるカウンタを実装するために、デフォルト パラメータが使用されていることを確認してください。カウンターからの出力は、トップ レベルで未接続のままです。
4 ビット ダウン カウンター
この場合、モジュール カウンターは N を 4 としてインスタンス化され、4 ビット カウンターになります。モジュールのインスタンス化中に DOWN に値 1 が渡されるため、ダウンカウンターが実装されます。
module design_top ( input clk,
input rstn,
input en,
output [3:0] out);
counter #(.N(4), .DOWN(1))
u1 ( .clk(clk),
.rstn(rstn),
.en(en));
endmodule
パラメータを指定
これらは主にタイミングと遅延の値を提供するために使用され、specparam
を使用して宣言されます。 キーワード。 specify 内の両方で使用できます ブロックとメインモジュール本体。
// Use of specify block
specify
specparam t_rise = 200, t_fall = 150;
specparam clk_to_q = 70, d_to_q = 100;
endspecify
// Within main module
module my_block ( ... );
specparam dhold = 2.0;
specparam ddly = 1.5;
parameter WIDTH = 32;
endmodule
指定パラメータとモジュール パラメータの違い
パラメータを指定 | モジュール パラメータ |
---|---|
specparam で宣言 | parameter によって宣言 |
specify 内で宣言可能 ブロックまたはメイン モジュール内 | メイン モジュール内でのみ宣言可能 |
specparams とパラメータを割り当てることができます | specparams が割り当てられていない可能性があります |
SDF を使用して値をオーバーライドできます | インスタンス宣言パラメータ値または defparam オーバーライドに使用できます |
Verilog