基本的な 16 ビットの教育用 CPU 用のメモリ システムを作成していますが、モジュールの Quartus 合成で問題が発生しています。具体的には、アドレス空間をいくつかの異なる部分に分割しましたが、そのうちの 1 つ (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 のアドレスを定義する 2 つのマクロ、つまり「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 は、私が ROM コード (つまり、printROM.hex) として指定した .hex ファイルを変換し、生成された .mif ファイルに CPU 可視アドレス (つまり、'hEB00 で始まる) を使用しているように見えますが、ROM のサイズが明らかに大きすぎます。小さな。Quartus はこの構文をサポートしていませんか、それとも間違っていますか?