我认为这个问题很好地总结了我想要的东西:在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'的实际值传递给宏。
答案 0 :(得分:3)
预处理程序指令由预处理程序进行评估,并修改呈现给编译器的代码。
for循环是一个由编译器评估的verilog构造。
所以你的预处理器没有评估for循环。它看到了:
`define `set_value(bit) abc_``bit``_def = 4'b0000
[some verilog]
`set_value(i);
[some verilog]
所以'我'就是我。在编译之前它不会成为数字。
为什么不使用带有生成的本地参数,所以当for循环展开时,本地参数是在详细说明的循环中创建的?
这是宏出现问题的众多地方之一。生成是其他地方的问题(例如,当您想要控制端口列表时)。
我进一步挖掘了这个。生成中的参数和局部参数是在generate的范围内创建的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
答案 1 :(得分:1)
由于您说命名约定不受您的控制,您应该考虑使用其他工具为您生成verilog。
您可以使用首选编程生成的代码,然后在verilog文件中使用`include
语句。或者你可以使用嵌入式路线。
概念是相同的,只是用于转换的嵌入式语言和工具的差异。