0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

`includeで読み込むファイルをコンパイル時にdefineで指定

Last updated at Posted at 2025-01-26

Verilog/SystemVerilogの`includeで読み込むファイルをコンパイル時のdefine指定で変えられないかなぁと思っていろいろ調べたりやってみたのでメモとして残す。

1 " "なしでファイルパスをそのままマクロに指定

+define+FILE_PATH=../AAA/BBB/XXX.svh

1-a `includeの" "内に直接マクロを記述

`include "`FILE_PATH"

まずこれはダメだった。`FLIE_PATH自体がそのまんま文字列として認識されるみたい。

1-b "の前に`を追加

とか見ると" "内でマクロを展開するには"の前に`を付ける必要があるみたい。

`include `"`FILE_PATH`"

フリーのシミュレータDSim DesktopVivado Simulator (Xsim)ではこの方法でO.Kであったが、なんと商用シミュレータではダメだった。ふつう逆だろ!まあいいや。

1-c " "を追加した別マクロを定義

`define INC_STRING `"`FILE_PATH`"
`include `INC_STRING

`FILE_PATH" "を追加したものを別マクロ`INC_STRINGとして新たに定義。それを`includeで使う。
これだとDSimでもXsimでも商用シミュレータ達でもO.Kであった。しかし、某マイナー商用シミュレータではN.Gであった。

1-d `STRINGIFY(x)マクロで文字列化

`define STRINGIFY(x) `"x`"
`include `STRINGIFY(`FILE_PATH)

""を付加して任意の文字列化を行うマクロ `STRINGIFY(x)を定義してそれを `FILE_PATHに適用して `includeで使う。
これだと有名商用シミュレータたちおよびマイナー商用ならびにDSim, Xsim全てで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のどちらでも指定できるよう両対応にした。

tb.sv
`ifdef FILE_PATH
    `define INC_STRING `"`FILE_PATH`"
`endif

`STRINGIFY(x) `"x`"

module tb;

//`include "./inc.svh"

  initial  begin
`ifdef FILE_PATH
  //`include "`FILE_PATH"    // N.G
  //`include `"`FILE_PATH`"  // O.K or N.G
  //`include "``FILE_PATH``"  // O.K or N.G
  //`include `INC_STRING
    `include `STRINGIFY(`FILE_PATH)
`elsif INC_STRING
    `include `INC_STRING
`else
    $display("FILE_PATH nor INC_STRING is not defined.");
`endif

    $finish();
  end

endmodule
./inc.svh
    $display("Hello World!!!");
Makefile
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

又、以下EDA Playgroundへのリンク
`include with macro

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?