Forum: FPGA, VHDL & Co. Seltsames Verhalten bei wait until.


von gast (Gast)


Lesenswert?

Ich habe mehrere Prozesse innerhalb einer Testbench, die auf einen 
Master Controller oder Subprozeduren warten und passend anworten. In 
einem Unterprogramm schreibe ich dann z.B. dies hier:
1
wait until (buffer_is_free = '1');
... wobei der Buffer frei sein könnte oder noch belegt, weshalb ich 
schon von "rising_edge" weggegangen bin. Der Prozess soll also gfs 
warten oder aber schon sofort losrennen, wenn das Signal auch 1 ist. 
Gesteuert wird das Signal  von "unten" und funktionier korrekt. Das kann 
man im Modelsim sehen.

Trotzdem klebt der Prozess oben an genau dieser Stelle fest und wartet.

Wenn das Signal aber mal 0 war und dann auf 1 geht, funktioniert es. 
Genauso ist es, wenn der Prozess oben "früher" kommt und fragt und noch 
auf ein Null trifft. Dann sieht er die kommende Eins!.

Nur wenn es schon Eins ist, bleibt er hängen. Warum will wait until ein 
togglen sehen?

Wie könnte man das lösen?

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

> Warum will wait until ein togglen sehen?

wait until legt den Prozess schlafen bis eine bestimmte Bedingung 
erfüllt ist, diese Bedingung wird aber nur ausgewertet wenn sie sich 
ändert.

Probier's mal damit:
1
if buffer_is_free /= '1' then
2
  wait until (buffer_is_free = '1');
3
end if;

von gast (Gast)


Lesenswert?

So sieht es aus, aber auch mit der Änderung geht es nicht.

von waiter (Gast)


Lesenswert?

> Warum will wait until ein togglen sehen?

das ist nun mal so bei WAIT UNTIL...
deshalb wird von wait until manchmal auch abgeraten.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

gast wrote:
> So sieht es aus, aber auch mit der Änderung geht es nicht.

Dann liegt dein Problem wahrscheinlich woanders. Mal mit single step 
ausprobiert was bei der if-Abfrage passiert?

von waiter (Gast)


Lesenswert?

>wait until (buffer_is_free = '1')
 funktioniert nur, wenn vorher buffer_is_free = '0' war.

wait until wartet auf eine Zustandsänderung, deshalb muß auch vorher der 
entgegengesetzte Zustand dagewesen sein!

von foo (Gast)


Lesenswert?

>wait until wartet auf eine Zustandsänderung, deshalb muß auch vorher der
>entgegengesetzte Zustand dagewesen sein!

Sicher? Reichts nicht wenn ein eine Transaktion auf dem
Signal zu Eins stattfindet?

von gast (Gast)


Lesenswert?

Fehler gefunden!

Es lag an der Bedingung selber. Wenn man es weglässt geht es. Fragt mich 
aber nicht warum. Sicher ein Modelsim bug!

von Gabriel W. (gagosoft)


Lesenswert?

Auch wenn Du schreibst: "Problem gelöst" so vermute ich, Du hast 
buffer_is_free nicht in der sensitivitylist gehabt, dann kann Modelsim 
teilweise darauf reagieren, kann es aber auch bleiben lassen.

von Fpga4u (Gast)


Lesenswert?

Nein, das ist kein Modelsim-Bug.

Wie hier bereits gesagt wurde, muss die "wait until" Abfrage mit
einer if Abfrage auf den komplementären Wert kombiniert werden.

if buffer_is_free = '0' then
  wait until (buffer_is_free = '1');
end if;

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Besser "/= '1'", es sind ja auch andere std_logic-Zustände möglich.

von Morin (Gast)


Lesenswert?

> Du hast buffer_is_free nicht in der sensitivitylist gehabt,

Natürlich nicht, denn er hat ja überhaupt keine sensitivity list 
verwendet. Sonst hätte er ja wait gar nicht benutzen dürfen.

> dann kann Modelsim teilweise darauf reagieren, kann es aber auch bleiben lassen.

Dann erklär doch mal, was man dagegen tun soll, wenn man wait verwenden 
will.

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.