Ich las diese Seite http://www.asic-world.com/verilog/verilog_one_day3.html , als ich auf Folgendes stieß:
Normalerweise müssen wir Flip-Flops zurücksetzen, daher prüfen wir jedes Mal, wenn die Uhr den Übergang von 0 auf 1 (Posedge) durchführt, ob das Zurücksetzen aktiviert ist (synchrones Zurücksetzen), und fahren dann mit der normalen Logik fort. Wenn wir genau hinsehen, sehen wir, dass wir im Fall der kombinatorischen Logik "=" für die Zuweisung und für den sequentiellen Block den Operator "<=" hatten. Nun, "=" ist eine blockierende Zuweisung und "<=" ist eine nicht blockierende Zuweisung. "=" führt Code sequentiell innerhalb eines begin / end aus, während nicht blockierendes "<=" parallel ausgeführt wird.
Ich war mir ziemlich sicher, dass nicht blockierende Zuweisungen sequentiell waren, während blockierende Zuweisungen parallel waren. Schließlich können Sie blockierende Zuweisungen mit Assign-Anweisungen außerhalb von Always-Blöcken vornehmen, und diese werden alle parallel ausgeführt. Ist das ein Fehler oder ist das Verhalten innerhalb eines Always-Blocks anders? Und wenn das Verhalten innerhalb eines Always-Blocks unterschiedlich ist, können nicht blockierende Zuweisungen außerhalb eines Always-Blocks vorgenommen werden?
war ziemlich sicher, dass nicht blockierende Zuweisungen sequentiell waren, während blockierende Zuweisungen parallel waren.
Die blockierende Zuweisung wird "in Serie" ausgeführt, da eine blockierende Zuweisung die Ausführung der nächsten Anweisung blockiert, bis sie abgeschlossen ist. Daher können die Ergebnisse der nächsten Anweisung davon abhängen, ob die erste abgeschlossen ist.
Die nicht blockierende Zuweisung wird parallel ausgeführt, da sie Zuweisungen beschreibt, die alle gleichzeitig auftreten. Das Ergebnis einer Anweisung in der 2. Zeile hängt nicht von den Ergebnissen der Anweisung in der 1. Zeile ab. Stattdessen wird die 2. Zeile so ausgeführt, als wäre die 1. Zeile noch nicht geschehen.
Zuweisungsanweisungen sind weder "blockierend" noch "nichtblockierend", sie sind "kontinuierlich". Die Ausgabe einer Assign-Anweisung ist immer gleich der angegebenen Funktion ihrer Eingaben. "blockierende" und "nicht blockierende" Zuweisungen existieren nur innerhalb von Always-Blöcken.
Eine Sperrzuweisung wird sofort nach ihrer Bearbeitung wirksam. Am Ende der Verarbeitung des aktuellen "Zeitdeltas" findet eine nichtblockierende Zuweisung statt.
always-Blöcke können verwendet werden, um entweder kombinatorische oder sequentielle Logik zu modellieren (systemverilog hat always_comb und always_ff, um dies explizit zu machen). Beim Modellieren der kombinatorischen Logik ist es normalerweise effizienter, = zu verwenden, aber es spielt normalerweise keine Rolle.
Bei der Modellierung sequentieller Logik (z. B. immer @(posedge clk) ) verwenden Sie normalerweise nichtblockierende Zuweisungen. Damit lässt sich der „Zustand nach der Taktflanke“ im Sinne des „Zustands vor der Taktflanke“ bestimmen.
Manchmal ist es sinnvoll, blockierende Zuweisungen in sequentiellen Always-Blöcken als "Variablen" zu verwenden. Wenn Sie dies tun, müssen Sie zwei wichtige Regeln beachten.
Das Brechen dieser Regeln führt wahrscheinlich zu Synthesefehlern und/oder Verhaltensunterschieden zwischen Simulation und Synthese.
Der Begriff Blocking Assignment verwirrt die Leute, weil das Wort Blocking eine zeitsequentielle Logik vorzuschlagen scheint. Aber in der synthetischen Logik bedeutet es das nicht , weil alles parallel funktioniert .
Ein vielleicht weniger verwirrender Begriff wäre sofortige Zuweisung , was die Zwischenergebnisse der kombinatorischen Logik immer noch von den Eingängen zu nicht transparenten Speicherelementen (z. B. getakteten Registern) unterscheiden würde, die eine verzögerte Zuweisung haben können .
Aus juristischer Sicht funktioniert das alles sehr gut. Sie können sogar innerhalb von Sequenzen den =
als blockierende (zeitsequentielle) Operation betrachten. always_comb
Die Unterscheidung zwischen zeitsequentiell und parallel macht in diesem Fall jedoch absolut keinen Unterschied, da der always_comb
Block so definiert ist, dass er wiederholt wird, bis die Befehlsfolge zu einem stabilen Zustand konvergiert – genau das wird die Hardwareschaltung tun (wenn sie das Timing erfüllt). Bedarf).
Die synthetisierbare Teilmenge von Verilog (und insbesondere SystemVerilog) ist extrem einfach und leicht zu verwenden – sobald Sie die notwendigen Redewendungen kennen. Sie müssen nur die geschickte Verwendung von Terminologie überwinden, die mit den sogenannten Verhaltenselementen in der Sprache verbunden ist.
initial
program
Leerer Stern
Das Photon
assign
Anweisungen treten außerhalb von Always-Blöcken auf und werden im Allgemeinen verwendet, um kombinatorische (nicht zwischengespeicherte) Logik zu beschreiben (während Always-Blöcke, mit einigen Ausnahmen, sequentielle Logik beschreiben). AFAIK,assign
Anweisungen werden immer "parallel" ausgeführt, wenn ihre LHS eine Wertänderung aufweist.Leerer Stern
Das Photon
user_1818839
Leerer Stern
Peter Grün