Forum: FPGA, VHDL & Co. Compilation beschleunigen?


von Bert (Gast)


Lesenswert?

Ich habe ein Problem mit der Dauer der VHDL-Synthese:

Eines (und demnächst ein weiteres) Modul umfasst dynamisch erzeugte 
Tabellen für 8 Fälle, 3 Flags und einen 6-Bit Eingangswert mit 24 Bit 
Ausgang. Die Tabelle kommt von Mathlab und wird als grosses "when 
case"-array in den code kopiert. Es sind die meisten Fälle belegt, 
trotzdem soll kein RAM benutz werden, da vieles ähnlich. Das schlaue 
Qartus packt die riesen Tabelle auch sehr schön auf einige wenige LUTs 
zusammen und erzeugt einen kleinen Code ohne RAM zu verschwenden.


Problem: Das dauert jedesmal ewig. Ich habe es als ein Modul getestet 
und er macht da alleine 11min dran umher. Das ist die halbe 
Synthesezeit. Kann ich das irgendwie beschleunigen?

Beim C compiliert das System in eine Lib und der Objektcode wird einfach 
gelinkt und nicht jedesmal neu erzeugt, wenn sich die Source nicht 
geändert hat. Kann VHDL das auch?

Wie bringe ich dem Quartus das bei?

Die Tabelle wird nur noch selten geändert und bald tut sich gar nicht 
mehr. Ich muss wegen Tests aber alle halbe Stunden übersetzen.

von Duke Scarring (Gast)


Lesenswert?

Bert schrieb:
> Problem: Das dauert jedesmal ewig. Ich habe es als ein Modul getestet
> und er macht da alleine 11min dran umher. Das ist die halbe
> Synthesezeit. Kann ich das irgendwie beschleunigen?
Theoretisch kann man da eine Netzliste (z.B. EDIF) draus machen. 
Praktisch habe ich dazu keine Erfahrungen.

Je nach Projekt habe/hatte ich Synthesezeiten zwischen 3 min, 1 h und 8 
h.
Auch damit kann (bzw. muß) man sich arrangieren.

Es geht leider nicht so schnell wie bei Software. Wobei die ersten 
Linuxkernel auch ihre 4 h Compilezeit gebraucht haben...

Duke

von Andi (Gast)


Lesenswert?

Bert schrieb:
> Tabellen für 8 Fälle, 3 Flags und einen 6-Bit Eingangswert mit 24 Bit

Sind die 3 Flags um die 8 Fälle zu unterscheiden, oder kommen die noch 
dazu. Anders gefragt, sind es 9 oder 12 Eingangsbits für die Tabelle?

Bei 9 Bits würden nur 2 BlockRams benötigt, und man könnte die Tabelle 
dann als *.MEM Datei einbinden, was so gut wie keine Synthesezeit 
verbraucht.

Nach den vielen Tests kannst du dann ja immer noch eine LUT-Logik, 
anstatt der RAM Tabelle erzeugen lassen.

von Markus F. (mfro)


Lesenswert?

Bert schrieb:
> Wie bringe ich dem Quartus das bei?

Quartus kann mit design partitions umgehen und die (mit gewissen 
Einschränkungen) für "Incremental Compilation" nutzen (d.h. sie werden 
nur dann neu angefasst, wenn sich daran etwas geändert hat).

Einen Haken hat die Sache (wie immer) allerdings: Du musst dafür in die 
Tasche greifen - die Web Edition kann das nicht.

von Bert (Gast)


Lesenswert?

Andi schrieb:
> Sind die 3 Flags um die 8 Fälle zu unterscheiden, oder kommen die noch
> dazu. Anders gefragt, sind es 9 oder 12 Eingangsbits für die Tabelle?

Es sind 14-16 Bits, jenachdem wie die Fälle definiert sind. Die hängen 
von PCB-IOs, Version und Korrekturkurven zusammen.

> man könnte die Tabelle dann als *.MEM Datei einbinden
Hatte ich bereits angedacht, aber die Tabelle hätte 90% Lücken und das 
bekomme ich nicht ins FPGA. Nicht in den Mickerling, den man mir gegeben 
hat.

Markus F. schrieb:
> Einen Haken hat die Sache (wie immer) allerdings: Du musst dafür in die
> Tasche greifen - die Web Edition kann das nicht.
Ja, das habe ich auch bereits herausgefunden. Schade und ärgerlich.

Auf der anderen Seite wollen die natürlich verkaufen.

Eine andere Idee: Gibt es eigentlich "offline-Vereinfacher" für 
Schaltungslogik, die nur die Bis kriegen und dann diese händische 
Vereinfachung machen, die man an der Hochschule lernt? Quine-McClusky 
hiess das glaube ich.

von Duke Scarring (Gast)


Lesenswert?

Bert schrieb:
> Eine andere Idee: Gibt es eigentlich "offline-Vereinfacher" für
> Schaltungslogik, die nur die Bis kriegen und dann diese händische
> Vereinfachung machen, die man an der Hochschule lernt? Quine-McClusky
> hiess das glaube ich.
Hab ich die Tage erst mit Xilinx ISE gemacht. Wenn man als Target einen 
CPLD einstellt, bekommt man die reduzierten Gleichungen ausgespuckt.

Oder händisch, nach Karnaugh:
http://www.mathematik.uni-marburg.de/~thormae/lectures/ti1/code/karnaughmap/

Duke

von Bert (Gast)


Lesenswert?

Danke das werde ich mir ansehen.

von Fpgakuechle K. (Gast)


Lesenswert?

Bert schrieb:
> Beim C compiliert das System in eine Lib und der Objektcode wird einfach
> gelinkt und nicht jedesmal neu erzeugt, wenn sich die Source nicht
> geändert hat. Kann VHDL das auch?

Da gibt es mehrere Ansätze, der üblich gepriesenen ist "Incremental 
Compilation":
https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/wp/wp-01062-quartus-ii-increasing-productivity-incremental-compilation.pdf

Dem Oject-code vergleichnar ist die Netzliste. In der finden sich die 
Grundcomponenten wie FF LUT etc. Man kann diese Netzliste auch als VHDL 
rausschreiben lassen und dann wie eine RTL-VHDL Verhaltensbeschreibung 
zu den Quellcodes hinzufügen. Oder auch in irgendeinem Quartus 
akzeptierten Netzlistenformat. Stichworte sind "Generate Post synthesis 
netlist"

von Markus F. (mfro)


Lesenswert?

Fpga K. schrieb:
> Man kann diese Netzliste auch als VHDL
> rausschreiben lassen und dann wie eine RTL-VHDL Verhaltensbeschreibung
> zu den Quellcodes hinzufügen. Oder auch in irgendeinem Quartus
> akzeptierten Netzlistenformat. Stichworte sind "Generate Post synthesis
> netlist"

Mich würde interessieren, wie das praktisch aussehen könnte.

quartus_eda kann zwar (für die Gatelevel-Simulation) die Netzliste (des 
gesamten Projekts) rausschreiben, die Ergebnisdatei ist - offensichtlich 
- auch VDHL, erscheint mir aber als Input für eine weitere (manuelle) 
Verarbeitung völlig ungeeignet, weil sie m.E. praktisch unlesbar ist.

von Christoph Z. (christophz)


Lesenswert?

Markus F. schrieb:
> quartus_eda kann zwar (für die Gatelevel-Simulation) die Netzliste (des
> gesamten Projekts) rausschreiben, die Ergebnisdatei ist - offensichtlich
> - auch VDHL, erscheint mir aber als Input für eine weitere (manuelle)
> Verarbeitung völlig ungeeignet, weil sie m.E. praktisch unlesbar ist.

Ja, diesen generierten Code will niemand lesen. Dafür ist er nicht 
gemacht :-)

Im hier diskutierten Fall müsstest du das in zwei Projekte zerlegen.

Im ersten Projekt sind nur diese riesigen Tabellen drin. Die lässt du 
dir synthetisieren und die Post-Synthesis Netzliste in VHDL 
rausschreiben.
Die Tabellen und die Post-Synthesis Netzliste haben die selbe Entity 
Definition.

Im zweiten Projekt, deinem eigentlichen Design instanzierst du diese 
Entity ganz normal als component.
Jetzt hast du zwei Möglichkeiten, zu wählen welche architecture wirklich 
simuliert/synthetisiert wird:
- Im Synthese/Simulations Skript oder im IDE Projekt die jeweils 
passende Datei inkludieren
- Das VHDL Feature der configuration nutzen

von Markus F. (mfro)


Lesenswert?

in der Theorie zumindest mag ich dir zustimmen.

In der Praxis enthält die Tabellen-Component (die ja zum Toplevel 
geworden ist) "plötzlich" plötzlich endlos IO-Bufs, die man da erst mal 
chirurgisch wieder rausoperieren müsste, um das Ergebnis verbauen zu 
können.

Mag sein, dass man das hinkriegt, aber - uiuiuiui - da muss man schon 
ganz schön verzweifelt sein...

von Da D. (dieter)


Lesenswert?

Markus F. schrieb:
> In der Praxis enthält die Tabellen-Component (die ja zum Toplevel
> geworden ist) "plötzlich" plötzlich endlos IO-Bufs, die man da erst mal
> chirurgisch wieder rausoperieren müsste, um das Ergebnis verbauen zu
> können.

Genau dafür gibts "virtual pins". Damit landen die IOs bei synthese 
nicht auf IO Buffern, sondern können direkt intern weiter verwendet 
werden, wenn man die Netzliste irgendwo einbindet.

https://www.intel.com/content/www/us/en/programmable/support/support-resources/design-examples/design-software/tcl/all_virtual_pins.html

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

Da D. schrieb:
> Genau dafür gibts "virtual pins". Damit landen die IOs bei synthese
> nicht auf IO Buffern, sondern können direkt intern weiter verwendet
> werden, wenn man die Netzliste irgendwo einbindet.

das hast Du nicht ausprobiert, oder?

Die virtual pins sind - wenn ich das richtig sehe - quartus_eda nämlich 
vollkommen egal. Das .vho-File sieht bis auf's i-Tüpfelchen gleich aus 
(und enthält massig hübsche ...io_ibufs und ...io_obufs).

von Da D. (dieter)


Lesenswert?

Markus F. schrieb:
> das hast Du nicht ausprobiert, oder?

Komisch, ich hab das schonmal benutzt. Da wurden dann die Virtual Pins 
dann nicht mehr auf Device Pins gelegt. Und laut der Beschreibung für 
Virtual Pins ist das auch für genau den Anwendungsfall gedacht.

von Martin S. (strubi)


Lesenswert?

Was ist denn wirklich dabei der Flaschenhals, die Synthese oder das 
Place'n'Route?
Ich hab' da mit Quartus keine Erfahrung, aber mit den 
Xilinx/Lattice-Toolchains kann man binäre Netzlistenobjekte erstellen 
und als Black Box instanzieren. Da spart man aber nur bei der Synthese 
in die Netzliste Zeit. Die meiste Zeit verbrät bei mir das PnR, ich 
fürchte, dass man da die Kontrolle über eine inkrementelle 
Partitionierung nur bedingt bekommt...

von Bert (Gast)


Lesenswert?

Da D. schrieb:
> Genau dafür gibts "virtual pins". Damit landen die IOs bei synthese
> nicht auf IO Buffern, sondern können direkt intern weiter verwendet
> werden, wenn man die Netzliste irgendwo einbindet.

Wie verbaue ich die beim Altera (oder gfs auch beim Xilinx).

Martin S. schrieb:
> Was ist denn wirklich dabei der Flaschenhals, die Synthese oder das
> Place'n'Route?
Gute Frage. Beides dauert entsprechend lang.

> Ich hab' da mit Quartus keine Erfahrung, aber mit den
> Xilinx/Lattice-Toolchains kann man binäre Netzlistenobjekte erstellen
> und als Black Box instanzieren.
Wie müsste ich das tun? Ich würde es mal probieren wollen, rein zum 
testen, ob es was bringt.

von Markus F. (mfro)


Lesenswert?

Bert schrieb:
> Wie verbaue ich die beim Altera (oder gfs auch beim Xilinx).

Indem Du im Assignment Editor deine Toplevel-Pins ebenso definierst.

von Markus F. (mfro)


Lesenswert?

ich hab' ein wenig rumgespielt: "ein bißchen" Design-Partitions gehen 
durchaus auch mit der Quartus Web Edition.

In einem separaten Projekt ein Toplevel-Entity ausformulieren und die 
Pins als virtual pins definieren.

Exportieren als Design-Partition mit quartus_cdb:
1
quartus_cdb <projekt> --incremental_compilation_export

Die dabei entstandene Netlist lässt sich in einem anderen Projekt 
wiederverwenden (das .qxp-File einfach zum Projekt hinzufügen und eine 
passende Component-Deklaration erzeugen).

Funktioniert. Auch mit der Web-Edition. Die post-fitting netlist sieht 
im RTL viewer einigermassen vernünftig aus. Ob und was das tatsächlich 
bezüglich Geschwindigkeit bringt, habe ich (noch) nicht gemessen.

von Bert (Gast)


Lesenswert?

Danke dir für Deine Hilfe! Werde ich ausprobieren und berichten.

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.