[英]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 合成器,它們不能接受帶有點語法的parameter
或localparam
參數賦值。
您不需要在 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.