Menu
Coddy logo textTech

Blockierende Zuweisung

Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 49 von 90.

Verilog hat zwei Arten von prozeduralen Zuweisungen: blocking (=) und non-blocking (<=). In dieser Lektion konzentrieren wir uns auf blocking assignment.

Blockierende Zuweisung (Blocking assignment) verwendet den =-Operator. Sie wird „blockierend“ genannt, weil sie die Ausführung der nächsten Anweisung blockiert, bis die aktuelle Zuweisung abgeschlossen ist. Der Code läuft Schritt für Schritt in Reihenfolge ab.

Syntax:

variable = expression;

Wann Blocking Assignment verwendet wird

Blocking Assignment (=) wird für kombinatorische Logik verwendet — Schaltungen, bei denen sich die Ausgänge sofort ändern, wenn sich die Eingänge ändern, ohne Takt und ohne Speicher.

Beispiele für kombinatorische Logik:

  • AND- / OR- / XOR-Gatter
  • Addierer und Subtrahierer
  • Multiplexer
  • Decoder

Verilog-Beispiel:

always @(*) begin
  sum = a + b;      // blockierende Zuweisung
  carry = a & b;    // blockierende Zuweisung
end

Blocking in Always-Blöcken (Kombinatorische Logik)

always @(*) begin
  temp = a & b;    // Schritt 1
  out = temp | c;  // Schritt 2 (verwendet temp aus Schritt 1)
end

Die Reihenfolge ist wichtig. Für Kombinationslogik ist das in Ordnung.

Blocking vs Non-Blocking

 Blocking (=)Non-blocking (<=)
ExecutionNacheinanderAlle auf einmal
Next line waits?JaNein
UsesKombinatorische LogikSequenzielle Logik (Flipflops)

Wichtig: Verwenden Sie kein Blocking für Flip-Flops

challenge icon

Aufgabe

Füge die fehlenden blockierenden Zuweisungen hinzu, um die Werte von x und y mithilfe einer temporären Variable zu vertauschen.

Was zu tun ist:

  1. Weise den Wert von x der Variable temp zu (speichere x in temp)
  2. Weise den Wert von y der Variable x zu (verschiebe y nach x)
  3. Weise den Wert von temp der Variable y zu (verschiebe das gespeicherte x nach y)

Probier es selbst

module swap;
  reg x, y;
  reg temp;
  
  initial begin
    x = 1;
    y = 0;
    
    $display("Before swap: x=%d, y=%d", x, y);
    
    // TODO: Schritt 1 - Weise x temp zu
    
    // TODO: Schritt 2 - Weise y x zu
    
    // TODO: Schritt 3 - Weise temp y zu
    
    $display("After swap: x=%d, y=%d", x, y);
    $finish;
  end
endmodule
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen