System verilog SystemVerilog stringify(`quot;)运算符和换行符

System verilog SystemVerilog stringify(`quot;)运算符和换行符,system-verilog,active-hdl,System Verilog,Active Hdl,我在宏中使用SystemVerilog stringify运算符,`,如下所示。该案例是故意设计的,以显示错误: module my_test(); `define print(x) $fwrite(log_file, `"x`") `define println(x) $fwrite(log_file, `"x\n`") integer log_file; initial begin log_file = $fopen("result.txt"

我在宏中使用SystemVerilog stringify运算符,
`
,如下所示。该案例是故意设计的,以显示错误:

module my_test();
    `define print(x) $fwrite(log_file, `"x`")
    `define println(x) $fwrite(log_file, `"x\n`")
    integer log_file;

    initial begin
        log_file = $fopen("result.txt", "w");
        `print(A);
        `print(B);
        `println(C);
        `println(D);
        `print(E);
        `print(F);
    end
endmodule
这将给出输出(无尾随换行):

为什么输出中有
`
s,而只来自
println


这是规范中记录的行为,还是我的模拟器(Aldec Active HDL)中的错误?

这是您工具中的错误。但是,第二个
`
是不需要的,它会提供您正在查找的结果

这是您的工具中的一个bug。但是,第二个
是不需要的,它提供了您想要的结果。

您能给我一个解释,说明为什么第二个“``是不必要的吗?最好是SPECT中的一页。在LRM中提到的1315页中,只有一页`“它提到了混合。我有点震惊,这种描述是多么模糊——它说宏文本可以使用混合,而不是说字符串文字可以以一个开头,以另一个结尾。它确实会特意说,如果以未转义的双引号开始,最后一个引号永远无法转义,因为后勾号将被视为字符串文字的一部分,而不是转义字符。因此,唯一允许的混合是以转义开头-“以简单结尾”。这可能不够严格。这可能只是意味着允许使用“``define macro{
”foo
”,“bar”}`。这也是一种混合。你能帮我解释一下为什么第二个“``是不必要的吗?最好是在SPECT中有一页。在LRM的1315页中,只有一页提到了“混合”。我有点震惊,这种描述是多么模糊——它说宏文本可以使用混合,并不是说字符串文字可以以一个开头,以另一个结尾,而是说如果你以未转义的双引号开头,最后的引号就永远不能转义,因为反勾号将被视为字符串文字的一部分,而不是转义字符。因此,唯一允许的混合是以转义开头-“以简单结尾”。这可能不够严格。这可能只是意味着允许使用“``define macro{
”foo
”,“bar”}`。那也是一种混合物。
ABC
`D
`EF