我试图在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
答案 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 模拟器运行时会出现此问题。