Forum: FPGA, VHDL & Co. QSYS-Design: Ursachenforschung warum Logik deutlich langsamer geworden ist


von Peter Z. (starkstrompeter)


Lesenswert?

Hallo Zusammen,

ich arbeite gerade an einem FPGA-Design unter Quartus II 12.0 SP2, 
welches einen Arria II GX nutzt. Hauptfunktion bildet ein Regler welcher 
aus mehreren selbst entworfenen Komponenten zu einem QSYS-System 
zusammengesetzt wurde und mittels PCIe an die Außenwelt angebunden ist. 
Das komplette Design konnte ich bereits erfolgreich mit einer Fmax > 125 
MHz erstellen.

Nachdem ich jetzt einige Zeit an dem Design weitergearbeitet habe und 
die Entwicklungsumgebung auf den neuesten Stand gebracht habe (Quartus 
II 12.0 SP2), wobei ich leider nicht alle Veränderungen dokumentiert 
habe, bekomme ich die geforderte Fmax von 125 MHz nicht mehr hin. Die 
kritischen Pfade habe ich mit TimeQuest ermittelt, diese liegen alle im 
Bereich der verwendeten (32 Bit) Multiplizierer und Dividierwerke 
(LPM_DIVIDE). Ich habe bereits einige Register eingefügt, um die Pfade 
zu entschärfen, aber selbst das reicht nicht. Das Dividierwerk habe ich 
bereits mit 16 facher Pipeline konfiguriert, damit komme ich immerhin 
wieder auf etwa 123 MHz. In der alten Version lief der Dividierer mit 
nur vier Stufen problemlos bei 125 MHz.

Nachdem ich nun bereits mehrere Tage versuche den Fehler zu finden, 
möchte ich an dieser Stelle nachfragen, ob mir jemand einen Tipp hat, in 
welcher Richtung ich weitersuchen soll. Welche Veränderungen an einem 
FPGA-Design können dazu führen, dass solche grundlegende Logik plötzlich 
deutlich langsamer wird? Ich bin mir noch nichtmal im klaren, ob es an 
einer geänderten Konfiguration, an einem Fehler innerhalb des Designs 
oder am Software-Update liegt. Deshalb sind alle Ideen willkommen :-)

Und noch eine weitere unabhängige Frage: Wie managt ihr die Warn- und 
Fehlermeldungen bei größeren Designs? Mir fliegen hier an die 800 
Meldungen um die Ohren, der größte Teil davon wird durch automatisch 
generierte QSYS-Teile verursacht. Klar kann man die Meldungen 
unterdrücken um wenigstens die im Bezug auch die eigenen Teile 
relevanten nicht zu übersehen. Aber ist das wirklich normal, bei einem 
fertigen IP-Core (z. B. PCIe) mehrere hundert Warnungen zu erhalten und 
diese einfach "hinnehmen" zu müssen?

Peter

von Nadine (Gast)


Lesenswert?

Lass doch mal den Design-Space-Explorer drüberlaufen, wahrscheinlich 
hattest du in deiner alten Quartus Version das ein oder andere Setting 
anders gesetzt.

von Michael (Gast)


Lesenswert?

Hallo Peter,

ich hatte das Problem bei meinen Tests mit dem Nios auch das das
Qsys Design eine geringere Fmax erzeugt hatte. Habe dann den Tipp
bekommen bei Qsys auf dem "Project Settings" Tab mal nach der
Einstellung für "Limit interconnect pipeline stages to" zu schauen.
Was passiert wenn Du diesen Wert auf 4 stellst, wir es dann besser?

Gruß,
Michael

von Peter Z. (starkstrompeter)


Lesenswert?

Danke für eure Antworten!

Den "Design-Space-Explorer" kannte ich noch nicht, den lasse ich gerade 
drüberlaufen und bin gespannt, was für Ergebnisse rauskommen.

Zu den "Interconnect pipeline stages": Die habe ich bereits auf 4 
gestellt. Mir scheint jedoch, dass nicht die Avalon-Logik zu langsam 
ist, sondern der kritische Pfad bereits innerhalb der 
LPM_DIVIDE-Komponente auftritt. Nachfolgend der schlechteste "Top 
failing path" aus TimeQuest:
1
Slack: -17.432
2
From Node: sys_msmst:i_qsys|pi_control_slave:i_pi_control|pi_control:i_pi_control|lpm_divide:i_divider|lpm_divide_2or:auto_generated|sign_div_unsign_jqh:divider|alt_u_div_jgg:divider|altshift_taps:DFFQuotient_rtl_0|shift_taps_8p21:auto_generated|altsyncram_hv91:altsyncram4|ram_block5a8
3
To Node: qsys_msmst:i_qsys|pi_control_slave:i_pi_control|pi_control:i_pi_control|lpm_divide:i_divider|lpm_divide_2or:auto_generated|sign_div_unsign_jqh:divider|alt_u_div_jgg:divider|DFFStage[115]
4
Launch Clock: i_qsys|i_pcie|pcie_internal_hip|arria_ii.arriaii_hssi_pcie_hip|coreclkout
5
Latch Clock: i_qsys|i_pcie|pcie_internal_hip|arria_ii.arriaii_hssi_pcie_hip|coreclkout
6
Relationship: 8.000
7
Clock Skew: 0.039
8
Data Delay: 25.340

Peter

von ähmm.. (Gast)


Lesenswert?

hi

(vor weg.. altera kenn ich nicht wirklich, aber)

ein Dividier bräuchte doch "normalerweise" pro bit breite ein 
Register-Stufe.

Wenn du 4 Stufen hattest, musst die logik einer 8 bit Division in einen 
Schritt passen.
Das soll bei > 125 MHz klappen ?
Kann ich irgendwie nur schwer glauben.

Da glaube ich deine 16 Stufen schon eher, das klingt vernünftig.


Cheers.

von Peter Z. (starkstrompeter)


Lesenswert?

Puh, wie die Division intern aufgebaut wird fehlt mir das Wissen. Ich 
meine jedoch dass es schon einmal mit vierfachem Pipelining und 125 MHz 
ging.

Wie auch immer, wenn ich die Division 16-fach pipeline, dann kriege ich 
den kritischen Pfad bei meinen 32-Bit-Multiplikationen. Und das meine 
ich hat definitiv schonmal getan... Insgesamt habe ich sieben 
Multiplikationen (32 x 32 -> 64 Bit), es werden insgesamt 28 "DSP block 
18 Bit elements" verwendet, das sollte doch bei der Taktrate drin sein, 
oder?

Peter

von Peter Z. (starkstrompeter)


Lesenswert?

Nachtrag: Die 28 "DSP block 18 Bit elements" könnten natürlich auch von 
der Division kommen und zufällig genau 4x7 Stück sein. Es werden laut 
"Fitter DSP block usage summary" genau sieben "Simple Multipliers 
(36-bit)" instanziiert. Das deutet doch wiederum darauf hin, dass er 
dedizierte Hardare für eine 36-Bit-Multiplikation hat. Sind die derart 
langsam?

Peter

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.