我认为这个问题很好地概括了我想要的:将变量的值传递给SystemVerilog中的宏。

例如,我想要的是:
说,有4个信号名为abc_X_def,我想将它们全部初始化为0。
因此,没有宏:

abc_0_def = 4'b0000;
abc_1_def = 4'b0000;
abc_2_def = 4'b0000;
abc_3_def = 4'b0000;


现在,我编写的代码有问题:

`define set_value(bit) abc_``bit``_def = 4'b0000

for (int i = 0; i < 4; i++) begin
  `set_value(i);
end


错误是它正在尝试查找信号abc_i_def,这显然是错误的。只是想知道是否可以将变量“ i”的实际值传递给宏。

最佳答案

预处理器指令由预处理器评估,并修改提供给编译器的代码。

for循环是由编译器评估的verilog构造。

因此,您的预处理器不会评估for循环。它看到:

`define `set_value(bit) abc_``bit``_def = 4'b0000

[some verilog]
   `set_value(i);
[some verilog]


所以“我”就是我。直到编译它才成为数字。

您为什么不将本地参数与generate一起使用,以便在展开for循环时精心制作循环中创建本地参数?

这是宏有问题的许多地方之一。在其他地方(例如,当您要控制端口列表时),生成是一个问题。



我对此进行了更多研究。生成内部的参数和局部参数在生成范围内创建一个localparams。参见此处:System Verilog parameters in generate block。我必须重新上班才能进行测试。

我只是使用代码并填充数组。这将在VCS中编译:

module veritest
    #(
    parameter   MAX_X = 5,
                MAX_Y = 3,
                MAX_Z = 2
    )
    (); // empty port list

logic [4:0] abc_def[1:MAX_X][1:MAX_Y][1:MAX_Z];

always @*
begin
for (integer z=1; z<(MAX_X+1);z=z+1)
   for (integer y=1; y<(MAX_Y+1);y=y+1)
       for (integer x=1; x<(MAX_X+1);x=x+1)
       begin
            abc_def[x][y][z] = 4'b0000;
       end
end
endmodule

09-03 23:18