SystemVerilog 编译器如何知道在宏中分隔两个参数?
How does SystemVerilog compiler knows to separate two arguments in a macro?
我有这个宏:
`define do_code(DO_SOETHING, ID) \
fork \
begin \
``DO_SOMETHING`` \
end \
begin \
$display("%s",ID.name()); \
end \
join_any \
disable fork; \
我这样使用它:
`do_code($display("%s",argA.name()), argB)
编译器如何知道正确分隔两个宏的输入参数:
DO_SOMETHING = $display("%s",argA.name())
ID = argB
为什么不把它分解成:
DO_SOMETHING = $display("%s"
ID = argA.name()), argB
???
编译器知道,因为 IEEE 1800-2017 SystemVerilog LRM
在 22.5.1 节中说 `define
Actual arguments and defaults shall not contain comma or
right parenthesis characters outside matched pairs of left and right parentheses (), square brackets [],
braces {}, double quotes "", or an escaped identifier.
你的第一个参数中的逗号在一对匹配的括号内。
顺便说一句,你不应该使用 ``
除非你试图通过在宏的主体中加入宏参数和文本来创建一个新的标识符,
我有这个宏:
`define do_code(DO_SOETHING, ID) \
fork \
begin \
``DO_SOMETHING`` \
end \
begin \
$display("%s",ID.name()); \
end \
join_any \
disable fork; \
我这样使用它:
`do_code($display("%s",argA.name()), argB)
编译器如何知道正确分隔两个宏的输入参数:
DO_SOMETHING = $display("%s",argA.name())
ID = argB
为什么不把它分解成:
DO_SOMETHING = $display("%s"
ID = argA.name()), argB
???
编译器知道,因为 IEEE 1800-2017 SystemVerilog LRM 在 22.5.1 节中说 `define
Actual arguments and defaults shall not contain comma or right parenthesis characters outside matched pairs of left and right parentheses (), square brackets [], braces {}, double quotes "", or an escaped identifier.
你的第一个参数中的逗号在一对匹配的括号内。
顺便说一句,你不应该使用 ``
除非你试图通过在宏的主体中加入宏参数和文本来创建一个新的标识符,