如何使用参数从预处理器宏创建字符串

时间:2015-09-16 09:57:35

标签: macros verilog system-verilog stringification

我试图在System Verilog中对一个宏进行字符串化,因此我可以在字符串中使用它进行打印。

我创建了一个STRINGIFY宏:

`define STRINGIFY(x) `"x`"

如下所示: How to create a string from a pre-processor macro

然而,我尝试stringify的宏需要参数。

请考虑以下代码:

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

我想要输出 "top.chip.block.wire" 代替。

请注意,HPATH宏采用参数wire

这是在此处运行的示例代码:http://www.edaplayground.com/x/CKB

编辑: 问题是当STR内部有参数时,`STRINGIFY宏停止内部宏的扩展。 例如:

`define STRINGIFY(x) `"x`"
`define HPATH top.chip.block
`define HPATH_SIGNAL(signal) top.chip.block.signal

$display(`"`HPATH`"); // correctly outputs "top.chip.block"
$display(`STRINGIFY(`HPATH)); // correctly outputs "top.chip.block"
$display(`"`HPATH_SIGNAL(sig)`"); // correctly outputs "top.chip.block.sig"
$display(`STRINGIFY(`HPATH_SIGNAL(sig))); // incorrectly outputs "`HPATH_SIGNAL(sig)"

嵌套在`STRINGIFY宏

中似乎没有解决`HPATH_SIGNAL(sig)

问题是为什么不在最后一行展开HPATH_SIGNAL(sig)?

以下是示例代码运行: http://www.edaplayground.com/x/RF2

3 个答案:

答案 0 :(得分:0)

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

在宏文本中允许使用“和”的混合,但使用“始终启动字符串文字并且必须具有终止”。嵌入在这个字符串文字中的任何字符,包括“,the”,都会启动一个字符串文字,其最后一个字符被“of”终止。

`define HPATH(signal) `"top.chip.block.signal`"
`define W wire
module a;
  initial begin
    string hpath = `HPATH(wire);
    //string hpath = `HPATH(`W);
    $display("%s",hpath);
  end
endmodule
  

输出:top.chip.block.wire

希望您理解“和”(或只是宏定义)

的上下文

答案 1 :(得分:0)

我不同意您在EDA游乐场获得的输出。我使用ModelSim / Questa获得所需的输出。无论宏参数文本在之前之前扩展之后通过外层宏(LRM在之后表示)之后扩展,“应该允许传递的宏被扩展。

答案 2 :(得分:0)

这似乎是一个VCS问题。

当在 Icarus Verilog 0.10.0 Riviera-PRO EDU 2015.06 模拟器上运行相同的代码时,输​​出是正确的。

使用 VCS 2014.12 模拟器运行时会出现此问题。