【问题标题】:How to pass a variable value to a macro in SystemVerilog?如何将变量值传递给 SystemVerilog 中的宏?
【发布时间】:2013-08-03 03:35:34
【问题描述】:

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

【问题讨论】:

    标签: macros system-verilog


    【解决方案1】:

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

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

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

    `define `set_value(bit) abc_``bit``_def = 4'b0000
    
    [some verilog]
       `set_value(i);
    [some verilog]
    

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

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

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


    我对此进行了更多研究。 generate 内部的参数和本地参数在 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  
    

    【讨论】:

    • 请参阅第 18 页的此处了解如何执行相当于“使用宏元编程”的操作。我认为这很可怕,但事实就是这样:veripool.org/papers/Preproc_Good_Evil_SNUGBos10_paper.pdf
    • 谢谢大卫。我至少明白为什么宏不能为我工作。你能举一个例子来描述你对 localparam 和生成语句的意思吗?抱歉,我对 System Verilog 还很陌生。
    • 另外,关于你发布的那个文件,很高兴知道我想要做什么,但我不能使用它,因为我打算使用它比我拥有的更多位在我的问题中提到了更多变量,例如 abc_X_def_Y_ghi_Z 其中 X、Y 和 Z 是不同大小的变量。所以硬编码限制将是一种矫枉过正。
    • @user2644151 如果 X,Y,Z 是变量,为什么不使用多维数组呢?前bit [3:0] abc_def_ghi [X_max][Y_max][Z_max];
    • 顶级提示。系统 verilog 是一种用于参数或元编程的可怕、可怕的语言。我已经切换到使用 Python 来生成系统 verilog,所有参数都是硬编码的,没有生成。这让生活变得简单多了。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多