如何从预处理器宏创建字符串

dwi*_*kle 14 macros verilog system-verilog

我有一个预处理器宏,代表我的设计的分层路径.

例:

`define HPATH top.chip.block
Run Code Online (Sandbox Code Playgroud)

我需要构造一个保存值的字符串`HPATH,所以在我的例子中字符串应该相等top.chip.block.

有没有办法构建这样的字符串?

以下尝试都没有奏效:

string hpath;
hpath = "`HPATH";     // Results in hpath = "`HPATH"
hpath = \"``HPATH\";  // Doesn't compile
hpath = `HPATH;       // Doesn't compile
Run Code Online (Sandbox Code Playgroud)

我希望hpath等同于执行此分配hpath = "top.chip.block",但通过使用`HPATH而不是再次指定路径.

我无法使用,%m因为我需要在我的顶级UVM环境中的字符串,而不是在模块中.

更多背景:我想这样做的原因是因为我在UVM类库中使用后门寄存器访问.后门API需要将hdl_path设置为设计中的块,作为字符串.我已经定义了分层路径,并且在指定hdl_paths时尝试重用它们,所以我没有定义两次相同的路径.我的测试平台将使用分层路径和字符串路径.

dwi*_*kle 22

在字符串文字中使用`define宏是不可能的.根据SystemVerilog LRM:

宏替换和参数替换不应出现在字符串文字中.

但是,可以通过使用带有参数的宏来构造字符串文字,并使用````在宏中包含引号.

再次,来自LRM:

"覆盖通常的词汇含义",表示扩展应包括引号,实际参数的替换和嵌入式宏的扩展.这允许从宏参数构造字符串文字.

这样可行:

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

示例代码可以在这里运行:http://www.edaplayground.com/s/4/879