Verilog/SystemVerilogの`include
で読み込むファイルをコンパイル時のdefine指定で変えられないかなぁと思っていろいろ調べたりやってみたのでメモとして残す。
1 " "
なしでファイルパスをそのままマクロに指定
+define+FILE_PATH=../AAA/BBB/XXX.svh
1-1 `includeの" "
内に直接マクロを記述
`include "`FILE_PATH"
まずこれはダメだった。`FLIE_PATH
自体がそのまんま文字列として認識されるみたい。
とか見ると" "
内でマクロを展開するには"
の前に`
を付ける必要があるみたい。
1-2 "
の前に`
を追加
`include `"`FILE_PATH`"
フリーのシミュレータDSim DesktopやVivado Simulator (Xsim)ではこの方法でO.Kであったが、なんと某商用シミュレータVではダメだった。ふつう逆だろ!まあいいや。
1-3 " "
を追加した別マクロを定義
`define INC_STRING `"`FILE_PATH`"
`include `INC_STRING
`FILE_PATH
に" "
を追加したものを別マクロ`INC_STRING
として新たに定義。それを`include
で使う。
これだとDSimでもXsimでも某商用シミュレータVでもO.Kであった。
2 " "
込みでファイルパスをマクロに定義
そもそも" "
込みのマクロの`INC_STRING
自体をシミュレータオプションの+defineで定義すれば良いのではないか。それを同様に`includeのパス指定に渡す。
`include `INC_STRING
2-1 +defineでそのまま"
を使う
+define+INC_STRING="../AAA/BBB/XXX.svh"
これはN.G。"
自体は無視されて" "
の中身のみがマクロに定義されてしまう。
2-2 シングルクオーテーション('
)で囲む
+define+INC_STRING='"../AAA/BBB/XXX.svh"'
これならO.K。
以下を参考記事。
2-3 "
を\
でエスケープ
+define+INC_STRING=\"../AAA/BBB/XXX.svh\"
これでもO.Kだった。
以下を参考記事。
実行環境例
以上を踏まえて、以下に(dsimでの)実行環境例を示す。
シミュレータオプションの+defineで`FILE_PATH
と`INC_STRING
のどちらでも指定できるよう両対応にした。
`ifdef FILE_PATH
//`include "`FILE_PATH" // N.G
//`include `"`FILE_PATH`" // O.K or N.G
`define INC_STRING `"`FILE_PATH`"
`endif
module tb;
//`include "./inc.svh"
initial begin
`ifdef INC_STRING
`include `INC_STRING
`else
$display("No INC_STRING defined");
`endif
$finish();
end
endmodule
$display("Hello World, FILE_PATH = %s", `INC_STRING);
SIM := dsim
path :
$(SIM) tb.sv +define+FILE_PATH=./inc.svh
#str : # N.G
# $(SIM) tb.sv +define+INC_STRING="./inc.svh"
str1 :
$(SIM) tb.sv +define+INC_STRING='"./inc.svh"'
str2 :
d$(SIM) tb.sv +define+INC_STRING=\"./inc.svh\"
noinc :
$(SIM) tb.sv
FILE_PATH指定で実行
> make path
INC_STRING指定で実行
> make str1
or
> make str2
includeなしで実行
> make noinc