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 LRM22.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.

你的第一个参数中的逗号在一对匹配的括号内。

顺便说一句,你不应该使用 `` 除非你试图通过在宏的主体中加入宏参数和文本来创建一个新的标识符,