繁体   English   中英

在循环生成块中计算参数

[英]Calculating a parameter in a loop generate block

我有一个参数数组WIDTHS ,我需要根据generate块中WIDTHS中的一些值来计算另一个参数RIGHT 这可能吗? 如果没有,还有其他方法吗?

这是我正在尝试做的一个例子。 假设我们有一个预定义的寄存器模块REG ,它具有输入d, q, we (write enable), CLK and _RESET 我想创建一个名为GroupReg的新模块,该模块实例化REG N实例。 每个实例具有不同的宽度(因此WIDTH参数数组)。 每个组的d, q, and we聚集在GroupReg具有相同名称的数组中,并且需要为每个实例指定。 因为我们只有一位,所以指定we很容易( we[i] )。 但是,用正确的LEFTRIGHT值指定dq是我遇到的问题,因为每个组的宽度不同。

看起来,给参数赋值的唯一方法是根据其定义,这会阻止在生成循环中为其赋值。

 module GroupReg(d, q, we, CLK, _RESET);
 parameter N = 4;               //Number of groups
 //INDICES has to have N+1 members. Last member should be 0
 parameter integer WIDTHS   [N:0]  = {40, 30, 20, 10, 0}; 
 parameter integer DW_TOTAL  = 128;

 input  logic [DW_TOTAL-1:0]        d;                  // Data Input
 input  logic [N-1:0]               we;                     // write enable
 input  logic                       CLK;                // Clock Input
 input  logic                       _RESET;           // Reset input (active low)
 output logic [DW_TOTAL-1:0]        q;            // Q output

 genvar i, j;
 for (i=N-1 ; i>=0 ; i--) begin:REGISTERS

  localparam WIDTH = WIDTHS[i];
  localparam LEFT  = RIGHT +  WIDTHS[i];;
  localparam RIGHT = 0;

  for (j = 0 ; j<i ; j++)        // <<----- Does not work
    RIGHT = RIGHT + WIDTH[j];  

  REG #(
             .DW              (WIDTH),
             ) 
  reg_i 
  ( 
   .d(d[LEFT:RIGHT]), 
   .q(q[LEFT:RIGHT]),
   .we(we[i]),
   .CLK(CLK),
  ._RESET(_RESET)  
  );
 end : REGISTERS
endmodule  

我尝试在WIDTHS上使用sum()数组归约方法,并在Aldec Riviera PRO中起作用:

module some_module;
  parameter N = 4;               //Number of groups
  parameter integer WIDTHS   [N:0]  = '{40, 30, 20, 10, 0};

  parameter integer DW_TOTAL  = WIDTHS.sum();

  initial begin
    $display("DW_TOTAL", DW_TOTAL);
  end
endmodule

如果您很幸运,它也将在您的模拟器中工作。

无论如何,我实际上并没有真正理解将N用作参数的方法,这是因为您无论如何都在硬编码固定数量的宽度值。

这适用于Modelsim:

module some_module;
  parameter N = 4;               //Number of groups
  parameter integer WIDTHS   [N:0]  = '{40, 30, 20, 10, 0};


  genvar i;
  for (i=N-1 ; i>=0 ; i--) begin
    localparam integer FOO[i:0] = WIDTHS[i:0];
    //localparam RIGHT = FOO.sum();

    initial begin
      foreach (FOO[i])
        $display("FOO[%0d] = %h", i, FOO[i]);
    end
  end
endmodule

FOO参数将仅存储来自WIDTH的特定循环迭代的相关条目。 如果sum()可行,那么您将有空的家。 但是,切片语法在Riviera中不起作用。

这是供应商不同解释该标准的典型示例,基本上是因为它不够具体。 不过,如果您使用其他EDA公司的模拟器,请尝试将两个答案结合起来; 也许您很幸运,而且效果很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM