如何从带参数的预处理器宏创建字符串

问题描述 投票:0回答:4

我正在尝试在 System Verilog 中对宏进行字符串化,以便我可以在字符串中使用它进行打印。

我创建了一个 STRINGIFY 宏:

`define STRINGIFY(x) `"x`"

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

但是,我尝试字符串化的宏需要参数。

考虑以下代码:

`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

编辑: 问题是当宏内部有参数时,`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

macros verilog system-verilog stringification
4个回答
0
投票

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

宏文本中允许混合使用`"和",但是使用"总是开始一个字符串文字并且必须有一个终止"。嵌入此字符串文字中的任何字符,包括“,”开始一个字符串文字,其最后一个字符由“的”终止。

`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

希望您理解 `" 和 " 的上下文(或只是一个宏定义)


0
投票

我不同意你在 EDA 游乐场上得到的输出。我使用 ModelSim/Questa 获得了所需的输出。无论宏参数文本在通过外层宏传递的before还是after(LRM说after)扩展的位置,“”都应该允许扩展所传递的宏。


0
投票

这似乎是 VCS 问题。

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

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


0
投票

我不知道 VCS 何时引入此功能,但您可以使用以下选项强制 VCS 兼容 LRM。

-p1800_macro_expansion

This option is used for LRM compliance to support macro
expansion. This option produces results that are more LRM-
compliant and accurate especially for SystemVerilog macros.
© www.soinside.com 2019 - 2024. All rights reserved.