Blockierende vs. nicht blockierende Zuweisung in Verilog
Beide sind Zuweisungen innerhalb eines always-Blocks in Verilog, unterscheiden sich aber im Zeitpunkt, zu dem die linke Seite aktualisiert wird. Die blockierende Zuweisung (=) aktualisiert die linke Seite sofort bei Ausführung der Zeile, und die nächste Zeile verwendet bereits den neuen Wert. Die nicht blockierende Zuweisung (<=) wertet zunächst alle rechten Seiten desselben Zeitpunkts aus und aktualisiert danach die linken Seiten gemeinsam. Grundregel: <= für taktgesteuerte sequenzielle Logik, = für always-Blöcke mit kombinatorischer Logik.
| Merkmal | Blockierende Zuweisung (=) | Nicht blockierende Zuweisung (<=) |
|---|---|---|
| Schreibweise | a = b; | a <= b; |
| Zeitpunkt der Aktualisierung der linken Seite | Sofort bei Ausführung der Zeile | Gemeinsam, nachdem alle rechten Seiten desselben Zeitpunkts ausgewertet wurden |
| In der nächsten Zeile sichtbarer Wert | Der neue, aktualisierte Wert | Der alte Wert vor der Aktualisierung |
| Abhängigkeit von der Reihenfolge | Ja. Vertauschen der Zeilen ändert das Ergebnis | Kaum. Wird derselben Variablen jedoch zweimal zugewiesen, bleibt die spätere Zuweisung wirksam |
| Entsprechendes Schaltungsverhalten | Kombinatorische Logik, die Zwischenwerte von oben nach unten berechnet | Flip-Flops, die an der Taktflanke gleichzeitig Werte übernehmen |
| Hauptsächlicher Einsatzort | always @(*) für kombinatorische Logik, prozedurale Abläufe in Testbenches | always @(posedge clk) für taktgesteuerte sequenzielle Logik |
| Zweistufiges Schieberegister (taktgesteuerter Block) | Bei q1 = d; q2 = q1; erhält auch q2 an derselben Flanke d; nur eine Stufe Verzögerung | Bei q1 <= d; q2 <= q1; erhält q2 das q1 von vor der Flanke; zwei Stufen |
| Vertauschen von Werten (taktgesteuerter Block) | Bei a = b; b = a; erhalten a und b denselben Wert | Bei a <= b; b <= a; werden a und b vertauscht |
| Zwischen mehreren always-Blöcken | Zwischen Blöcken an derselben Flanke entstehen leicht Race Conditions, bei denen das Ergebnis von der Ausführungsreihenfolge abhängt | Da die Auswertung der rechten Seiten zuerst abgeschlossen wird, entstehen kaum Race Conditions |
| Bei falscher Verwendung | In sequenzieller Logik hängt das Ergebnis von der Ausführungsreihenfolge der Blöcke ab und kann vom Verhalten der synthetisierten Schaltung abweichen | In kombinatorischer Logik werden Zwischenwerte veraltet gelesen; die Simulation weicht von der synthetisierten Schaltung ab oder wird unnötig erneut ausgeführt |
Die Zahlenwerte sind typische Größenordnungen und variieren je nach Prozessgeneration und Produkt.