使用参数数组生成模块
Using an array of parameters to generate modules
我有一个 module
存储不同字符的位图,我打算用它在矩阵上显示文本。目前,位图填充了一个内存初始化文件,这个文件作为 parameter
传入(我已经确认这在 Quartus 和 ModelSim 中有效)。
为了实际查找所有字符 table,我想制作一个单独的 module
,其中包含所有位图的实例化,并根据字符选择正确的位图代码。这些位图实例是在 generate
块中创建的,它们从数组中获取正确的文件名。然而,ModelSim 不喜欢这样。我的代码如下:
module mem_char_disp_lib(
output logic pixel,
input logic [4:0] x,
input logic [5:0] y,
input logic [6:0] code,
input logic clk
);
localparam CHAR_NUM = 26;
logic [CHAR_NUM-1:0] alphabet;
const var [CHAR_NUM-1:0] BITMAPS = {
"/mem/char/A.hex",
"/mem/char/B.hex",
"/mem/char/C.hex",
// ... a lot more declarations here...
"/mem/char/X.hex",
"/mem/char/Y.hex",
"/mem/char/Z.hex"
};
genvar i;
generate
for (i=0; i<CHAR_NUM; i=i+1) begin : mem_char_disp_blocks
mem_char_disp #(.BITMAP(BITMAPS[i])) block (
.pixel(alphabet[i]),
.x, .y, .clk,
.code(i),
.data(1'b0),
.write_en(1'b0)
);
end
endgenerate
always_comb
pixel = alphabet[code];
endmodule
ModelSim 给我的错误是:
The expression for a parameter actual associated with the parameter name ('BITMAP') for the module instance ('block') must be constant.
(指的是 for
循环内的那一行)
我不确定为什么这不起作用。在硬件层面上,似乎我只是制作了一个模块的大量副本,并使用编译时已知的常量参数对每个模块进行了微调。是否缺少一些基本语法?
编辑: 我也试过下面的代码,似乎会出现运行时错误:
for (i=0; i<CHAR_NUM; i=i+1) begin : mem_char_disp_blocks
parameter [CHAR_NUM-1:0] BITMAPS = {
"/mem/char/A.hex",
// more elements...
"/mem/char/Z.hex"
};
mem_char_disp #(.BITMAP(BITMAPS[i])) block (
.pixel(alphabet[i]),
.x, .y, .clk,
.code(i),
.data(1'b0),
.write_en(1'b0) );
end
错误是 Module parameter 'BITMAP' not found for override.
(每个生成的模块都有一个错误;总计 CHAR_NUM
。)这对我来说没有意义,因为直接实例化一个模块就可以了很好(例如 mem_char_disp #(.BITMAP("/mem/char/A.hex") block /* ... */
)。
const
变量不是常量 - 它是一个一次性写入变量,在分配变量时在运行时初始化。您需要给我们一个 parameter
或 localparam
来分配给您在更新中发现的另一个参数。您还需要修复数组的维度
parameter bit [1:15*8] BITMAPS[26] = {
"/mem/char/A.hex", // 15 8-bit chars
// more elements...
"/mem/char/Z.hex" // 26 elements
};
在没有看到模块声明的情况下无法帮助您解决上一个错误mem_char_disp
我有一个 module
存储不同字符的位图,我打算用它在矩阵上显示文本。目前,位图填充了一个内存初始化文件,这个文件作为 parameter
传入(我已经确认这在 Quartus 和 ModelSim 中有效)。
为了实际查找所有字符 table,我想制作一个单独的 module
,其中包含所有位图的实例化,并根据字符选择正确的位图代码。这些位图实例是在 generate
块中创建的,它们从数组中获取正确的文件名。然而,ModelSim 不喜欢这样。我的代码如下:
module mem_char_disp_lib(
output logic pixel,
input logic [4:0] x,
input logic [5:0] y,
input logic [6:0] code,
input logic clk
);
localparam CHAR_NUM = 26;
logic [CHAR_NUM-1:0] alphabet;
const var [CHAR_NUM-1:0] BITMAPS = {
"/mem/char/A.hex",
"/mem/char/B.hex",
"/mem/char/C.hex",
// ... a lot more declarations here...
"/mem/char/X.hex",
"/mem/char/Y.hex",
"/mem/char/Z.hex"
};
genvar i;
generate
for (i=0; i<CHAR_NUM; i=i+1) begin : mem_char_disp_blocks
mem_char_disp #(.BITMAP(BITMAPS[i])) block (
.pixel(alphabet[i]),
.x, .y, .clk,
.code(i),
.data(1'b0),
.write_en(1'b0)
);
end
endgenerate
always_comb
pixel = alphabet[code];
endmodule
ModelSim 给我的错误是:
The expression for a parameter actual associated with the parameter name ('BITMAP') for the module instance ('block') must be constant.
(指的是 for
循环内的那一行)
我不确定为什么这不起作用。在硬件层面上,似乎我只是制作了一个模块的大量副本,并使用编译时已知的常量参数对每个模块进行了微调。是否缺少一些基本语法?
编辑: 我也试过下面的代码,似乎会出现运行时错误:
for (i=0; i<CHAR_NUM; i=i+1) begin : mem_char_disp_blocks
parameter [CHAR_NUM-1:0] BITMAPS = {
"/mem/char/A.hex",
// more elements...
"/mem/char/Z.hex"
};
mem_char_disp #(.BITMAP(BITMAPS[i])) block (
.pixel(alphabet[i]),
.x, .y, .clk,
.code(i),
.data(1'b0),
.write_en(1'b0) );
end
错误是 Module parameter 'BITMAP' not found for override.
(每个生成的模块都有一个错误;总计 CHAR_NUM
。)这对我来说没有意义,因为直接实例化一个模块就可以了很好(例如 mem_char_disp #(.BITMAP("/mem/char/A.hex") block /* ... */
)。
const
变量不是常量 - 它是一个一次性写入变量,在分配变量时在运行时初始化。您需要给我们一个 parameter
或 localparam
来分配给您在更新中发现的另一个参数。您还需要修复数组的维度
parameter bit [1:15*8] BITMAPS[26] = {
"/mem/char/A.hex", // 15 8-bit chars
// more elements...
"/mem/char/Z.hex" // 26 elements
};
在没有看到模块声明的情况下无法帮助您解决上一个错误mem_char_disp