У меня есть этот макрос:
`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 `определить
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.
Запятая в вашем первом аргументе находится внутри совпадающей пары скобок.
Кстати, вы не должны использовать ``
, если вы не пытаетесь создать новый идентификатор, присоединив аргумент макроса к тексту в теле макроса,