Macros 如何在SystemVerilog中将变量值传递给宏?

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

我认为这个问题很好地概括了我想要的:在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
`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是变量,为什么不使用多维数组?ex
bit[3:0]abc_def_ghi[X_max][Y_max][Z_max]
Top tip.System verilog是一种可怕的参数化或元编程语言。我已经改用Python生成System verilog,所有参数都是硬编码的,不生成任何代码。这使生活变得简单多了。