预处理器指令由预处理器评估并修改呈现给编译器的代码。
for 循环是由编译器评估的 verilog 构造。
所以你的预处理器没有评估 for 循环。它看到:
`define `set_value(bit) abc_``bit``_def = 4'b0000
[some verilog]
`set_value(i);
[some verilog]
所以“我”就是我。在编译之前它不会成为一个数字。
为什么不将本地参数与 generate 一起使用,以便在展开 for 循环时在一个循环中创建本地参数?
这是宏成为问题的众多地方之一。生成在其他地方是个问题(比如当你想控制端口列表时)。
我对此进行了更多研究。generate 内部的参数和本地参数是在 generate 范围内创建的 localparams。请参见此处:生成块中的系统 Verilog 参数。我必须回去工作才能测试它。
我只会使用代码并填充一个数组。这在 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