Hallo,
ich möchte in meinem Design ein synchrones RAM beschreiben, welches in
der Synthese auf Block-RAM abgebildet werden soll. Dabei benutze ich
eine Beschreibung ohne explizite Instanziierung von Primitiven und will
dies auch nicht ändern: Das Speichermodul wird generiert, und ich will
es mir nicht antun, einen Generator zu schreiben, der Primitiv-Instanzen
verkabelt (andere Tools kommen Zwecks Portabilität nicht in Frage).
Die Synthese hängt sich daran leider auf. Die entsprechenden Meldungen
sind:
1 | Found 512x8-bit single-port distributed RAM for signal <memory_slice_0>.
|
2 | -----------------------------------------------------------------------
|
3 | | aspect ratio | 512-word x 8-bit | |
|
4 | | clock | connected to signal <clk> | rise |
|
5 | | write enable | connected to signal <en> | high |
|
6 | | address | connected to signal <word_no> | |
|
7 | | data in | connected to internal node | |
|
8 | | data out | connected to internal node | |
|
9 | | ram_style | Auto | |
|
10 | -----------------------------------------------------------------------
|
11 | INFO:Xst:1442 - HDL ADVISOR - The RAM contents appears to be read asynchronousely. A synchronous read would allow you to take advantage of available block RAM resources, for optimized device usage and improved timings. Please refer to your documentation for coding guidelines.
|
12 | WARNING:Xst:1772 - You have explicitly defined initial contents for this RAM, which are currently ignored when the RAM is implemented with LUT resources, leading to incorrect circuit behavior. Changing the RAM description so that it is read synchronously will allow implementation on block RAM resources for which we provide full initial contents support.
|
Ich kann aber in meinem Code keinen asynchronen Zugriff erkennen. Wäre
nett wenn ihr mal drüberseht, vielleicht findet ihr ja die Ursache.
Interessehalber - auch wenn es hier nicht zur Lösung beiträgt: Warum
können LUTs (distributed RAM) eigentlich nicht "vorbelegt" werden? Ich
dachte immer, dass genau das passiert, wenn ich damit Logik
implementiere.
Leider kann ich nicht im Synthese-Ergebnis nach dem asynchronen
"Verbraucher" suchen. Die o.g. Warning liest sich zwar, als sei nur ein
falsches Ergebnis synthetisiert worden, aber scheinbar hat XST größere
Probleme. Der Synthesereport endet mit der Meldung
1 | FATAL_ERROR:Xst:Portability/export/Port_Main.h:127:1.13 - This application has discovered an exceptional condition from which it cannot recover. Process will terminate. To resolve this error, please consult the Answers Database and other online resources at http://support.xilinx.com. If you need further assistance, please open a Webcase by clicking on the "WebCase" link at http://support.xilinx.com
|
2 | ERROR: XST failed
|
wobei ich letzteren Fehler schon öfters hatte, auch in völlig anderem
Zusammenhang. Der WebCase dazu hat in keinem dieser Fälle
weitergeholfen. Scheint also eine art Standard-Fehlermeldung ohne viel
Aussage zu sein. Ich kann aber nicht sagen, wodurch ich den Fehler
früher behoben habe, da es immer mit Änderungen getan war, die nach
meinem Verständnis eigentlich keine Auswirkungen haben sollten.