mikrocontroller.net

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


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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:
if buffer_is_free /= '1' then
  wait until (buffer_is_free = '1');
end if;

Autor: gast (Gast)
Datum:

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

Autor: waiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Warum will wait until ein togglen sehen?

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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: waiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: foo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Gabriel Wegscheider (gagosoft)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fpga4u (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.