1

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

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

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

4

4 回答 4

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
于 2021-09-29T04:35:55.057 回答
0

第一:不,你不能从文件中读取它。参数必须在编译时知道,文件只能在运行时读取。

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

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

于 2018-03-04T10:23:50.093 回答
0

在 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的文件和文件中。

于 2018-03-04T15:30:05.170 回答
0

这与 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
于 2021-09-29T03:53:59.377 回答