System verilog SystemVerilog stringify(`quot;)运算符和换行符
我在宏中使用SystemVerilog stringify运算符,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"
`
,如下所示。该案例是故意设计的,以显示错误:
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