Verilog では、パラメータは定数であり、レジスタ データ型やネット データ型などの他のデータ型には属しません。
定数式は、定数または以前に定義されたパラメータを指します。実行時にパラメータ値を変更することはできませんが、次のコマンドを使用してパラメータ値を変更できます。 デフパラム 声明。
の デフパラム ステートメントはコンパイル時にのみパラメーターを変更できます。パラメータ値は、モジュールのインスタンス化で # 遅延指定を使用して変更できます。
で ベリログ 、モジュールのインスタンス化中にモジュール パラメーター値をオーバーライドするには 2 つの方法があります。
- defparam キーワードを使用する。
- そしてモジュールインスタンスパラメータ値の割り当て。
defparam キーワードの後に、パラメータとパラメータの新しい値への階層パスが指定されます。この新しい値は定数式である必要があります。右側の式がパラメータを参照する場合は、defparam が呼び出されるモジュール内で宣言する必要があります。
モジュールインスタンスのパラメータ値の割り当て方法は、ゲートインスタンスへの遅延の割り当てのように見えます。このメソッドは、インスタンス化されたモジュール内のパラメータを、モジュール内に表示されるときにオーバーライドします。この形式を使用すると、パラメータをスキップできません。
定数式には、以前に宣言したパラメータを含めることができます。以前に宣言したパラメータで変更が検出されると、この値に依存するすべてのパラメータが自動的に更新されます。
4 ビット加算器をパラメータ化してビット数の値を受け入れることができ、モジュールのインスタンス化中に新しいパラメータ値を渡すことができることを考えてみましょう。したがって、N ビット加算器は 4 ビット、8 ビット、または 16 ビット加算器に変換されます。これらは、関数呼び出し中に渡される関数への引数のようなものです。
parameter MSB = 7; // MSB is a parameter with the constant value 7 parameter REAL = 4.5; // REAL holds the real number parameter FIFO_DEPTH = 256, MAX_WIDTH = 32; // Declares two parameters parameter [7:0] f_const = 2'b3; // 2 bit value is converted into 8 bits; 8'b3
パラメータには2種類あり、 モジュール そして 特定 、両方とも範囲指定を受け入れます。ただし、格納する値の幅に合わせて作成されるため、範囲指定は必要ありません。
モジュールパラメータ
これを使用すると、モジュール内のパラメーター定義をオーバーライドし、コンパイル時にモジュールに異なるパラメーターのセットを持たせることができます。パラメータは次のコマンドで変更できます。 デフパラム 声明。パラメーターの名前に大文字を使用すると、すぐにわかるようにするのが一般的です。
以下のモジュールは、パラメーターを使用してデザイン内のバス幅、データ幅、FIFO の深さを指定します。モジュールがインスタンス化されるとき、または defparam ステートメントを使用することにより、新しい値でオーバーライドできます。
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]; endmodule
新しい ANSI スタイルの Verilog ポート宣言では、次のようなパラメータを宣言できます。
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations );
パラメータの上書き
パラメータは、モジュールのインスタンス化中に新しい値で上書きできます。最初の部分は、と呼ばれるモジュールです。 design_ip d0 という名前で、新しいパラメータが # ( ) 内に渡されます。
2 番目の部分では、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つのパラメータがあります N そして 下 、デフォルト値は 2 と 0 を持つように宣言されています。
N 出力のビット数を制御し、カウンタの幅を効果的に制御します。デフォルトでは 2 ビットのカウンターです。
パラメータ 下 カウンタをインクリメントするかデクリメントするかを制御します。パラメータが 0 に設定されているため、カウンタはデクリメントされます。
2ビットアップカウンタ
Javaのタイプ
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) (down) out <="out" - 1; + endmodule pre> <p>The module counter is instantiated with <strong> <em>N</em> </strong> as 2 even though it is not required because the default value is anyway 2.</p> <p> <strong> <em>DOWN</em> </strong> is not passed during module instantiation. And it takes the default value of 0 making it an up-counter.</p> <pre> module design_top (input clk, input rstn, input en, output [1:0] out); counter #(.N(2)) u0 (.clk(clk), .rstn(rstn), .en(en)); endmodule </pre> <p>The default parameters are used to implement the counter where <strong> <em>N</em> </strong> equals two, making it a 2-bit counter, and <strong> <em>DOWN</em> </strong> equals zero, making it an up-counter. The output from the counter is left unconnected at the top level.</p> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters.webp" alt="Verilog Parameters"> <p> <strong>4-bit down Counter</strong> </p> <p>In this case, the module counter is instantiated with N as 4 making it a 4-bit counter. DOWN is passed a value of 1 during the module instantiation and hence a down-counter is implemented.</p> <pre> 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 </pre> <br> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters-2.webp" alt="Verilog Parameters"> <h3>Specify Parameters</h3> <p>These parameters are used to provide time and delay values and declared using the <strong> <em>specparam</em> </strong> keyword. It is allowed to use both within the specified block and the main module body.</p> <pre> // 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 </pre> <h3>Difference between Specify and Module Parameters</h3> <table class="table"> <tr> <th>Specify parameter</th> <th>Module parameter</th> </tr> <tr> <td>Specify the specparam keyword declares parameter.</td> <td>The module parameter is declared by parameter.</td> </tr> <tr> <td>It can be declared inside a specific block or within the main module.</td> <td>It can only be declared within the main module.</td> </tr> <tr> <td>This parameter may be assigned specparams and parameters.</td> <td>This may not be assigned specparams.</td> </tr> <tr> <td>SDF can be used to override values.</td> <td>Instance declaration parameter values or defparam can be used to override.</td> </tr> </table> <p> <strong>Notes</strong> </p> <p>Here are some important notes for the Verilog parameters, such as:</p> <ul> <li>If we are using the <strong> <em>defparam</em> </strong> statement, we must specify a hierarchical path to the parameter.</li> <li>We cannot skip over a parameter in a <strong> <em>module instance parameter value assignment</em> </strong> . If we need to do this, use the initial value for a not overwritten parameter.</li> <li>When one parameter depends on the other, then the second will automatically be updated if we change the first one.</li> </ul> <hr></=>
デフォルトのパラメータはカウンタの実装に使用されます。 N 2 に等しいため、2 ビットのカウンターとなり、 下 はゼロに等しいため、アップカウンタになります。カウンタからの出力は、最上位レベルでは接続されないままになります。
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
パラメータの指定
これらのパラメータは時間と遅延の値を提供するために使用され、次のメソッドを使用して宣言されます。 スペックパラメータ キーワード。指定したブロック内とモジュール本体の両方で使用できます。
// 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で宣言します。 |
特定のブロック内またはメイン モジュール内で宣言できます。 | メインモジュール内でのみ宣言できます。 |
このパラメータには、specparams およびパラメータを割り当てることができます。 | これには specparams が割り当てられていない可能性があります。 |
SDF を使用して値をオーバーライドできます。 | インスタンス宣言パラメータ値または defparam を使用してオーバーライドできます。 |
ノート
以下に、Verilog パラメータに関する重要な注意事項をいくつか示します。
- を使用している場合は、 デフパラム ステートメントでは、パラメータへの階層パスを指定する必要があります。
- パラメータをスキップすることはできません モジュールインスタンスパラメータ値の割り当て 。これを行う必要がある場合は、上書きされていないパラメータの初期値を使用してください。
- 一方のパラメータが他方のパラメータに依存している場合、最初のパラメータを変更すると、2 番目のパラメータも自動的に更新されます。
=>