【问题标题】:How to create a string from a pre-processor macro with arguments如何从带有参数的预处理器宏创建字符串
【发布时间】:2015-09-16 09:57:34
【问题描述】:

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

我创建了一个 STRINGIFY 宏:

`define STRINGIFY(x) `"x`"

这里建议: How to create a string from a pre-processor macro

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

考虑以下代码:

`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


    【解决方案1】:

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

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

    `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

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

    【讨论】:

    • 好吧,我还是想用 HPATH 宏作为分层路径(不带引号)。由于我缩小了问题范围,我将修改我的问题。
    【解决方案2】:

    我不同意您在 EDA 操场上获得的输出。我正在使用 ModelSim/Questa 获得所需的输出。无论宏参数文本在 beforeafter 通过外层宏(LRM 说 after)进行扩展,`" 都应该已允许展开所传递的宏。

    【讨论】:

    • 是的,当使用 VCS 2014 和旧版本的 Icarus Verilog 模拟器运行时,EDA Playground 中会出现该问题。
    【解决方案3】:

    这似乎是一个 VCS 问题。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-14
      • 2017-09-18
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      相关资源
      最近更新 更多