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