TLDR: Benötigt man bei Xilinx LUTRAM auf der Ultrascale-Architektur zwingend einen externen Mechanismus zur Vermeidung von Adresskollisionen?
Ich bin gerade darüber gestolpert, dass Vivado für einen per xpm instanziierten RAM mit der Einstellung "auto" einen distributed RAM statt eines erwarteten BRAM erzeugt hat. Der RAM ist dual-port mit unabhängigen Takten. Im timing report gab es eine Violation zwischen diesen Ports.
Im UG974 [1] bin ich fündig geworden, wie das zu lösen ist (siehe unten). Man muss für LUTRAM ein false_path constraint setzen. Allerdings steht dort explizit dabei, dass das Design sich um Adresskollisionen kümmern muss.
Ich bin mir nicht sicher, wie das zu interpretieren ist. Im Normalfall sind mir Adresskollisionen eigentlich egal, weil ich per Design sicher bin, dass ich das Ergebnis der Leseoperation nie brauche, wenn gerade auf derselben Adresse geschrieben wird. Im Grunde geht es mir nur darum, dass die Schreiboperation auch durchgeführt wird, auch wenn die Leseadresse zufällig gerade auf derselben Adresse steht. Bei BRAM ist das ja auch kein Problem.
Bei LUTRAM könnte das evtl. anders sein, da dass den Speicher der LUTs nutzt. Dort könnte je nach interner Implementierung etwas undefined werden, wenn Schreib- und Leseoperation auf den gleichen Speicher gehen. Hat jemand Erfahrungen, ob das wirklich so ist (für die Ultrascale-Architektur)? D.h. muss ich mich wirklich um einen externen Adresskollisionsmechanismus kümmern? Laut UG574 [2] sieht das eigentlich unkritisch aus. Auf die Simulation will ich da auch nicht vertrauen, weil das Modell u.U. nicht alles unterstützt, was in HW passiert (wie z.B. bei den WRITE_MODEs). Der WRITE_MODE wäre mir aber auch egal, da ich das Ergebnis einer Leseoperation auf derselben Adresse zum gleichen Zeitpunkt wie gesagt nicht brauche.
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
[1] https://docs.amd.com/r/en-US/ug974-vivado-ultrascale-libraries/XPM_MEMORY_TDPRAM