我正在为一个基本的 16 位教育 CPU 编写一个内存系统,并且我的模块的 Quartus Synthesis 遇到了问题。具体来说,我已将地址空间分解为几个不同的部分,其中一个(即 ROM)没有正确合成。(注意:我正在为 DE2-115 Altera 板、QuartusII 12.1、SystermVerilog 代码进行综合)
因此,为了使内存映射的 VRAM(一种双端口内存模块,在 CPU 写入颜色时允许 VGA 输出)更有用,我在地址空间中包含了一个小 ROM,其中包含代码(汇编函数)允许您将字符写入内存,即 print_char 函数。这个 ROM 位于特定地址的内存中,所以为了简化 SV,我实现了 ROM(和所有内存模块),如下所示:
module printROM
(input rd_cond_code_t re_L,
input wr_cond_code_t we_L,
input logic [15:0] memAddr,
input logic clock,
input logic reset_L,
inout wire [15:0] memBus,
output mem_status_t memStatus);
reg [15:0] rom[`VROM_ADDR_LO:`VROM_ADDR_HI];
reg [15:0] dataOut;
/* The ROM */
always @(posedge clock) begin
if (re_L == MEM_RD) begin
dataOut <= rom[memAddr];
end
end
/* Load the rom data */
initial $readmemh("printROM.hex", rom);
/* Drive the line */
tridrive #(.WIDTH(16)) romOut(.data(dataOut),
.bus(memBus),
.en_L(re_L));
/* Manage asserting completion of a read or a write */
always_ff @(posedge clock, negedge reset_L) begin
if (~reset_L) begin
memStatus <= MEM_NOT_DONE;
end
else begin
if ((we_L == MEM_WR) | (re_L == MEM_RD)) begin
memStatus <= MEM_DONE;
end
else begin
memStatus <= MEM_NOT_DONE;
end
end
end
endmodule // printROM
其中VROM_ADDR_LO和VROM_ADDR_HI是定义这个ROM地址的两个宏,分别是'hEB00和'hEFFF。因此,当 CPU 读取/写入该范围内的地址时,该模块能够正确索引到 rom 内存。该技术在 VCS 仿真中运行良好。
然而,当我去合成这个模块时,Quartus 正确地暗示了一个 ROM,但在初始化它时遇到了问题。我收到此错误:
Error (113012): Address at line 11 exceeds the specified depth (1280) in the Memory Initialization File "psx18240.ram0_printROM_38938673.hdl.mif"
看起来 Quartus 正在将我提供的 .hex 文件转换为 ROM 代码(即 printROM.hex)并使用生成的 .mif 文件的 CPU 可见地址(即从 'hEB00 开始),即使 rom 的大小显然也是如此小的。Quartus 不支持这种语法还是我做错了什么?