Note it is not supported in verilog
link from
2 assign abc[I].clk = R.du``I``_clk_x;
assign abc(I).clk = ``R``.du``I``_clk_x;
However, the argument I shows up twice in the body of the macro; first by itself, and then surrounded by ``I``. The `` is a token separator used to build identifiers and strings. Without it, the bare argument I would disappear into an identifier duI_clk_x. You want the macro
`xyz(1,a)
to be replaced with
assign abc(1).clk = a.du1_clk_x;
3.2.1
字符串中的宏变元替换(Macro argument substitution within strings)Verilog 的`define宏定义中可以用( ” ),则引号中的文字变成了文字型字符串。
这就意味着,Verilog不能建立含有宏变元的字符串。
如下例所示,不能按原本意愿展开。
`define print(v)
$display("variable v = %h", v)
`print(data);
该例中,将`print(data);展开,则为,$display(“variable v = %h”, data);。原本的意愿是,将宏定义中所有的‘v’都变成‘data’,但是,包含在双引号里的v并没有发生变化,所以在Verilog语言中不能实现以上的功能。
SystemVerilog中能够实现宏变元的替换。应用重音符( ` )。
举例:
`define print(v)
$display(`"variable v = %h`", v)
`print(data);
$display(“variable data = %h”, data);。
Verilog中,若要在字符串中加入引号(单引号或双引号),则需在引号前加上字符“”。举例:$display("variable "data" = %h", data);
当字符串中含宏变元时,只用"是不够的,则需要用`\`"。举例如下:
`define print(v)
$display(‘"variable ‘‘"v‘‘" = %h‘", v)
`print(data);
则宏展开为:
$display("variable "data" = %h", data);
3.2.2通过宏建立标识符名(Constructing identifier names from macros)SystemVerilog中可以通过( `` )将两个或更多的名字连接在一起形成新的名字。注意,重音符间无空格。