Verilog:映射内存阵列

问题描述 投票:0回答:1

我正在尝试在系统verilog中制作内存,只有当我想直接写入内存时才能合成它。

这是一个有效的代码:

module top (
        input logic clk_i,
        output logic data_o
    );

    reg [31:0] counter  = '0;

    (* ram_style="block" *)
    reg [31:0] video_ram_array [0:(2**15)-1];

    always_ff @(posedge clk_i) begin
        counter <= counter + 1;
        // video_ram_array[counter] <= counter;
        video_ram_array[counter] <= 32'h1234;
    end


    always_comb begin
        data_o = video_ram_array[counter][0];
    end

endmodule

这是行不通的:

module top (
        input logic clk_i,
        output logic data_o
    );

    reg [31:0] counter  = '0;

    (* ram_style="block" *)
    reg [31:0] video_ram_array [0:(2**15)-1];

    always_ff @(posedge clk_i) begin
        counter <= counter + 1;
        video_ram_array[counter] <= counter;
        // video_ram_array[counter] <= 32'h1234;
    end


    always_comb begin
        data_o = video_ram_array[counter][0];
    end

endmodule

这可能是一个菜鸟错误,但我不确定我做错了什么。秒代码块中的错误是:

2.8. Executing MEMORY_LIBMAP pass (mapping memories to cells).
<suppressed ~2 debug messages>
ERROR: no valid mapping found for memory top.video_ram_array
make: *** [run] Error 1

我正在使用 Yosys 进行合成。

verilog system-verilog fpga yosys
1个回答
0
投票

第一个设计可能不会推断 BRAM,因为您将每个元素设置为相同的硬模式。那不是公羊,它是一个常数。综合足够智能,可以将其优化为常数。

如果您要求的内存多于目标部分的内存,第二个可能无法推断内存。看起来您要求 32K*4 = 128K 字节 = 1024K 位。尝试将尺寸减小到更小,以测试这是否是问题所在:

reg [31:0] video_ram_array [0:(2**4)-1];

© www.soinside.com 2019 - 2024. All rights reserved.