wosnet schrieb:
> <= in Verilog ist eine konkurrierende Zuweisung, d.h. die Zuweisung
> erfolgt parallel.
Nein. Das findet alles in einem Block statt. Da gibt es keine parallelen
Zuweisungen.
> Wenn die Bedingung wahr wird, entsteht eine 'race
> condition', d.h. es ist grundsätzlich erstmal unklar was passiert.
Verilog ist zwar voll von Möglichkeiten race conditions zu produzieren,
hier ist der Fall aber klar.
> Man könnte die Zuweisungen in sequentielle Zuweisungen mit = ändern, die
> werden dann sicher nacheinander abgearbeitet. Das ist allerdings in
> einem getakteten Block schlechter Coding-Stil.
Ein blocking assignment mit dem = Operator wird hier nicht "sicherer
nacheinander" abgearbeitet. Auch ist das Verwenden desselben innerhalb
eines Blocks kein schlechter Stil, wohl aber bei Variablen, die von
mehreren Blöcken zugewiesen werden, da man dann in der Tat nicht weiß,
in welcher Reihenfolge die Zuweisungen erfolgen.
> q ist übrigens keine Variable, sondern ein Register.
Verilog kennt die Konzepte "variable" und "net". Verwirrenderweise wird
ersteres durch das Schlüsselwort "reg" (seit 1364-2001 auch "var")
definiert, letzteres durch "wire". Daneben gibt es für beide auch
exotischere Konstrukte, die allerdings selten in RTL code verwendet
werden.
Der wesentliche Unterschied ist, dass eine Variable den letzten ihr
zugewiesenen Wert behält (speichert), während ein "net" einem Knoten in
einem elektrischen Netzwerk entspricht.