我有以下双端口RAM内存的硬件描述:
module MemoryRAM #(parameter RAM_ADDR_BITS = 4, RAM_WIDTH = 8)
(CLK, RAMEnableLSB, RAMEnableMSB, WriteMemory,LoadData, Address, OutputRAMMEM);
input RAMEnableLSB, RAMEnableMSB ,WriteMemory;
input CLK;
reg [RAM_WIDTH-1:0] RAM1 [(2**RAM_ADDR_BITS)-1:0];
reg [RAM_WIDTH-1:0] OutputData1 = 0,OutputData0 = 0;
input [RAM_ADDR_BITS-1:0] Address;
input [2*RAM_WIDTH-1:0] LoadData;
output [2*RAM_WIDTH -1:0] OutputRAMMEM;
always @ (posedge CLK)
begin
if(RAMEnableMSB) begin
if (WriteMemory)
begin
RAM1[Address+1] <= LoadData[2*RAM_WIDTH-1:1*RAM_WIDTH]; // Bit MSB
OutputData1 <= LoadData[2*RAM_WIDTH-1:1*RAM_WIDTH];
end
else
begin
OutputData1 <= RAM1[Address+1]; // Bit MSB
end
end
else
OutputData1 <= 0;
end
always @ (posedge CLK)
begin
if(RAMEnableLSB) begin
if (WriteMemory)
begin
RAM1[Address] <= LoadData[1*RAM_WIDTH-1:0*RAM_WIDTH]; // Bit LSB
OutputData0 <= LoadData[1*RAM_WIDTH-1:0*RAM_WIDTH];
end
else
begin
OutputData0 <= RAM1[Address]; // Bit LSB
end
end else
OutputData0 <= 0;
end
assign OutputRAMMEM = {OutputData1,OutputData0};
endmodule
当我在Xilinx ISE 14.7中合成时,一条消息告诉我合成是正确的。如果我还执行了行为模拟,结果就是预期的结果。
但是,如果我执行了路线后模拟,则会显示一条警告消息:
WARNING:HDLCompiler:1007 - "N:/O.61xd/rtf/verilog/src/unisims/ARAMB36_INTERNAL.v" Line 1050: Element index 7 into memp is out of bounds
模拟不起作用!!!重要的一点是我正在使用ISim模拟器。如果我描述了一个sigle端口RAM的硬件,也会出现相同的警告。
有谁能说我怎么能解决这个警告?
答案 0 :(得分:0)
不确定&#34;索引7&#34;但我注意到MSB的地址可能会超出范围。 RAM1
的最大索引是15.您的MSB的最大地址是(15 + 1)。
您可以向RAM1
添加额外的索引,或者如果溢出则将地址包装回0。如果你扭曲它,那么每个条目都可以被MSB和LSB访问。
两个是扭曲地址。使用mod操作:
RAM1[(Address+1)%(2**RAM_ADDR_BITS)] <= LoadData[2*RAM_WIDTH-1:1*RAM_WIDTH];
或者在索引RAM1
时计算MSB地址并屏蔽其MSB位:
wire [RAM_ADDR_BITS:0] AddressMSB = Address+1;
...
RAM1[AddressMSB[RAM_ADDR_BITS-1:0]] <= LoadData[2*RAM_WIDTH-1:1*RAM_WIDTH]; // Bit MSB
...