web-dev-qa-db-ja.com

プリプロセッサマクロから文字列を作成する方法

デザインへの階層パスを表すプリプロセッサマクロがあります。

例:

`define HPATH top.chip.block

`HPATHの値を保持する文字列を作成する必要があるため、私の例では、文字列はtop.chip.blockと等しくなければなりません。

そのような文字列を作成する方法はありますか?

次の試みはどれもうまくいきませんでした:

string hpath;
hpath = "`HPATH";     // Results in hpath = "`HPATH"
hpath = \"``HPATH\";  // Doesn't compile
hpath = `HPATH;       // Doesn't compile

hpathをこの割り当てhpath = "top.chip.block"と同等にしたいのですが、パスを再度指定する代わりに`HPATHを使用します。

モジュール内ではなく、トップレベルのUVM環境内で文字列が必要なため、%mを使用できません。

もう少し背景:これを実行したい理由は、UVMクラスライブラリでバックドアレジスタアクセスを使用しているためです。バックドアAPIでは、hdl_pathをデザイン内のブロックに文字列として設定する必要があります。私はすでに階層パスの `定義を持っており、hdl_pathsを指定するときにそれらを再利用しようとしているので、同じパスを2回定義していません。私のテストベンチは、階層パスと文字列パスの両方を使用します。

14
dwikle

文字列リテラル内で `defineマクロを使用することはできません。 SystemVerilog LRMによると:

マクロ置換と引数置換は、文字列リテラル内では発生しません。

ただし、文字列リテラルは、引数を取るマクロを使用し、「」を使用してマクロに引用符を含めることで作成できます。

繰り返しますが、LRMから:

`"は、 "の通常の字句の意味をオーバーライドし、展開に引用符、実際の引数の置換、および埋め込みマクロの展開が含まれることを示します。これにより、文字列リテラルをマクロ引数から作成できます。

したがって、これは機能します。

`define STRINGIFY(x) `"x`"
`define HPATH top.chip.block
string hpath = `STRINGIFY(`HPATH);
$display(hpath);                       // Output: "top.chip.block"

サンプルコードはここで実行できます: http://www.edaplayground.com/s/4/879

22
dwikle

これがあなたが探しているものだと思います。

`define HPATH `"top.chip.block`"
string hpath = `HPATH;

ツールが指摘したように、エスケープシーケンス%mは、$ displayステートメントで使用されたときに現在の階層を提供するため、より適切なオプションになる可能性があります。

1
user597225

これが古いスレッドであることは知っていますが、私たちのソリューションを共有したいと思いました。 $ sformatfを使用すると、必要に応じて追加情報を追加できます。

`define STRINGIFY(DEFINE) $sformatf("%0s", `"DEFINE`")
0
MBW