En raison d’un problème dans le logiciel Quartus® II, vous pouvez constater cette erreur interne si votre code VHDL inférer une mémoire double port à double horloge à largeur mixte avec le processus pour le port plus large placé avant le processus pour le port plus étroit.
Par exemple :
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;
Pour contourner ce problème, inversez l’ordre des processus afin que le processus du port élargi apparaisse en premier.
Ce problème devrait être résolu dans une prochaine version du logiciel Quartus II.