14

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

例:

`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

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

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

4

3 に答える 3

25

文字列リテラル内で`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

于 2013-03-13T03:38:18.877 に答える
1

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

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

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

于 2013-03-13T01:51:12.143 に答える