Aufgrund eines Problems in der Quartus® II Software kann dieser interne Fehler auftreten, wenn Ihr VHDL-Code einen Dual-Clock-Dual-Port-Speicher mit gemischter Breite mit dem Prozess für den breiteren Port leitet, der vor dem Prozess für den schmaleren Port platziert wird.
Zum Beispiel:
portA_p : PROCESS (clk)
BEGIN
IF (rising_edge(clk)) THEN
IF we_a = '1' THEN
-- Write access
ram(addr_a / 2)(addr_a mod 2) := data_a;
-- Read during write on the same port returns NEW data
q_a <= data_a;
ELSE
-- Read returns OLD data
q_a <= ram(addr_a / 2)(addr_a mod 2);
END IF;
END IF;
END PROCESS portA_p;
portB_p : PROCESS (clk)
BEGIN
IF (rising_edge(clk)) THEN
IF we_b = '1' THEN
ram(addr_b) := data_b;
-- Read during write on the same port returns NEW data
q_b <= data_b;
ELSE
-- Read returns OLD data
q_b <= ram(addr_b);
END IF;
END IF;
END PROCESS portB_p;
Um dieses Problem zu umgehen, wenden Sie die Reihenfolge der Prozesse um, sodass der Prozess für den breiteren Port zuerst angezeigt wird.
Dieses Problem wird voraussichtlich in einer zukünftigen Version der Quartus II Software behoben.