Hallo,
wird ein Prozess ohne explizite Sensitivitätsliste einmal oder unendlich
oft durchlaufen? In der letzten Übung hieß es, der Prozess in Aufgabe
2a wird nur einfach durchlaufen, sodass nur das Signal a den Wert 1
annimmt. b und c bleiben beim Initialwert von 0.
Ich halte das für falsch, denn:
- es gibt keine explizite Sensitivitätsliste und
- keine Anweisungen aus denen implizit eine "generiert" würde.
Laut IEEE 1706-2008 gilt:
1
The execution of a process statement consists of the repetitive execution of its sequence of statements. After the last statement in the sequence of statements of a process statement is executed, execution will immediately continue with the first statement in the sequence of statements.
Das wird eingeschränkt durch:
1
If a process sensitivity list appears following the reserved word process, then the process statement is assumed to contain an implicit wait statement as the last statement of the process statement part; this implicit wait statement is of the form
2
3
wait on sensitivity_list;
Es werden zudem einige Regeln genannt, nach denen aus einigen
Anweisungen implizit eine Sensitivitätsliste generiert wird. Allerdings
gehört eine Zuweisung nicht dazu.
Liege ich richtig oder hab ich etwas übersehen?
Jep, deine Einschaetzung ist korrekt. Ich vermute mal da haette in die
Sensitivitylist ein all sollen.
Du kannst das auch einfach mal ausprobieren mit verschiedenen
Simulatoren. Die meisten werden einfach stupide bei 0 ps bleiben udn nix
bewegt sich vorwaerts, bis sie mit einem Speiche Problem den Dienst
quittieren.
Entsprechende Warnings solltest du aber bekommen, ala: "Possible
infinite loop".
Da wäre eine Simulation tatsächlich hilfreich.
Entweder der Prozess wird nie ausgeführt weil da ja auch keine Bedingung
drinnen steht bei der er ausgeführt werden soll. Dann läuft also die
Zeit, aber es ändert sich nix.
Oder der Simulator geht davon aus, dass der Prozess immer ausgeführt
werden soll.
Sinnvoller Code ist das trotzdem nicht.
-gb- schrieb:> Entweder der Prozess wird nie ausgeführt weil da ja auch keine Bedingung> drinnen steht bei der er ausgeführt werden soll. Dann läuft also die> Zeit, aber es ändert sich nix.
Wenn das passiert, waere es nicht IEEE 1706 konform.
Tobias B. schrieb:> Wenn das passiert, waere es nicht IEEE 1706 konform.
Sinnvoll oder nicht sinnvoll ist hier nicht die Frage. Es geht um ein
Lehrbeispiel, selbst mit Sensivitiyliste ist das nicht wirklich
sinnvoll. Vll. zieht die Aufgabe auch vgerade darauf ab, das zu
erkennen. Damit waere es durchaus sinnvoll.
So, simuliert und siehe da, das bleibt hängen bei 0 fs.
Das bedeutet dann also, dass wenn bei einem process die
Sensitivitätsliste fehlt, dann wird dieser immer ausgeführt, in jedem
Simulationsschritt.
Ja, das macht Sinn.
Für mich wäre es aber auch logisch gewesen, wenn der nie ausgeführt
worden wäre weil ja keine Bedingung angegeben ist bei der er ausgeführt
werden soll.
Wäre das aber so, würde ein process ohne Sensitivitätsliste aber mit
wait until auch nie ausgeführt werden.
Gustl B. schrieb:> Für mich wäre es aber auch logisch gewesen, wenn der nie ausgeführt> worden wäre
Jeder Prozess ohne Sensitivliste wird zu Beginn der Simulation
gestartet. Das kann man leicht am "üblichen" Ablauf eines
Testbench-Prozesses sehen, der ja auch ohne Sensitivliste ausgeführt ist
und dann gleich mal losläuft, bis er auf das erste wait trifft. Und
dann (wie bei Prozessen ohne Sensitivliste üblich und sinnvoll) am Ende
des Prozesses diesen wieder von vorn beginnt:
1
-- Clock process definitions
2
Clk_process:process
3
begin
4
Clk<='0';
5
waitforClk_period/2;
6
Clk<='1';
7
waitforClk_period/2;
8
endprocess;
Und damit ist es logisch, was passiert, wenn da nirgends ein wait
ist...
Allerdings halte ich die fehlende Sensitivliste in der obigen Aufgabe
tatsächlich schlicht für einen Fehler.
Lothar M. schrieb:> Jeder Prozess ohne Sensitivliste wird zu Beginn der Simulation> gestartet.
Ausnahmslos jeder Prozess wird zu Beginn der Simulation gestartet und
bis zum ersten impliziten oder expliziten Wait ausgeführt.
Blechbieger schrieb:> Ausnahmslos jeder Prozess wird zu Beginn der Simulation gestartet und> bis zum ersten impliziten oder expliziten Wait ausgeführt.
Ja, und dazu ist die Information sinnvoll, dass eben jede Sensitivliste
ein implizites "wait on" ist:
1
process(a,b,c)begin-- implizites wait
2
d<=aafter2ns;
3
e<=bandc:
4
endprocess;
ist funktionell exakt dasselbe wie
1
processbegin
2
waitona,b,c;-- explizites wait
3
d<=aafter2ns;
4
e<=bandc:
5
endprocess;
Und so werden Prozesse mit Sensitivliste bei der Simulation erstmal
gestartet, um sofort danach wegen der Sensitivliste wieder angehalten zu
werden. "Von aussen" gesehen haben sie sich nicht mal den Bruchteil
einer Femtosekunde bewegt.
Die vermittelte Denkweise, dass mit der Änderung eines Signales in der
Sensitivliste ein Prozess von aussen "angetriggert" wird, ist also
eigentlich formell falsch. Sondern der von Simulationsbeginn an laufende
Prozess "wartet" implizit auf die Änderung eines Signals. Es "warten"
also in objektorientierter Denkweise alle Prozesse parallel aktiv auf
eine Änderung eines Signals in ihrer Sensitivliste.
Weil jetzt aber auf dem Simulationsrechner keine Prozesse gleichzeitig
"laufen" oder "warten" können, sondern sich der Simulator eine Liste mit
Zeitpunkten für irgendwelche Aktionen und Neuberechnungen aufbaut und
abarbeitet, kommt der ganze Formalismus ins Stolpern. Und mit ihm der
geneigte VHDL-Anfänger, der jetzt gar nicht mehr versteht, wer da passiv
oder aktiv am Warten teilnimmt oder gar irgendwie angestoßen wird...
Eine eigene Frage?
Dieser Thread ist über 6 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.