Ich habe diese Seite http://www.asic-world.com/verilog/verilog_one_day3.html gelesen, als ich auf Folgendes gestoßen bin:
Normalerweise müssen wir Flip-Flops zurücksetzen. Jedes Mal, wenn die Uhr von 0 auf 1 wechselt (Posedge), prüfen wir, ob ein Reset aktiviert ist (synchroner Reset), und fahren dann mit der normalen Logik fort. Wenn wir genau hinschauen, 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 sequenziell innerhalb eines Anfangs / Endes aus, während "<=" nicht blockierend 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 Anweisungen assign außerhalb von always blocks 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?
assign
Anweisungen kommen außerhalb von always-Blöcken vor und werden im Allgemeinen zur Beschreibung der kombinatorischen (nicht zwischengespeicherten) Logik verwendet (während always-Blöcke mit einigen Ausnahmen die sequentielle Logik beschreiben). AFAIK,assign
Anweisungen werden immer "parallel" ausgeführt, wenn sich der LHS-Wert ändert.Zuweisungsanweisungen sind weder "blockierend" noch "nicht blockierend", sondern "kontinuierlich". Die Ausgabe einer assign-Anweisung entspricht immer der angegebenen Funktion ihrer Eingaben. "blockierende" und "nicht blockierende" Zuordnungen existieren nur innerhalb von Always-Blöcken.
Eine Sperrung wird sofort wirksam, wenn sie bearbeitet wird. Eine nicht blockierende Zuordnung erfolgt am Ende der Bearbeitung des aktuellen "Zeitdeltas".
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). Bei der Modellierung von kombinatorischer Logik ist es normalerweise effizienter, = zu verwenden, aber es spielt normalerweise keine Rolle.
Bei der Modellierung der sequentiellen Logik (z. B. immer @ (posedge clk)) werden normalerweise nicht blockierende Assingments verwendet. Auf diese Weise können Sie den "Zustand nach der Taktflanke" als "Zustand vor der Taktflanke" bestimmen.
Es ist manchmal nützlich, blockierende Zuweisungen in sequentiellen Blöcken immer als "Variablen" zu verwenden. Wenn Sie dies tun, müssen Sie zwei wichtige Regeln beachten.
Ein Verstoß gegen diese Regeln kann zu Synthesefehlern und / oder Verhaltensunterschieden zwischen Simulation und Synthese führen.
quelle
Der Begriff Blockierungszuweisung verwirrt die Menschen, da das Wort Blockierung anscheinend eine zeitlich sequentielle Logik suggeriert. In der synthetisierten Logik bedeutet dies jedoch nicht , da alles parallel arbeitet .
Ein weniger verwirrender Begriff wäre möglicherweise die sofortige Zuweisung , die die Zwischenergebnisse der Kombinationslogik immer noch von den Eingaben zu nicht transparenten Speicherelementen (zum Beispiel getakteten Registern) unterscheidet, die eine verzögerte Zuweisung haben können .
Aus legalistischer Sicht läuft alles sehr gut. Tatsächlich können Sie davon ausgehen, dass es sich auch innerhalb von Sequenzen
=
um eine blockierende (zeitlich sequentielle) Operation handeltalways_comb
. Die Unterscheidung zwischen zeitlich sequentiell und parallel macht in diesem Fall jedoch absolut keinen Unterschied , da diealways_comb
Block so definiert ist, dass er sich wiederholt, bis die Befehlssequenz in einem stabilen Zustand konvergiert Anforderungen).Die synthetisierbare Teilmenge von Verilog (und insbesondere von SystemVerilog) ist äußerst einfach und benutzerfreundlich - sobald Sie die erforderlichen Redewendungen kennen. Sie müssen nur den geschickten Gebrauch der Terminologie hinter sich lassen, die mit den sogenannten Verhaltenselementen in der Sprache verbunden ist.
quelle
initial
Anweisungen innerhalb vonprogram
Blöcken gilt, ausschließlich (zeitlich sequentielle) Blockierungszuweisungen . Dies ist nützlich für das Testbench- Design, im Allgemeinen jedoch nicht für die RTL-Spezifikation.