Forum: FPGA, VHDL & Co. MyHDL Speicherbedarf bei Simulation großer Designs


von Vancouver (Gast)


Lesenswert?

Hallo,

ich spiele gerade ein bisschen mit MyHDL ein und verwende MyHDL 1.0dev 
mit Python3 auf Linux 64bit. Dabei bin ich auf das Problem gestoßen, 
dass während einer langläufigen Simulation der Memory-Footprint ständig 
wächst. Irgendwann ist dann natürlich Schluss und die Simulation raucht 
ab. Das Design ist ziemlich groß, im Detail ist es ein Mersenne-Twister 
MT19337. Den kann man auffassen als eine riesige FSM mit knapp 20k 
Zustandsbits und entsprechend komplexer Übergangs- und Ausgangsfunktion. 
Bis zum Absturz liefert die Simualtion korrekte Ergebnisse.

Ich stehe noch etwas im Dunkeln, woran das liegt, aber hat es etwas mit 
Slicing und Konkatenation von Signalen zu tun. Wenn ich die weglasse 
(was natürlich zu einer funktional falschen Simulation führt), dann 
bleibt der Speicherbedarf konstant (oder wächst so langsam, dass ich es 
nicht erkennen kann).

Das Problem tritt auf mit CPython2, CPython3 und PyPy3_beta, bei 
letzterem aber weniger drastisch. Mit Pypy3 kann ich mehr Schritte 
simulieren bevor der Speicher voll ist, als mit CPython (Und etwa 6mal 
so schnell. Coole Sache das PyPy)

Ich meine, der Speicherbedarf darf natürlich von der Designgröße 
abhängen, aber eigentlich nicht von der Simulationsdauer. Wozu sollten 
alte Zustände gespeichert werden? Das Problem ist unabhängig davon, ob 
ein vcd-Dump rausgeschrieben wird oder nicht.

Bevor ich hier Sourcecode poste, meine Frage: Hat jemand mal ein 
ähnliches Problem mit Myhdl gehabt?

: Verschoben durch Moderator
von Vancouver (Gast)


Lesenswert?

@Mod: Umf, sorry, das sollte in das FPGA Forum. Bitte verschieben.

von Jim M. (turboj)


Lesenswert?

Im Zweifel mal ein großes zusätzliches Swapfile anlegen: man mkswap, man 
swapon.

Außerdem mal mit ulimit -a die Limits anzeigen lassen, eventuell ist 
auch da was zu niedrig wie "stack size".

von Vancouver (Gast)


Lesenswert?

Die Speichergröße ist nicht das Problem. Wenn ich die Anzahl der 
Simulationschritte reduziere, läuft die Simulation bis zum Ende durch. 
Auf einem Rechner mit mehr Speicher liegt die Grenze eben höher. Ein 
2GB-Notebook schafft etwa 500 Schritte, ein PC mit 8GB etwa 8500. Mit 
genügend Schritten kann man so jeden PC plattmachen.

Die Frage ist, warum der Simulator im Betrieb überhaupt immer mehr 
Speicher reserviert. Das handgeschriebene VHDL-Simulationsmodell mit 
GHDL oder Modelsim zeigt dieses Verhalten nicht.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Vancouver schrieb:
> Das handgeschriebene VHDL-Simulationsmodell mit
> GHDL oder Modelsim zeigt dieses Verhalten nicht.

Wollte ich gerade vorschlagen, GHDL auszuprobieren ... MyHDL kenn ich 
garnicht, ist das besonders schnell oder toll?

Da du was von Python geschrieben hast, ist ersteres vmtl auszuschließen 
- interessieren würde es mich trotzdem :)

*edit*: Ah, sowas wie ein Python nach VHDL Translator ... Was es alles 
gibt^^

: Bearbeitet durch User
von Vancouver (Gast)


Lesenswert?

Mampf F. schrieb:
> Ah, sowas wie ein Python nach VHDL Translator

Nein, eigentlich nicht. MyHDL ist eine Python-basierte 
Hardwarebeschreibungssprache, d.h. Du beschreibst dein Design auf 
RTL-Level aber mit Sprachkonstrukten von Python. Das kannst du dann 
simulieren, indem Du es wie ein Python-Programm laufen lässt. Das ganze 
hat den Vorteil, dass du für die Verifikation den gesamten Sprachumfang 
von Python mit allen Bibliotheken nutzen kannst. Dagegen sieht selbst 
SystemVerilog ziemlich alt aus, nachdem was ich bisher ausprobiert habe.

Wenn alles funktioniert, kannst Du dann daraus VHDL oder Verilog 
erzeugen lassen und wie gewohnt weiterarbeiten. Für die HDL-Erzeugung 
ist natürlich nur ein Subset der Sprache geeignet.

Und laut Autor ist die Simulation schneller als übliche HDL-Simulatoren, 
was mich auch nicht wundert, zummindest wenn man PyPy verwendet. Aber 
bestätigen kann ich das noch nicht, ich habe noch keine direkte 
Gegenüberstellung gemacht.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Vancouver schrieb:
> Nein, eigentlich nicht. MyHDL ist eine ...

Vielen Dank für deine Erklärung! Das hört sich interessant an :)

Testbenches in VHDL sind oft wirklich schrecklich, wenn man so Sachen 
wie File I/O benötigt und furchtbar langsam ist es auch.

Ich glaube, ich teste das Tool mal ... Hätte eine Anwendung dafür ... 
Hatte den sagenumwobenen Chris Audio-Dynamic-Compressor 
(Audacity-Plugin) von Lisp nach Python nach C nach VHDL portiert ... Da 
könnte ich mal schauen, ob ich die Python-Version mit MyHDL zum Laufen 
bekomme :)

von Vancouver (Gast)


Lesenswert?

Mampf F. schrieb:
> ob ich die Python-Version mit MyHDL zum Laufen
> bekomme

Du kannst damit keinen normalen Python-Code in Hardware gießen. MyHDL 
hat fast die selben Konstrukte wie VHDL, aber formuliert in Python. Du 
musst Register und Schaltnetze beschrieben, einen Takt erzeugen und das 
Ganze in Komponenten strukturieren, von denen Du Instanzen erzeugst und 
miteinander verbindest. Es gibt Signale und Variablen ähnlich wie in 
VHDL.
Aber Du kannst natürlich den Python-Code deines Kompressors im selben 
Modell mitlaufen lassen und die Ergebnisse direkt vergleichen. Damit 
hast du den zentralen Vorteil von MyHDL ausgenutzt. Oder nur Teile in 
MyHDL umsetzen und als Model in the Loop mit Deiner Implementierung 
laufen lassen.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Okay, verstanden!

Nice, mir fallen da unzählige Dinge ein, die man damit effizient(er) 
lösen kann ... :)

Danke nochmal für deine Erklärungen!

von S. R. (svenska)


Lesenswert?

Ändert nur nix am zugrundeliegenden Problem... hast du mal beim 
Entwickler (Erfinder) von MyHDL angefragt, ob das Problem vllt bekannt 
ist?

von A. F. (chefdesigner)


Lesenswert?

Mampf F. schrieb:
> Testbenches in VHDL sind oft wirklich schrecklich, wenn man so Sachen
> wie File I/O benötigt und furchtbar langsam ist es auch.

Was wäre die Alternative?

von S. R. (svenska)


Lesenswert?

Sowas wie MyHDL, denn genau deswegen wurde es entwickelt.

von Vancouver (Gast)


Lesenswert?

S. R. schrieb:
> hast du mal beim
> Entwickler (Erfinder) von MyHDL angefragt

Nein, noch nicht. Ich bin dabei, ein einfaches Modell zu schreiben, das 
den gleichen Effekt zeigt.

von Strubi (Gast)


Lesenswert?

Moin,

klingt nach einem Problem mit zirkularen Referenzen - generell eine 
Python-Stolperfalle. Die Reference counts für die concat'teten Objekte 
würde ich mal ausgeben, wenn die sinnlos raufzählen, wird irgendwo was 
unbenötigtes nicht freigegeben. Muss nicht zwingend ein MyHDL-Bug sein.

von A. F. (chefdesigner)


Lesenswert?

Ergebnis der Untersuchung?

von Vancouver (Gast)


Lesenswert?

An F. schrieb:
> Ergebnis der Untersuchung?

Bisher keins wegen Zeitmangel. Aber ich muss mich ohnehin in nächster 
Zeit wieder damit auseinander setzen, dann werden wir weitersehen.

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.