4

我认为这个问题很好地总结了我想要的:将变量的值传递给 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”的实际值传递给宏。

4

2 回答 2

3

预处理器指令由预处理器评估并修改呈现给编译器的代码。

for 循环是由编译器评估的 verilog 构造。

所以你的预处理器没有评估 for 循环。它看到:

`define `set_value(bit) abc_``bit``_def = 4'b0000

[some verilog]
   `set_value(i);
[some verilog]

所以“我”就是我。在编译之前它不会成为一个数字。

为什么不将本地参数与 generate 一起使用,以便在展开 for 循环时在一个循环中创建本地参数?

这是宏成为问题的众多地方之一。生成在其他地方是个问题(比如当你想控制端口列表时)。


我对此进行了更多研究。generate 内部的参数和本地参数是在 generate 范围内创建的 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  
于 2013-08-02T01:25:41.647 回答
1

既然你说命名约定是你无法控制的,你应该考虑使用另一个工具来为你生成verilog。

你可以让你喜欢的程序生成代码,然后`include在你的verilog文件中使用一个语句。或者您可以使用嵌入式路线。

概念是一样的,只是嵌入式语言和用于转换的工具不同而已。

于 2013-08-02T20:47:47.390 回答