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

时间:2013-08-02 01:08:34

标签: 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

for (int i = 0; i < 4; i++) begin
  `set_value(i);
end

错误是它试图找到信号abc_i_def,这显然是错误的。只是想知道是否可以将变量'i'的实际值传递给宏。

2 个答案:

答案 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语句。或者你可以使用嵌入式路线。

概念是相同的,只是用于转换的嵌入式语言和工具的差异。