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...
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
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.
Bert schrieb: > Wie verbaue ich die beim Altera (oder gfs auch beim Xilinx). Indem Du im Assignment Editor deine Toplevel-Pins ebenso definierst.
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.
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.