我正在尝试在系统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 进行合成。
第一个设计可能不会推断 BRAM,因为您将每个元素设置为相同的硬模式。那不是公羊,它是一个常数。综合足够智能,可以将其优化为常数。
如果您要求的内存多于目标部分的内存,第二个可能无法推断内存。看起来您要求 32K*4 = 128K 字节 = 1024K 位。尝试将尺寸减小到更小,以测试这是否是问题所在:
reg [31:0] video_ram_array [0:(2**4)-1];