Funktioniert prima. Jetzt moechte ich die zu simulierende HW auf eine
alte Plattform zurueck portieren. Da gibt es aber nur 128 Adressen fuer
ADDR. Also wuerde ich 'bank-switching' in der 'alten' uC-SW
implementieren um mehrere 128x32bit Werte im FPGA beschreiben zu
koennen.
Warum ich das will: Das hehre Ziel ist, dass die ca. 100 Besitzer der
alten HW dieselbe fuer den neuen Design nicht wegschmeissen muessen
(Kosten ca. 1kEUR pro Kiste).
Um jetzt nicht die eigentliche TB aendern zu muessen, koennte ich:
Als erstes in der procedure uc_wr_proc auf die passende Bank umschalten.
Um das nicht in einer extra procedure machen zu muessen, wuerde ich
gerne als ersten Funktionsblock in o.g. procedure einen Aufruf ala:
Hallo,
meines Wissens gibt es keine rekursive Hardware, für n Aufrufe müssten
die Gatter usw. auch n-mal vorhanden sein, und ausserdem ist n nicht
irgendwie begrenzt, aber unendliche Hardware gibt es auch nicht. Ein
Stacküberlauf ist also auch nicht verwunderlich.
Einen gewissen Sinn könnte das nur machen als Logikblock, dessen Ausgang
mit einem externen Takt immer wieder auf den Eingang rückgeführt wird,
aber das müsste ja initialisiert werden und überhaupt dürfte das die
Möglichkeiten automatischer Synthese überfordern.
Rekursivität ist ein völlig überschätztes Konzept und eigentlich nur in
der Theorie von Vorteil, in der praktischen Ausführung sind allgemein
Schleifen oder ein anderer Ersatz weit effektiver, auch in der Software.
Gruss Reinhard
Die procedure 'uc_wr_temp' ist die ehemalige 'uc_wr_proc'. Funzt auch
nicht, bin aber noch am analysieren, was da schief geht. Dass der erste
Ansatz (rekursiv) aufrufen schief ging, das kann ich mir mittlerweile
erklaeren. Warum's jetzt noch haengt, muss ich halt mal weiter suchen...
argh, ich habe die Simulation zu schnell abgebrochen...
Die obige Loesung funktioniert natuerlich wunderbar (also mit den 2x
'uc_wr_temp' Aufrufen). Also vergessen wir die urspruengliche Frage am
besten...
Reinhard Kern schrieb:> meines Wissens gibt es keine rekursive Hardware, für n Aufrufe müssten> die Gatter usw. auch n-mal vorhanden sein, und ausserdem ist n nicht> irgendwie begrenzt,
Doch, genau das ist der Trick an rekursiven Prozeduren: sie müssen
irgendwann fertig werden. Am besten vor der Stack zuende ist.
> aber unendliche Hardware gibt es auch nicht.
Wenn eine Prozedur zur Synthesezeit eine begrenzte und definierte
Stacktiefe benötigt, dann sollte sogar das Umsetzen in Hardware gehen.
Das ist dann ja nichts anderes als eine Schleife bekannter Länge.
Muss ich bei Gelegenheit mal ausprobieren, ob die Synthesizer schon so
weit sind... ;-)
Lothar Miller schrieb:> Muss ich bei Gelegenheit mal ausprobieren, ob die Synthesizer schon so> weit sind... ;-)
Also Synopsys DC ist schon seit mindestens 15 Jahren so weit. Siehe auch
die beliebte rekursive ld() Implementierung, welche dank dieser
Eigenschaft die einzige ist, die auch in Deklarationen eingesetzt werden
kann.
Seit mindestens zehn Jahren sind Syntheseprogramme in der Lage, Logik
automatisch von Iteration nach Rekursion zu transformieren. Man muss
sich daher nicht mehr das Hirn verknoten, wenn man eine "rekursive
Implementierung" haben moechte.
--
Marcus
Rekursionen können Probleme sehr vereinfachen.
Wenn man für jeden rekursiven Aufruf eine weitere Scheleife
verschachteln muss, so ist das gelinde gesagt "Mist"!
Hi zusammen,
also so wie hier: Beitrag "Re: Frage zu TB: Kann 'procedure' rekursiv aufgerufen werden?"
beschrieben funktioniert das (also einen Wrapper um die eigentliche
procedure). Nur will ich ja nicht jedesmal erst die 'bank' umschalten,
sondern nur bei Bedarf, also wenn neue 'bank' ungleich alter 'bank',
dann soll der zusaetzliche Schreibzugriff stattfinden.
Ich habe jetzt mal im vhdl-package ein Signal
definiert.
Wenn ich jetzt in meiner procedure 'last_addr_in' mit 'addr_in'
vergleichen wuerde, dann koennte ich den Schreibzugriff selektiv, also
nur wenn noetig, machen.
Sieht jetzt so aus:
Also am Ende der procedure merke ich mir die letzte Adresse, das koennte
ich dann (wenn es funktionieren wuerde) im 'if' mit einbeziehen (also ob
ich den 'uc_wr_temp()' machen muss oder nicht.
Jetzt kriege ich leider in GHDL folgende Fehlermeldung:
../tb_top_hugo_sim_pkg.vhd:255:7: signal "last_addr_in" is not a variable to be assigned
Das ist die Zeile
1
last_addr_in<=addr_in;
Nun zu der eigentlichen Frage: Kann ich sowas wie ein 'globales' Signal
im Package definieren und in einer procedure verwenden? (Anstelle
'global' waere auch ein 'static' (fuer C-Programmierer) moeglich)...
Hat da jemand 'nen Tipp fuer mich?
Also ich habe in meinem Stimuli-Prozess der TB eine variable 'last_addr'
eingefuegt, dann in jedem (auch indirekten) Aufruf der procedure
'uc_wr_proc' diesen Parameter als inout hinzugefuegt.
'last_addr' wird in der procedure gesetzt, ich muss also nicht noch in
der TB da irgendwelche weiteren statements einbauen. Naja, so funzt es
auf jeden Fall...
Funzt zwar, aber mit einer 'globalen' Variablen waere es weniger
Tipperei gewesen... Also wenn da jemand (fuer zukuenftige Sachen) einen
Tipp haette...
PS: Danke an alle die bisher hier gepostet haben. Hat mir beim konkreten
Problem zwar nicht 'ueber den Jordan' geholfen, aber da waren einige
interessante Anmerkungen dabei. Also merci!