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

Verilog `ifdef 条件付きコンパイル

Verilog は、特定の方法でコードを処理するようコンパイラに本質的に指示するいくつかのコンパイラ ディレクティブをサポートしています。たとえば、コードの一部が特定の機能の実装を表している可能性があり、その機能が使用されていない場合は、設計にコードを含めないようにする何らかの方法が必要です。

これは条件付きで解決できます コンパイラ ディレクティブ内にコードをラップできます。これは、指定された名前付きフラグが設定されている場合に、コンパイルのためにコードを含めるか除外するかをコンパイラに指示します。

構文

条件付きコンパイルは Verilog `ifdef で実現できます そして `ifndef キーワード。これらのキーワードは、デザインのどこにでも表示でき、互いに入れ子にすることができます。

キーワード `ifdef 次の `else までコードの一部を含めるようにコンパイラに指示するだけです。 または `endif FLAG と呼ばれる特定のマクロが `define を使用して定義されている場合

  
  
// Style #1: Only single `ifdef
`ifdef <FLAG>
	// Statements
`endif

// Style #2: `ifdef with `else part
`ifdef <FLAG>
	// Statements
`else
	// Statements
`endif

// Style #3: `ifdef with additional ifdefs
`ifdef <FLAG1>
	// Statements
`elsif <FLAG2>
	// Statements
`elsif <FLAG3>
	// Statements
`else
	// Statements
`endif

  

キーワード `ifndef 次の `else までコードの一部を含めるようにコンパイラに指示するだけです。 または `endif 指定された FLAG と呼ばれるマクロが not である場合 `define を使用して定義

`ifdef を使用した設計例

  
  
module my_design (input clk, d, 
`ifdef INCLUDE_RSTN
                  input rstn,
`endif                  
                  output reg q);
  
  always @ (posedge clk) begin
`ifdef INCLUDE_RSTN
    if (!rstn) begin
      q <= 0;
    end else 
`endif
    begin
      q <= d;
    end
  end
endmodule

  

テストベンチ

  
  
module tb;
  reg clk, d, rstn;
  wire q;
  reg [3:0] delay;
  
  my_design u0 ( .clk(clk), .d(d),
`ifdef INCLUDE_RSTN
                .rstn(rstn),
`endif
                .q(q));
  
  always #10 clk = ~clk;
  
  initial begin
    integer i;
    
    {d, rstn, clk} <= 0;
    
	#20 rstn <= 1;    
    for (i = 0 ; i < 20; i=i+1) begin
      delay = $random;
      #(delay) d <= $random;
    end
    
    #20 $finish;
  end
endmodule

  

デフォルトでは、デザインのコンパイル中に rstn が含まれないため、ポートリストに表示されないことに注意してください。ただし、INCLUDE_RSTN と呼ばれるマクロが、ファイルのコンパイル リストの一部である Verilog ファイルで定義されているか、コマンド ラインを介してコンパイラに渡されている場合、rstn がコンパイルに含まれ、設計に含まれます。

違いを知るために、左ペインの [コンパイルと実行のオプション] に +define+INCLUDE_RSTN を追加したり削除したりして実験してください。

Verilog `ifdef `elsif の例

次の例では、別々の `ifdef 内に 2 つの表示ステートメントがあります。 デフォルトの `else を持たないスコープ それに一部。つまり、デフォルトでは何も表示されません。マクロまたは MACRO が定義されている場合、対応する表示メッセージが含まれ、シミュレーション中に表示されます

  
  
module tb;
  initial begin

`ifdef MACRO1
    $display ("This is MACRO1");
    
`elsif MACRO2
    $display ("This is MACRO2");
    
`endif
  end
endmodule

  
シミュレーションログ
# With no macros defined
ncsim> run
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+MACRO1
ncsim> run
This is MACRO1
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+MACRO2
ncsim> run
This is MACRO2
ncsim: *W,RNQUIE: Simulation is complete.

Verilog `ifndef `elsif の例

同じコードは `ifndef で記述できます 結果は正反対になります。

  
  
module tb;
  initial begin

`ifndef MACRO1
    $display ("This is MACRO1");
    
`elsif MACRO2
    $display ("This is MACRO2");
    
`endif
  end
endmodule

  
シミュレーションログ
# With no macros defined
ncsim> run
This is MACRO1
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+MACRO1
ncsim> run
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+MACRO2
ncsim> run
This is MACRO1
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+MACRO1 +define+MACRO2
ncsim> run
This is MACRO2
ncsim: *W,RNQUIE: Simulation is complete.

Verilog ネストされた `ifdef の例

`ifdef また、そのフレーバーを互いに入れ子にして、定義済みのマクロを使用してコードを包含および除外する複雑な方法を作成できます。

  
  
module tb;
  initial begin
    `ifdef FLAG
    	$display ("FLAG is defined");
    	`ifdef NEST1_A
    		$display ("FLAG and NEST1_A are defined");
    		`ifdef NEST2
    			$display ("FLAG, NEST1_A and NEST2 are defined");
    		`endif
    	`elsif NEST1_B
    		$display ("FLAG and NEST1_B are defined");
    		`ifndef WHITE
    			$display ("FLAG and NEST1_B are defined, but WHITE is not");
    		`else
    			$display ("FLAG, NEST1_B and WHITE are defined");
    		`endif
    	`else
    		$display ("Only FLAG is defined");
    	`endif
    `else
    	$display ("FLAG is not defined");
    `endif
  end
endmodule

  
シミュレーションログ
# Without defining any macro
ncsim> run
FLAG is not defined
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+FLAG +define+NEST1_B
ncsim> run
FLAG is defined
FLAG and NEST1_B are defined
FLAG and NEST1_B are defined, but WHITE is not
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+FLAG +define+NEST1_B +define+WHITE
ncsim> run
FLAG is defined
FLAG and NEST1_B are defined
FLAG, NEST1_B and WHITE are defined
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+FLAG
ncsim> run
FLAG is defined
Only FLAG is defined
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+WHITE
ncsim> run
FLAG is not defined
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+NEST1_A
ncsim> run
FLAG is not defined
ncsim: *W,RNQUIE: Simulation is complete.

親マクロが定義されていない限り、その中にネストされた他のマクロの定義はコンパイルされないことに注意してください。たとえば、FLAG のない NEST1_A または WHITE マクロ定義では、コンパイラはネストされたコードを取得しません。


Verilog

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