工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

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

  1. Verilog チュートリアル
  2. Verilog 連結
  3. Verilog - ナットシェルで
  4. Verilog 割り当て
  5. Verilog ブロッキング &ノンブロッキング
  6. Verilog 関数
  7. Verilog タスク
  8. Verilog 階層参照スコープ
  9. Verilog クロック ジェネレーター
  10. Verilog 数学関数
  11. Verilog タイムフォーマット