2013-03-12 27 views
12

デザインに階層パスを表すプリプロセッサマクロがあります。プリプロセッサマクロから文字列を作成する方法

例:

`define HPATH top.chip.block 

私は`HPATHの値を保持しているので、私の例では文字列がtop.chip.blockを等しくなければならない文字列を構築する必要があります。

このような文字列を作成する方法はありますか?私はhpathはこの割り当てhpath = "top.chip.block"を行うことと等価になりたい

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

が、`HPATHを使用しての代わりに、再びパスを指定して、次の試行の

どれも働きました。

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

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

+0

とは何あなたはそれを持っていたら、文字列をどうする予定ですか? '%m '指定子はあなたを助けるでしょうか? – toolic

+0

@toolic - もう少し詳しく質問を更新しました。パスは、文字列(UVMバックドアアクセスの場合)と階層パス(他の機能の場合)の両方として必要です。 '%m'は助けになりません。なぜなら私はモジュールの外側のスコープにパスを必要とするからです。 – dwikle

答えて

18

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

1

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

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

toolicが指摘したように$表示文で使用されるときには、より良い選択肢かもしれので、エスケープシーケンス%mは、あなたの現在の階層を提供します。

+0

正確ではありません - 他のコンテキストでは '\' HPATH'を階層参照として使用する必要があります。単にマクロを文字列として定義するだけでは機能しません。 – dwikle

関連する問題