Forum: FPGA, VHDL & Co. Altera MSGDMA Fmax


von Donni D. (Gast)


Lesenswert?

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

von Klakx (Gast)


Lesenswert?

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.

von Donni D. (Gast)


Lesenswert?

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?

von Markus F. (mfro)


Lesenswert?

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).

von Donni D. (Gast)


Lesenswert?

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

von Klakx (Gast)


Lesenswert?

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.

von Donni D. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.