使用参数数组生成模块

时间:2016-10-27 18:20:36

标签: verilog system-verilog

我有一个module,它存储了一个不同字符的位图,我打算用它来显示矩阵上的文本。目前,位图填充了一个内存初始化文件,该文件作为parameter传入(我已经确认这在Quartus和ModelSim中有效)。

为了实际拥有所有字符的查找表,我想制作一个单独的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 /* ... */)。

1 个答案:

答案 0 :(得分:2)

const变量不是常量 - 它是一次写入变量,在变量分配时在运行时初始化。您需要我们parameterlocalparam分配您在更新中发现的其他参数。您还需要修复数组的尺寸

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

的声明,就无法帮助您解决上一个错误