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