Hallo zusammen
Mal wieder eine Frage zum Thema "inferred" BRAM. Und zwar versuche ich
ein "true dual port ram with different aspect" zu erhalten.
Ein solches habe ich auf Altera am laufen. Die Datenstruktur dazu sieht
so aus:
1 | type wordType is array (0 to (2**WDPOT)-1) of unsigned(WIDTH-1 downto 0);
|
2 | type memType is array (0 to (2**(DEPTH-WDPOT))-1) of wordType;
|
3 | ...
|
4 | shared variable RamxD : memType;
|
Kompiliere ich diese auf Vivado erhalte ich folgende Fehlermeldung:
CRITICAL WARNING: [Synth 8-3352] multi-driven net R2/RamxD[0][1][1] with
1st driver pin 'R2/RamxD_reg[0][1][1]/Q'
[D:/home_nobackup/vivadotraining/KCU105_HW/ram_2rw_2s_1c.vhd:246]
CRITICAL WARNING: [Synth 8-3352] multi-driven net R2/RamxD[0][1][1] with
2nd driver pin 'R2/RamxD_reg[0][1][1]__0/Q'
[D:/home_nobackup/vivadotraining/KCU105_HW/ram_2rw_2s_1c.vhd:222]
...
Die Synthese in ein BRAM misslingt.
Nach Anpassung an die Xilinx Coding-Styles sieht die Datenstruktur jetzt
so aus:
1 | type memType is array (0 to (2**DEPTH)-1) of unsigned(WIDTH-1 downto 0);
|
2 | ...
|
3 | shared variable RamxD : memType;
|
Was in Quartus zum folgenden Resultat führt:
Error (10028): Can't resolve multiple constant drivers for net
"RamxD[0][7]" at ram_2rw_2s_1c_xil.vhd(217)
Error (10029): Constant driver at ram_2rw_2s_1c_xil.vhd(203)
Im ersten Fall habe ich ein zweidimensionales Array of unsigned,
übergeordnet Anzahl Worte im breiten Port, untergeordnet Anzahl Worte
des schmalen Ports im breiten.
Im zweiten Fall habe ich ein eindimensionales Array of unsigned mit der
Anzahl Worte im schmalen Port, beim Zugriff des breiten werden jeweils
2^WDPOT schmale Worte bearbeitet.
Meine Frage: Hat jemand Ansätze für eine Lösung, welche sowohl für
Altera und Xilinx ohne generate-Switch synthetisierbar ist?