簡體   English   中英

如何在生成塊中定義參數並在外部訪問它們?

[英]How to define parameters in a generate block and access them outside?

我想定義一些局部參數,其值由在該模塊外部分配的參數決定。 在這里,我使用了一個生成塊。 就像下面這樣:

module doppler_fft_cluster # (
  parameter CORE_TYPE = "DOPPLER_FFT_D0"
) (
  clk, rst_,
  i_tvalid, i_tdata, i_tready, i_tlast
  // and more ports
);

input clk;
input rst_;

generate
  case (CORE_TYPE)
    "DOPPLER_FFT_D0": begin
      localparam FFT_XN_DATA_WIDTH = 42;
      localparam FFT_XK_DATA_WIDTH = 66;
      localparam FFT_LENGTH = 2048;
    end
    "DOPPLER_FFT_D1": begin
      localparam FFT_XN_DATA_WIDTH = 64;
      localparam FFT_XK_DATA_WIDTH = 66;
      localparam FFT_LENGTH = 512;
    end
  endcase
endgenerate

input  i_tvalid;
input  i_tdata;
output i_tready;
input  i_tlast;
input  [FFT_XN_DATA_WIDTH-1:0] i_tdata;  // Boom!

// ... ...

endmodule

我曾嘗試使用 ModelSim 模擬此模塊,但它說那些局部參數未定義。

Error: ./demo.v(31): (vlog-2730) Undefined variable: 'FFT_XN_DATA_WIDTH'.

好像這個localparams不能進入module-level scope。

那么,如何在模塊級別下訪問它們呢? 或者,還有其他方法可以實現這樣的功能嗎?

更新 0616

我最終選擇了 Ehab Ibrahim 的方法,因為我的項目需要 Xilinx ISE 或 XST 合成器,它們不能接受帶有點語法的parameterlocalparam參數賦值。

您不需要在 generate 語句中定義局部參數。 有幾種方法可以實現 go,您可以像這樣以 if-else 方式定義本地參數:

localparam FFT_XN_DATA_WIDTH = (CORE_TYPE=="DOPPLER_FFT_DO") ? 42 
                             : (CORE_TYPE=="DOPPLER_FFT_D1") ? 64
                             : 24;     // Equivalent to case "default"
localparam FFT_XK_DATA_WIDTH = (CORE_TYPE=="DOPPLER_FFT_DO") ? 66 
                             : (CORE_TYPE=="DOPPLER_FFT_D1") ? 66
                             : 24;     // Equivalent to case "default"
localparam FFT_LENGTH        = (CORE_TYPE=="DOPPLER_FFT_DO") ? 2048 
                             : (CORE_TYPE=="DOPPLER_FFT_D1") ? 512
                             : 256;     // Equivalent to case "default"

或者,如果它變得太復雜,您可以定義一個實現功能的 function,並使用本地參數實例化調用 function:

function automatic int get_xn_width(input string core_type); 
    if(core_type == "DOPPLER_FFT_DO")       return 42; 
    else if(core_type == "DOPPLER_FFT_DO")  return 64; 
    else                                    return 24; 
endfunction

// Define similar functions for the other local parameters 

module doppler_fft_cluster # (
  parameter CORE_TYPE = "DOPPLER_FFT_D0"
) (
  clk, rst_,
  i_tvalid, i_tdata, i_tready, i_tlast
  // and more ports
);
    // port definitions
-------------
    localparam FFT_XN_DATA_WIDTH = get_xn_width(CORE_TYPE);
    // Same for other localparams
-------------
    // Rest of module
endmodule

錯誤的原因是您在未命名的begin/end塊中定義了localparam 您需要給它們一個名稱才能從外部訪問它們。

module doppler_fft_cluster # (
  parameter CORE_TYPE = "DOPPLER_FFT_D0"
) (
  clk, rst_,
  i_tvalid, i_tdata, i_tready, i_tlast
  // and more ports
);
case (CORE_TYPE)
    "DOPPLER_FFT_D0": begin : FFT
      localparam XN_DATA_WIDTH = 42;
      localparam XK_DATA_WIDTH = 66;
      localparam LENGTH = 2048;
    end
    "DOPPLER_FFT_D1": begin : FFT
      localparam XN_DATA_WIDTH = 64;
      localparam XK_DATA_WIDTH = 66;
      localparam LENGTH = 512;
    end
endcase
input clk;
input rst_;
input  i_tvalid;
input  i_tdata;
output i_tready;
input  i_tlast;
input  [FFT.XN_DATA_WIDTH-1:0] i_tdata;  // Boom!

  initial $display("%m FFT.LENGTH = ", FFT.LENGTH);
endmodule

module top;
  doppler_fft_cluster #()                 D0(,,,,,);
  doppler_fft_cluster #("DOPPLER_FFT_D1") D1(,,,,,);
endmodule

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM