【问题标题】:Verilog, How to pass different parameters when I use generate to instantiation module?Verilog,当我使用生成到实例化模块时如何传递不同的参数?
【发布时间】:2018-03-04 03:41:54
【问题描述】:

我有一个关于参数传递的问题。我使用 generate 来进行模块实例化。但是如何将不同的参数传递给每个模块呢? 例如:

generate
   for (i=0;i<N;i=i+1) begin:ModIns
       Mod #(.p1(?),.p2(?)) M (
       // Signal connection
       );
   end
endgenerate

对于 N 个模块,每个模块都有不同的 p1 和 p2。怎么做?对了,参数数量很大,可以把参数作为文件传吗? 谢谢!

【问题讨论】:

    标签: parameter-passing verilog generate


    【解决方案1】:

    这是我的 2 美分。 声明一个二维寄存器并将所有参数存储在那里。

    reg [31:0] param_mem1 [N-1:0]; //Assuming parameter size to be 32 bit wide
    reg [31:0] param_mem2 [N-1:0];
    
    always@(posedge clk)
    begin
     for(i=0;i<N;i=i+1)
     begin
       param_mem1[i] <= i; //Here replace 'i' with your actual parameter value
       param_mem2[i] <= i+1; //Dummy assignment, please use intended values
     end
    end
    
    generate
     for (i=0;i<N;i=i+1) begin:ModIns
       Mod #(.p1(param_mem1[i]),.p2(param_mem2[i])) M (
       // Signal connection
       );
    end
    endgenerate
    

    【讨论】:

      【解决方案2】:

      首先:不,您不能从文件中读取它。参数必须在编译时知道,并且文件只能在运行时读取。

      您可以从 genvar 派生它们或通过层次结构传递它们,但它或多或少会停止。也许您尝试做的事情可以通过不同的方式解决,但是您在这里为我们概述的问题的范围是有限的。

      一如既往:告诉我们您的问题,而不是您的解决方案。

      【讨论】:

      • 实际上,我需要构建数百甚至数千个模块,仅具有不同的参数,如长度、宽度、重量等。我不想将它们作为输入,因为会有太多.有没有更好的办法?
      • 不,您所说的听起来像是图书馆。您可以制作一个 Perl 或 C 程序来生成源代码。这就是通常用于生成库的内容。
      【解决方案3】:

      在 SystemVerilog 中执行此操作会更容易,因为参数可以是数组,并且您的生成循环可以为循环的每次迭代选择一个元素。 在 Verilog 中,您可以将元素打包到位向量中,并且您的生成循环可以为循环的每次迭代选择一个切片。

      parameter A1={8'd1, 8'd2, 8'd3, 8'd4, ...};
      parameter A2={8'd9, 8'd8, 8'd7, 8'd6, ...};
      generate
         for (i=0;i<N;i=i+1) begin:ModIns
             Mod #(.p1(A1[i*8+:8),.p2(A2[i*8+:8])) M (
             // Signal connection
             );
         end
      endgenerate
      

      如果你想从一个文件中定义参数,你可以把参数声明放在一个单独的文件中,`include这个文件。

      【讨论】:

      • 在 Verilog 中,我不能对参数进行位选择。如果我将它们打包成一个位向量,我是否需要将它们视为输入?
      【解决方案4】:

      这用 VCS 编译:

      genvar port_idx;
      generate
      for (port_idx = 0; port_idx < 5; port_idx++) begin : intf
          xactor_t xactor (core_clk, core_rst);
          defparam xactor.intf_id = 18 + port_idx;
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多