Verilog Assign Statements: Kontinuierliche Signalzuweisung erklärt
Signale vom Typ wire (oder ähnliche wire-ähnliche Datentypen) erfordern kontinuierliche Wertzuweisung. Analogie: Elektrischer Draht auf Breadboard – solange +5V an einem Ende anliegen, bekommt das Bauteil am anderen Ende die Spannung.
In Verilog realisiert das assign Statement dies: wire wird kontinuierlich mit Wert getrieben (Konstante oder Expression aus Signalen).
Assign Syntax
assign = [drive_strength] [delay] ;
drive_strengthunddelayoptional, meist für Dataflow Modeling, weniger für Synthese.- RHS wird evaluiert und LHS (Net oder Net-Concatenation) zugewiesen.
- Delay-Werte modellieren Timing-Verhalten (wann Net neuen Wert erhält).
Regeln
- LHS: Scalar/Vector Net oder Concatenation davon – niemals Scalar/Vector Register.
- RHS: Kann Scalar/Vector Registers und Function Calls enthalten.
- Bei jeder Operanden-Änderung auf RHS wird LHS aktualisiert.
assign= Continuous Assignment – immer aktiv.
Beispiel #1: Einfaches AND-Gatter
Net out wird kontinuierlich durch i1 & i2 getrieben. Synthese → RTL-Schema mit AND-Gatter.
assign Statements eignen sich ideal für kombinatorische Gatter in Verilog.Beispiel #2: Komplexe Concatenation & Part-Select
Modul mit 4-Bit Input x, 1-Bit y, 5-Bit Output z. Verschiedene Assign-Cases (nur einer aktiv, sonst Contention → X):
module xyz (input [3:0] x, input y, output [4:0] z);
wire [1:0] a; wire b;
// x='hC, y='h1 → z='b11001 (0x19)
assign z = {x, y}; // Case 1: Concat 5 Bit → z
assign z[3:1] = {x, y}; // Case 2: Nur z[3:1] getrieben, z[4],z[0] = Z
assign z[3:1] = {x, y}; assign z[4] = 1; // Case 3: z[4]=1 → z='b1001Z
assign z[3:1] = {x, y}; assign z[3] = 0; // Case 4: Zwei Driver für bit3, beide 0 → OK, z='bZ001Z
assign z[3:1] = {x, y}; assign z[3] = 1; // Case 5: Zwei Driver, unterschiedliche Werte → Contention, z='bZX01Z
assign z = {x[1:0], y}; // Case 6: Part-Select RHS → z='b00001
assign z[2:0] = {x[1:0], y}; // Case 7: Nur z[2:0] → z='bZZ001
assign z = {3{y}}; // Case 8: Replication 3{y} = {y,y,y} → z='b00111
assign {a, b} = {x, y}; // Case 9: LHS Concat: a=2bit, b=1bit, RHS=5bit → LSBs: a='b00, b='b1
assign {a, b} = {x, y}; // Case 10: LHS Reihenfolge umgekehrt → a='b01, b='b0
endmodule
Assign auf reg Variablen
Illegal: reg Typ Variablen mit assign treiben. reg speichert Daten, braucht keine kontinuierliche Treibung. reg Signals nur in Prozeduralblöcken (initial, always) treibbar.
Implizite Continuous Assignment
Explizit: wire [1:0] a; assign a = x & y;
Implizit (bei Deklaration): wire [1:0] a = x & y;
Kombinatorische Logik Design
Digitaler Schaltkreis aus kombinatorischen Gattern + Verilog Code.
module combo (input a,b,c,d, output o);
assign o = ~((a & b) | c ^ d);
endmodule
Kombinatorik erfordert kontinuierliches Treiben der Inputs (anders als sequenzielle Elemente wie FFs, die Werte an Clock-Flanke speichern). assign passt perfekt: Output o aktualisiert bei jeder RHS-Änderung.
Synthese → kombinatorischer Schaltkreis. Waveform: o wird 1 wenn RHS true, 0 wenn false. 0-10ns: Inputs X → Output X.
Verilog
- C# Switch Statement meistern: Syntax, Beispiele & Best Practices
- C# Break Statement: Wie und wann man es einsetzt
- C# Continue Statement meistern: Schleifeniterationen effektiv überspringen
- Verilog Concatenation meistern: Praktischer Leitfaden
- Verilog Assignments verstehen: Typen, Syntax und Best Practices
- Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
- Verilog Functions meistern für effizientes RTL-Design
- Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
- Verilog Clock Generator: Design & Implementierungsleitfaden
- Verilog Math Functions meistern für effizientes Hardware-Design