Wie lassen sich Bereiche eines FPGA-Designs identifizieren, die die meisten Ressourcen und Flächen beanspruchen?

Ich arbeite an einem großen FPGA-Design und bin sehr nahe an den Ressourcengrenzen des FPGAs, das ich derzeit verwende, dem Xilinx LX16 im CSG225-Paket.

Auch das Design ist fast fertig, passt aber im Moment nicht mehr in das FPGA. Ich kann Teile ausschalten, damit es passt, aber ich muss den Ressourcenverbrauch reduzieren, um das Design fertigzustellen und die Zeit- und Größenanforderungen zu erfüllen.

Ich würde gerne wissen, ob es in unseren Berichten Tools gibt, mit denen ich feststellen kann, welche Teile meines Designs die meisten Ressourcen verbrauchen. Mein Design ist nicht partitioniert und auf etwa ein Dutzend oder mehr VHDL-Module aufgeteilt.

Xilinx-Timing-Berichte sind fantastisch, aber jetzt muss ich wissen, wo ich mein bestes Preis-Leistungs-Verhältnis in Bezug auf Platzersparnis bekomme.

Es fällt mir auch schwer zu sagen, welche Art von Ressourcen mir ausgehen oder welche Auswirkungen diese Ressourcen haben.

Ein weiteres Ärgernis ist, dass mit zunehmender Größe des Designs Komponenten, die früher dem Timing entsprachen, zu versagen beginnen, weil ihre Platzierung nicht mehr so ​​ideal ist.

Derzeit verwende ich die Post-Place- und Route Static-Timing-Berichte und ich verwende SmartXplorer. Ich verwende Designstrategien, um das Timing zu optimieren.

Nachdem ich einen Teil meines Designs deaktiviert habe, damit es passt, hier sind einige der Ergebnisse:

Slice-Registerauslastung: 42 % Slice-LUT-Auslastung: 96 % Anzahl der vollständig genutzten LUT-FF-Paare: 38 % Bedeutet das, dass ich wenig Register, aber viel Gate-Nutzung habe?

Gibt es Tools, die Entwicklern bei der Flächenoptimierung helfen oder ihnen zumindest mehr Einblick in ihren Code geben?

Update: Nachdem ich mir die Auslastung auf Modulebene angesehen hatte, fand ich heraus, dass ich überall kleine asynchrone Leim-Fifos hatte, die etwa 30 % der gesamten LUTs ausmachen. Ich verwende sie als Cross-Clock-Domain-Kleber für Hochgeschwindigkeitsbusse. Ich sollte diese beseitigen können, da die Uhren eng miteinander verbunden sind. (120-MHz-Eingang, erzeugt 100 MHz und 200 MHz über DCMs)

Es sieht so aus, als hätten Sie viele Verbindungen zwischen den Signalen. Ich bin sicher, Sie können das beheben, indem Sie die Optimierungsebenen, die gemeinsame Nutzung von Ressourcen und dergleichen ändern. Welches Werkzeug verwenden Sie? ISE oder Vivado?
Ich verwende ISE (Vivado unterstützt Spartan-6 nicht). Ich habe dies in den Xilinx-Foren gepostet, und sie sagten, sie sollten den detaillierten Kartenbericht aktivieren. Ich habe dies getan, und die *.mrp-Datei enthält jetzt Abschnitt 13 – Nutzung nach Hierarchie. Ich werde die Daten posten, sobald ich sie besser formatiert habe.

Antworten (3)

Ich habe diese Frage hier im Xilinx-Forum gepostet: http://forums.xilinx.com/t5/Implementation/How-to-determine-what-part-of-the-design-consumes-the-most/td-p /393247

Diese Antwort basiert weitgehend auf den dortigen Kommentaren. Danke an Deepika, Sikta und Gabor.

Aktivieren Sie zunächst 'Detaillierten MAP-Bericht generieren' in den Kartenprozesseigenschaften (-detail).

Öffnen Sie dann die Design-Zusammenfassung und navigieren Sie zu „Module Level Utilization“. Hier ist die vollständige Hierarchie, die die Verwendung von exklusivem und inklusivem Design zeigt.

Jede Zeile zeigt ein Zahlenpaar wie 0/5392. Dies bedeutet, dass dieses Modul null dieses spezifischen Elements enthält, aber dieses Modul und alle seine Untermodule enthalten insgesamt 5392 Elemente.

Hier ist meine Ausgabe (teilweise erweitert)Nutzungsbericht

Wenn Sie daran arbeiten, die Größe zu reduzieren, empfiehlt Gabor, in den Synthesizer-Tools auf ein größeres FPGA umzusteigen, damit es vollständig abgebildet werden kann, selbst wenn es zu groß ist, um in Ihr aktuelles FPGA zu passen, und die Tools dadurch schneller laufen.

Sieht so aus, als würden Sie fast alle Logikressourcen verbrauchen, während Sie nur die Hälfte der Register verwenden. Es sieht so aus, als müssten Sie herausfinden, was all Ihre LUTs auffrisst. Es gibt Möglichkeiten, bestimmte Komponenten zu optimieren und sie etwas platzsparender zu machen - Dinge wie RAMs, Schieberegister und Zustandsmaschinen. Sehen Sie sich die resultierende .log-Datei des Synthesizers an. Es wird Ihnen sagen, welche Art von Komponenten abgeleitet werden. Stellen Sie sicher, dass die Komponenten ordnungsgemäß abgeleitet werden. Wenn dies nicht der Fall ist, generiert es möglicherweise keine besonders effiziente Netzliste. Sie können viel erkennen, wenn Sie sich nur die Syntheseprotokolldateien ansehen. Es ist möglich, dass ein paar geringfügige Änderungen an Ihrem Code dem Synthesizer ermöglichen, auf verschiedene Komponenten zu schließen, also werfen Sie einen Blick auf das Synthesizer-Handbuch für einige Vorlagen. Möglicherweise müssen Sie den Synthesizer umschalten, um für die Fläche statt für die Geschwindigkeit zu optimieren. Stellen Sie außerdem sicher, dass Sie keine Infer-Einstellungen deaktiviert haben. Ich habe einmal versucht, eine Designkomponente zu synthetisieren, die 40 % einer Spartan 3E 500 (9.312 LUT/FF-Paare mit 4 Eingängen, 5,6 KB Block-RAM) für eine Virtex 6 HXT 565 (354.240 LUT/Dual-FF-Paare mit 6 Eingängen, 32 MB-Block-RAM). Es dauerte 7 Stunden, bis Xilinx Par beendet war, und nahm ungefähr 40 % des Chips ein. ?!?!?!? Es stellte sich heraus, dass der Infer-Block-RAM ausgeschaltet war und der Synthesizer mehrere KB RAM in LUTs umgewandelt hat. Nicht die effizienteste Entscheidung aller Zeiten. Nach dem Ändern der Einstellung nahm es etwa 1% des Chips ein. Stelle dir das vor. 312 LUT/FF-Paare mit 4 Eingängen, 5,6 KB Block-RAM) für eine Virtex 6 HXT 565 (354.240 LUT/Dual-FF-Paare mit 6 Eingängen, 32 MB Block-RAM). Es dauerte 7 Stunden, bis Xilinx Par beendet war, und nahm ungefähr 40 % des Chips ein. ?!?!?!? Es stellte sich heraus, dass der Infer-Block-RAM ausgeschaltet war und der Synthesizer mehrere KB RAM in LUTs umgewandelt hat. Nicht die effizienteste Entscheidung aller Zeiten. Nach dem Ändern der Einstellung nahm es etwa 1% des Chips ein. Stelle dir das vor. 312 LUT/FF-Paare mit 4 Eingängen, 5,6 KB Block-RAM) für eine Virtex 6 HXT 565 (354.240 LUT/Dual-FF-Paare mit 6 Eingängen, 32 MB Block-RAM). Es dauerte 7 Stunden, bis Xilinx Par beendet war, und nahm ungefähr 40 % des Chips ein. ?!?!?!? Es stellte sich heraus, dass der Infer-Block-RAM ausgeschaltet war und der Synthesizer mehrere KB RAM in LUTs umgewandelt hat. Nicht die effizienteste Entscheidung aller Zeiten. Nach dem Ändern der Einstellung nahm es etwa 1% des Chips ein. Stelle dir das vor.

Es würde sich lohnen, den gesamten Abschnitt „Ressourcennutzung“ aus der Toolausgabe zu veröffentlichen.

Verwenden Sie alle Block-RAMs? Es ist üblich, logische/mathematische Funktionen durch äquivalente RAM-Nachschlagetabellen ersetzen zu können, wenn die Domäne ausreichend eingeschränkt ist und sie ausreichend komplex sind, um eine Vorabberechnung zu lohnen.

Das Gleiche gilt neben dem Rückschluss auf das Gedächtnis auch für Multiplikatoren. Manchmal kann eine winzige Abweichung von der empfohlenen Instanziierungsvorlage den Multiplikator, der auf DSP48A-Einheiten abgeleitet wird, durcheinanderbringen.

Wenn Sie den PCIe-Controller verwenden, können Sie den gesamten Pufferspeicherplatz, der für TLP-Nutzlasten reserviert ist, oder die maximale TLP-Paketgröße reduzieren? Dies kann die RAM-/Logiknutzung des IP-Kerns auf Kosten der Durchsatz-/Gesamtbandbreite reduzieren.

Mit (Altera) Quartus können Sie Elemente in der Design-Hierarchieansicht mehrfach auswählen und dort die Nutzung des Post-P&R-Bereichs farbkodiert/geclustert sehen. Dies kann eine visuelle Vorstellung von der relativen Verwendung Ihrer Designmodule geben.

Vielen Dank. Ich verwende die Hard-IP-Makros für die Multiplikatoren und ich habe CoreGen verwendet, um die FIFOs zu erstellen, obwohl ich einige der kleinen Fifos ausgewählt habe, um verteiltes RAM (anstelle von Block-RAM) zu verwenden. Ich werde mich mit deren Verwendung befassen.