Hey Leute, ich bastle im Moment an einem System mit DDR3 Speicher und PCIe. Das funktioniert auch soweit alles super. Nun möchte ich eine selbst geschriebene Komponente in das System einbringen. Meine Komponente schreibt Daten in eine Avalon-ST Dual Clock FIFO, der MSGDMA Controller soll die Daten rausholen und in den DDR3 Speicher legen. Also im Platform Designer alles verbunden, Synthese gestartet und tada, erstmal keine Fehler. Was mich 'stört': Mein System mit dem DMA Controller läuft 'nur' auf 50 MHz, vielleicht maximal 100 MHz. Ich hatte gehofft die 200 MHz des Avalon-MM Busses des DDR3 Controllers verwenden zu können. Doch die Synthese liefert Timing Probleme (Setup Hold), die Fmax Summary zeigt mir, dass die Clock statt 200 MHz nur noch 150 MHz schafft. Wenn ich mir die Doku zum älteren SGDMA (ohne Modular) ansehen steht drin, das auch 300 MHz mit einem Stratix 3 erreichbar sein sollen. Ich nutze einen Stratix V und hatte gehofft auf wenigstens 200 MHz zu kommen. Gibt es noch irgendwas zu beachten? Wie kann ich vielleicht noch eine höhere Frequenz erreichen? Vielleicht hat ja jemand mal damit etwas gemacht und hatte die gleichen Probleme. Grüße
Synthese sagt erstmal noch nicht alles. Deshalb nach dem Place&Route in die STA schauen und prüfen warum der langsamste Pfad ist wie er ist. In der Regel bewirkt man mit ein paar Registerstufen schon erheblichen Zeitgewinn. Also lass dein Design auf Zielfrequenz bauen und schau in der STA nach.
Eine Synthese läuft gerade, dauert leider immer knapp eine Stunde.. Wie meinst du das mit Registerstufen einbauen? Ist mein erstes größeres und komplexeres Projekt. Kannst du mir da ein bisschen auf die Sprünge helfen?
Donni D. schrieb: > Wie meinst du das mit Registerstufen einbauen? Fmax wird wesentlich beeinflusst durch die Signallaufzeit über die Länge der rein kombinatorischen Timing-Pfade. Hase und Igel: wenn dein gestresstes Signal endlich ankommt, ist die Clock schon längst da. Das Signal zu spät, timing closure fail. Hängst Du ein Register in die Mitte eines solchen Bandwurms, schafft dein Design deutlich höhere Taktraten. Natürlich - weil nichts auf der Welt umsonst ist - mit einem zusätzlichen Takt Latenz. Die Du dann natürlich entsprechend berücksichtigen musst (und das ist die eigentliche Schwierigkeit, aber irgendwas ist ja immer).
So, das Design ist komplett gebaut und ich bekomme Timing (Setup) Probleme im Slow 900mV 85C Model und Slow 900mV 0C Model. Der Timing Analyzer sagt mir es geht um folgende Clock: instance|ddr3a|pll0|pll_afi_clk. Das ist der Takt, der vom DDR3 Controller erzeugt und für den Avalon Bus genutzt wird. Diesen gebe ich an die Dual Clock FIFO sowie den MSGDMA Controller. Laut Fmax schafft diese im aktuellen System nur noch ~171 MHz und erzeugt so einen Slack von -0.831. Timing Probleme habe ich nun hier: Von: streamingddr3:instance|streamingddr3_msgdma_a:msgdma_a|write_master:writ e_mstr_internal|length_counter[8] Nach: streamingddr3:instance|streamingddr3_msgdma_a:msgdma_a|write_master:writ e_mstr_internal|scfifo:the_st_to_master_fifo|scfifo_1qb1:auto_generated| a_dpfifo_khb1:dpfifo|altsyncram_l5s1:FIFOram|ram_block1a456~portb_addres s_reg6 Die Timing Closure Recommendiations (Physical Synthesis, Optimization Technique Speed) habe ich schon aktiviert. Das Problem sind laut Timing Analyzer nun die Long Combinatorial Paths, wie ihr schon vermutet habt. Wie könnte ich die Sache nun angehen? Wie lassen sich zum Beispiel weitere Registerebenen einbauen, oder welche Möglichkeiten habe ich noch? Ich hatte bis jetzt leider nie ein System bei dem ich auf solche Probleme gestoßen bin, weiß also nicht wie ich da nun am besten vorgehen könnte. Beste Grüße
Bei xilinx heißt das register slice. Die setzt man einfach zwischen die genannte Busverbindung. Beim FPGA kann nicht nur Logik schuld sein, sondern auch die Routing Distanz. Speziell sind auch DDR Controller durch die schnellen Pins relativ ortsgebunden. Probleme sieht man am Netdelay, wenn man genauer in die STA schaut.
Unter dem Stichpunkt Register Slice konnte ich leider nicht so viel finden wie ich mir erhofft hatte. Hast du da ein paar Links für mich? Vielleicht auch jemand anders, im Bezug auf Altera/Intel FPGAs? Der DDR3 Controller scheint richtig zu funktionieren. Ich habe die richtige Clock ausgewählt (die zur IO Bank gehörende, vom Hersteller empfohlen) und ein PCIe DMA Transfer in den DDR3 RAM gelingt auch. Auch das Auslesen gelingt über PCIe. Es scheint wirklich nur an dem DMA Controller zu liegen. Was mich außerdem etwas stutzig macht: Wenn ich die Daten in ein On-Chip Memory schreibe kann ich sie über PCIe auslesen und bekomme das richtige Ergebnis (erkenne ich am Header). Schreibe ich die Daten mit einer 50 MHz Clock (kein Timing Problem) in den DDR3 RAM erhalte ich ziemlich viele Bitfehler. Ich erkenne den Header, es sind nur ziemlich viele Daten fehlerhaft. Das verhalten kann ich mir leider nicht so richtig erklären. Ich hatte gehofft, das Problem lösen zu können, indem ich die Clock vom DDR3 Controller für den DMA Controller nehme, nur da bekomme ich eben die Timing Probleme. Hat jemand weitere Ratschläge für mich?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.