我认为这个问题很好地概括了我想要的:将变量的值传递给 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]
所以“我”只是我。在编译之前它不会变成一个数字。
为什么不将本地参数与生成一起使用,以便在展开 for 循环时在详细说明的循环中创建本地参数?
这是宏存在问题的众多地方之一。生成在其他地方是一个问题(例如当您想要控制端口列表时)。
我对此进行了更多研究。生成中的参数和本地参数在生成范围内创建为 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)