Ich suche nach Post-Layout-Lösungen für DDR3-Datenfehler.
Ich habe eine Platine mit einem FPGA und einem DDR3-RAM-Setup mit 2 Bänken (2 Reihen).
Datenfehler treten entweder auf, wenn der RAM (FPGA ist nicht bestätigt, könnte aber sein) höhere Temperaturen erreicht (40°C) oder von Anfang an und immer (von 20 getesteten fehlerhaften PCBs, der Fehler trat am gleichen RAM auf) auf 16 Bits, die dqs[1..0] zugeordnet sind, die die X1-RAMs in jeder Bank sind.
In der folgenden Abbildung ist ein Ausschnitt von Nulldaten zu sehen, die in Bank B geschrieben wurden. Die erste Zeile enthält geschriebene Daten, die zweite Zeile enthält gelesene Daten.
Infos zum Routing: Die Leiterbahnen sind alle auf 50Ohm (+-0,4Ohm, gemessen von Pin zu Pin) impedanzabgeglichen. Es ist eine T-Topologie (kein Fly-by). Die "T"-Zweige sind längenangepasst. Abschlusswiderstände (51Ohm 0,1%) werden verwendet, ich habe versucht, Daten zu senden, indem ich sie und verschiedene ODT-Einstellungen entfernt habe. Ich hatte eine leichte Verbesserung, kann aber nicht sicher sagen, ob es an der ODT lag. Ich habe mir die Versorgung angesehen, vor dem Entfernen der Abschlusswiderstände war die VTT der RAMs außerhalb der Grenzen, nach dem Entfernen sah die Versorgung in Ordnung aus.
Das RAM ist von Alliance Memory , das FPGA ist ein Cyclone V von Intel, Uniphy IP-Kern wird verwendet (ich habe verschiedene Einstellungen ausprobiert, mit sich ändernden Board-Skews und so weiter, bin aber später in Timing-Verletzungen gelaufen).
Ich habe versucht, den Fehler mit Board-Simulationen (Hyperlynx) zu finden und konnte ihn nicht vollständig finden (Die-to-Die-Simulation). Das Bild unten ist eine Simulation (Slow-Weak-Modell) der Clock- und DQs-Signale, während das FPGA schreibt. Weiß ist die Uhr. Das Setup-Timing wird verletzt, aber die DQS-Signale beider RAMs überlappen sich (warum also nur Daten von RAM 1?).
Beim Simulieren einer Leseoperation: Ich sehe, dass meine read-dqs-Signale ziemlich durcheinander sind.
Was sind meine Lösungen? Oder besser gesagt, was und wie kann ich prüfen, um den Fehler zu finden? Die Lesesignale sehen fehlerhaft aus, aber mit dem Verhalten der Platinen bin ich nicht 100% zufrieden, viele sind in Ordnung, einige haben Fehler bei höheren Temperaturen, und einige haben den Fehler ständig.
Bearbeiten 1:
Ich habe folgende Einstellungen mit ODT versucht (FPGA rzqin = 100 Ohm, jeder RAM hat einen ZQ von 240 Ohm), die Abschlusswiderstände wurden entfernt:
Bearbeiten 2:
Versorgungsspannungen sehen aus wie in den Spezifikationen. Angesteuert mit einem 60 MHz Oszi, daher bin ich mit der Messung nicht zufrieden (300 MHz Datentakt)
Ich betreibe den Takt mit 300 MHz, was der niedrigste Wert für den DDR3-Standard ist
Die Zeitvorgaben sind eng. Taktgruppen, Wege mit mehreren Zyklen und keine uneingeschränkten Takte.
Ich habe mehrere Boards ausprobiert: einige sind in Ordnung, einige haben Fehler bei höheren Temperaturen, einige haben Fehler von Anfang an.
Ich habe das Löten unter einem Mikroskop überprüft, scheint in Ordnung zu sein, kann aber nicht unter fbga-Pakete schauen
Ich habe versucht, mit Druck auf einen oder beide ICs zu schreiben/lesen. - Keine Verbesserung
Ich habe es mit einer Triebstärke von RZQ/7 und RZQ/6 versucht. Im Moment fand ich die beste Einstellung mit einem ODT von RZQ/6 (40 Ohm - RAM) und einer Antriebsstärke von RZQ/7.
Ich habe es mit dynODT versucht, aber der Zyklon V kann nur mit 50-Ohm-Paralleleingangsabschluss fahren. Mit den oben genannten Einstellungen würde ich es gerne mit 40 Ohm versuchen, aber es wird nicht mit 40 kompiliert. Die Einstellung befindet sich im Uniphy-IP-Kern, sodass ich nur hoffen kann, dass ODT beim Lesen verwendet wird. Kann ich das messen?
Ich habe das EMIF-Toolkit von Intel ausprobiert und es hat mir ein OK bezüglich Kalibrierung und Marge meiner Signale gegeben.
Bearbeiten 3: einige Gedanken
Was mich wirklich stört, ist, dass bis auf die DQ- und DQS-Signale alle Signale für beide RAMs auf jeder Bank verwendet werden. Länge angepasst und so weiter. Gleiche Einstellungen, Platzierung der Kondensatoren, Werte, alles ist gleich. Ich habe einen anderen RAM von Micron ausprobiert und das gleiche Ergebnis erhalten. Damit schließe ich die Möglichkeit einer defekten RAM-Ladung aus. Ich versuche es mit verschiedenen FPGA-Designs (weniger Ressourcen, mehr Platz für die DDR3-Schnittstelle) und erhalte auch die Fehler. Also breche ich die Möglichkeit des FPGA-Designs ab. Ich schreibe viele Nulldaten (wiederhole dieselben Adressen) in den RAM und bekomme falsche Werte zurück - ich glaube, es ist ein Lesefehler.
Ich glaube, dass der Fehler in den DQS- und DQ-Signalen liegen muss, aber ich bekomme fast die gleichen Ergebnisse mit der SI-Simulation für das fehlerhafte RAM und das Arbeits-RAM. Vielleicht versuchen, die ICs zu erhitzen, um sie neu zu löten? Ich habe kein Oszi, das mit 300MHz mithalten kann, aber gibt es eine Möglichkeit, eine Verschlechterung auf den Signalwegen zu messen? Kann es sein, dass der Leiterplattenhersteller die ICs bei der Herstellung beschädigt hat? Wenn es ein Redesign gibt, wie kann ich verhindern, dass dieser Fehler auftritt?
Bearbeiten 4
Ich hatte gerade 3 PCBs, wo 3 verschiedene RAMs Probleme verursachen (A2, B1, B2) und ich sah, dass die Fehler bei der internen Adresse (FPGA-Adressraum) 0x400 000 beginnen - also wird eine neue Adresszeile verwendet. Wenn alle Adresszeilen simuliert werden, sehen sie fast gleich aus, wobei die mit der niedrigsten Anstiegsrate die 3. und 4. Adresszeile sind, die korrekt zu funktionieren scheinen (sie werden verwendet, bevor der Fehler auftritt).
Die Tatsache, dass Sie Fehler auf ganzen Spuren haben, scheint auf die Adress-/Cmd-Seite hinzuweisen, obwohl auch DQS in Frage kommen könnte. Was ist mit deinem ODT los?
Pericynthion
Pericynthion
Peter Schmidt
Peter Schmidt
Eggi
Peter Schmidt
Eggi