Macros 如何在SystemVerilog中将变量值传递给宏?
我认为这个问题很好地概括了我想要的:在SystemVerilog中将变量的值传递给宏 例如,我想要的: 比如说,有4个名为abc_X_def的信号,我想将它们全部初始化为0。 因此,如果没有宏:Macros 如何在SystemVerilog中将变量值传递给宏?,macros,system-verilog,Macros,System Verilog,我认为这个问题很好地概括了我想要的:在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 f
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
`define set_value(bit)abc_``bit``def=4'b0000
对于(int i=0;i<4;i++)开始
`设定_值(i);
结束
错误在于它试图找到明显错误的信号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循环时,在细化时在循环中创建局部参数
这是宏存在问题的众多地方之一。在其他地方生成是一个问题(例如,当您想要控制端口列表时)
我更深入地研究了一下。generate中的参数和本地参数是在generate的作用域中通过localparams创建的。请参见此处:。我必须回去工作才能测试它 我只需要使用代码并填充一个数组。这在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
模块验证
#(
参数MAX_X=5,
最大值Y=3,
MAX_Z=2
)
(); // 空端口列表
逻辑[4:0]abc_def[1:MAX_X][1:MAX_Y][1:MAX_Z];
始终@*
开始
对于(整数z=1;z<p>),因为你说命名约定超出了你的控制范围,你应该考虑使用另一个工具为你生成Verilog。
您可以通过首选编程生成代码,然后在verilog文件中使用`include
语句。也可以使用嵌入式路由
- Perl拥有EP3:
- Ruby有以下优点:
- 我相信其他语言也有类似的功能,比如Python、Tcl、JavaScript等等
概念是一样的,只是嵌入式语言和用于转换的工具有所不同。有关如何使用宏元编程实现“a”的等效功能,请参见第18页的此处。我认为这很可怕,但事实就是这样:谢谢David。我至少理解了宏为什么不能为我工作。你能举个例子来说明你的意思吗我不想说localparam和generate语句吗?对不起,我对System Verilog相当陌生。另外,关于您发布的文档,很高兴知道并准确地知道我想要做什么,但我不能使用它,因为我打算将它用于比我在问题中提到的更多的位,以及更多的变量,如abc_X_def_Y_ghi_Z,其中X、Y和Z是不同大小的变量。因此,硬编码限制将是一种过度。@user2644151如果X、Y、Z是变量,为什么不使用多维数组?exbit[3:0]abc_def_ghi[X_max][Y_max][Z_max]
Top tip.System verilog是一种可怕的参数化或元编程语言。我已经改用Python生成System verilog,所有参数都是硬编码的,不生成任何代码。这使生活变得简单多了。