簡體   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