Как я могу исправить предупреждение HDLCompiler: 1007 - Индекс элемента 7 в memp выходит за границы, когда я описываю аппаратную оперативную память, используя Verilog в Xilinx?

У меня есть следующее аппаратное описание двухпортовой оперативной памяти:

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, сообщение говорит мне, что синтез правильный. Если бы я также выполнил поведенческую симуляцию, результат был бы ожидаемым.

Однако, если я выполнил симуляцию Post-Route, появится предупреждающее сообщение:

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. Если я описал аппаратное обеспечение ОЗУ с одним портом, также появится такое же предупреждение.

Может ли кто-нибудь сказать мне, как я могу решить это предупреждение?


person Adrian    schedule 12.09.2015    source источник


Ответы (1)


Не уверен насчет «индекса 7», но я заметил, что адрес для MSB может выходить за пределы допустимого диапазона. Максимальный индекс для RAM1 равен 15. Максимальный адрес для вашего MSB (15+1).

Вы можете добавить дополнительный индекс к RAM1 или вернуть адрес обратно в 0, если он переполняется. Если вы деформируете его, то каждая запись будет доступна для MSB и LSB.

Два было деформировать адрес. С операцией мода:

RAM1[(Address+1)%(2**RAM_ADDR_BITS)] <= LoadData[2*RAM_WIDTH-1:1*RAM_WIDTH];  

Или вычислите адрес MSB и замаскируйте его бит MSB при индексации RAM1:

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
...
person Greg    schedule 13.09.2015