Hallo, ich baue gerade an einem Design rum und habe festgestellt, dass die "Maximum Frequency" beim Synthetisieren mittlerweile auf 106 MHz runterging. Das ist jetzt kein Problem, das Design soll mit 40 MHz laufen, aber ich habe mich gefragt, welche Elemente oder Konstrukte diese Zahl beeinflussen, irgendwann kommt bestimmt ein zeitkritisches Design. Bei den letzten 2-3 Sachen, die ich dem Design hinzugefügt habe, hat sich diese Zahl kein Stück verändert, man kann also nicht einfach sagen mehr Zeug -> weniger MHz. Also welche Elemente eines Designs machen dieses langsam?
Hmm ich würde jetzt mal auf die Länge der Kombinatorik tippen.. (Dies bestimmt auch den kritischen Pfad). Abhilfe würde ein Aufbrechen der Struktur, also Pipelining, bringen.
Die Taktfrequenz nach der Synthese ist eine reine Schätzung. Du darfst dich nicht auf diese Zahl verlassen. Das, was das Design am Ende wirklich kann, steht im Post-PAR Timing Report; erst nach dem Routing stehen auch die Routing-Delays fest. Wenn da weniger als 40 MHz steht, hast du ein Problem. Die länsten Pfade stehen auch in diesem Report. Auf dieser Basis kannst du dann dein Design modifizieren. -- stefan
Wobei hinzuzufügen wäre, daß der jetzt kritische Pfad noch nichts aussagt. Die Synthese wird immer probieren, sich am Rande der festgelegten Frequenz "entlangzuschlängeln" und die Schaltung insgesamt hin-und herzubalancieren, dass es passt. Daher hat man sehr früh im Design immer einen Pfad, der nur gerade ein wenig schneller ist, als man braucht. Man muss aber der Synthese schon mitteilen, wohin sie gehen soll - das scheint mir Christian noch nicht getan zu haben.
>Abhilfe würde ein Aufbrechen der Struktur, also Pipelining, bringen. Das verstehe ich nicht, kannst du ein Beispiel geben? >Post-PAR Timing Report Ich hab die ganze ISE durchwühlt, aber solch einen Report konnte ich nicht finden. Wo steht der (bei 8.1 SP3)? >Man muss aber der Synthese schon mitteilen, wohin sie gehen soll - das >scheint mir Christian noch nicht getan zu haben. Was meinst du mit wohin sie gehen soll? Ansonsten danke für eure Antworten! :)
1.Pipelining: Der kritische Pfad bestimmt die maximale Frequenz eines Designs. Das heißt der Pfad, der in einem Takt durchlaufen werden kann ohne dass sich der Eingang schon wieder ändert muss beachtet werden. Der Eingangswert kommt dabei z.B. von einem Register und der Ausgangswert wird wieder in eines geschrieben, dazwischen nur Kombinatorik. Z.b. könnte man die Addition von drei Zahlen a + b + c = d implementieren. Dazu könnte man einfach zwei Addierer hintereinanderhängen. Eventuell ist der Pfad aber zu lang um eine bestimmte Frequenz zu erreichen. Also kann man noch ein Register dazwischenbauen und damit quasi ein Zwischenergebnis a+b speichern, das im nächsten Takt erst +c genommen wird. Währendessen kann schon ein nächstes a+b berechnet werden usw. Der kritsiche Pfad geht dann nur über einen statt zwei Addierer. Damit dauert eine Addition der drei Zahlen dann natürlich zwei Takte statt einem. Liegen allerding jeden Takt Eingangswerte an, kommt auch jeden Takt ein Ergebnis raus (nämlich die des vorherigen Eingabewertes). 2.Post-PAR report ist die .twr-Datei. Wird nach dem Place and Route erstellt, in den PAR-Optionen kann man Details einstellen. 3.Wenn du eine bestimmte Frequenz erreichen möchtest, muss die Synthese bzw. PAR das wissen. Dazu erstellt du ein constraints file, in dem der gewünschte Takt angegeben wird.
Vielen Dank für die ausführliche und lehrreiche Antwort! Werde mich nächste Woche intensiver damit beschäftigen. Aber jetzt - schönes megalanges Wochenende :)
mach dir keine Sorgen über die Geschwindigkeit deines Designs, wenn da 106 MHz steht und du 40 erreichen willst ist das ne sichere Bank. Zwei große Brocken beeinflussen die Designgeschwindigkeit meist. 1) die Auslastung (hier kannst du per Faustformel sagen: je mehr im Design drin ist umso langsamer wird es) Das ist aber nur eine grobe Richtlinie! Es gibt immer krotische Größen, wo die Geschwindigkeit plötzlich signifikant sinkt. So lange du nicht in Regionen über 80% kommst sollte genügend Platz vorhanden sein alles halbwegs anständig zu routen. Pass hierbei beim boardlayout auf, dass logisch zusammenhängende blöcke auch pins in der nähe haben (bsp: du willst nen DDR2 Controller schreiben, dann müssen die nah beeinander liegen sonss probleme; naja, du kannst dir sicher vorstellen was ich meine!) 2) Dein Codingstile: Den kannst du sehr gut beeinflussen. Denk daran keine zu langen asynchronen Pfade einzubauen (pipelining trifft es hier nur halb, da pipelining die zeitliche Abfolge verändert und daher zu logischen Problemen führen kann). Überlege dir vorher die SChritte, die deine Logic abarbeiten soll und dann immer schritt für schritt und zwischendurch registern! Aber wenn dein Design bei 106 MHz läuft scheinst du das ja schon zu berücksichtigen So und jetzt ncoh ein TIP! Irgendwo in deinem Synthese / Place and Route Tool müsste es eine Einstellung geben, die den Effort einstellt. Wenn du mal an kritischen Parametern arbeitest kannst du dort ncoh an ein paar rädchen drehen! Zum einen kannst du bestimmt irgendwas zwischen low und high einstellen, wo die anzahl der Dürchläufe verändert werden kann. Viele Durchläufe bescheren einem meist bessere ERgebnisse, dauern aber mit unter die ganze Nacht! Zum anderen kannst du festlegen auf was das ganze optimiert werden soll (area, speed or balanced)! Und wenn das alles nicht hilft und dein Design trotzdem knapp an der Zielsetzung vorbeischrammt, dann probier es einfach auf der echten hardware aus! Es wird bei den tools immer vom worst case ausgegangen, also nciht unbedingt von Zimmertemperatur und stabiler spannung... Es kann also gut sein, dass es trotzdem geht. Heribei können allerding effekte auftreten, die zu einem zeitweiligen Ausfall führen (das teil läuft und läuft und erwärmt sich dabei...). Aber wenn es nichts sicherheitsrelevantes ist... Viel Erfolg!
Christian Peters wrote: > ...Also welche Elemente eines Designs machen dieses langsam? na(Gast) hat ja schon ganz gutes dazu geschrieben, bleibt aber mit den Addierern noch auf "Klötzchenebene". Um zu analysieren, wann genau bei einem FPGA eine neue Logikebene dazukommt muss man sich mal die CLBs, LEs (oder wie die kleinsten "Arbeitstierchen" beim jeweiligen Hersteller gerade heissen) ansehen. Meist basieren diese auf Lookup Tables (LUTs) mit 4, 5 oder ein paar mehr Eingängen. Hat man in seinem Design zwischen zwei Flipflops Gleichungen mit mehr Eingängen als die LUTs bieten, ist der Placer gezwungen, mehrere CLBs/LEs etc. zu kaskadieren, was natürlich die Laufzeiten erhöht. Um das zu umgehen werden kritische Designs dann wie schon erwähnt "gepipelined": Statt z.B. bei einem Komparator viele Bits auf einmal zu vergleichen (in VHDL ein Einzeiler) macht man das bei LUTs mit 4 Eingängen besser mit je 2 (bei 2 Variablen) oder 4 (beim Vergleich mit einer zur Kompilierzeit bekannten Konstanten) Bits, latcht das Ergebnis mit einem DFF ab und kombiniert dies dann in weiteren Stufen zum Endergebnis. Effekt: Die Laufzeit nimmt um die Anzahl der Stufen zu, aber die max. Arbeitsgeschwindigkeit steigt (z.T. erheblich!). Man darf natürlich nicht vergessen, auf anderem Weg (d.h. mit unterschiedlicher Pipelinelänge) parallel berechnete Ergebnisse ggf. durch Schieberegister(chen) passender Länge aufzusynchronisieren, sonst wird die Fehlersuche mitunter sehr "interessant" ;-) Grüße aus Berlin-Tempelhof, Stefan
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.