Verilog Always Blocks: Syntax & Sensitivity Lists verstehen
Ein always Block ist einer der prozeduralen Blöcke in Verilog. Statements darin werden sequenziell ausgeführt.
Syntax
always @ (event) [statement]
always @ (event) begin [multiple statements] end
Ausführung bei definiertem Event. Event wird durch Sensitivity List definiert.
Was ist die Sensitivity List?
Ausdruck nach @ in Klammern (). Enthält ein oder mehrere Signale, deren Wertänderung den Block triggert.
// Ausführung bei Wertänderung von a ODER b
always @ (a or b) begin [statements] end
Wozu dient der always Block?
Realisiert kombinatorische oder sequenzielle Elemente. Sequenzielles Element (Flipflop) wird bei Clock/Reset aktiv. Kombinatorischer Block bei Input-Änderung. Hardware-Blöcke arbeiten konkurrierend. always Block als kontinuierlicher Prozess, getriggert bei Signal-Änderung in Sensitivity List.
Beispiel: Ausführung bei jeder positiven Flanke von clk.
always @ (posedge clk) begin [statements] end
Was passiert ohne Sensitivity List?
always Block wiederholt sich kontinuierlich während der Simulation. Sensitivity List bringt Timing-Semantik. Ohne Timing-Control-Statements → Zero-Delay Infinite Loop → Simulation hängt!
Beispiel: Hängende Simulation
always clk = ~clk; // Ausführung alle 0 Zeit-Einheiten → Endlosschleife bei Zeit 0
Selbst bei leerer Sensitivity List: Zeitverzögerung nötig. Simulation Time durch Delay-Statement im always voranbringen:
always #10 clk = ~clk; // Clock-Inversion alle 10 Zeit-Einheiten
Sequenzielles Element Design-Beispiel: T-Flipflop
Modul tff: Data Input d, Clock, Active-Low Reset rstn. Output invertiert wenn d==1 bei posedge Clock. always Block getriggert bei posedge clk ODER negedge rstn.
module tff (input d, clk, rstn, output reg q);
always @ (posedge clk or negedge rstn) begin
if (!rstn) q <= 0;
else if (d) q <= ~q;
else q <= q;
end
endmodule
Bei posedge Clock:
- Prüfe
rstn: 0 →q=0 (Reset), 1 → Default-Verhalten - Prüfe
d: 1 →qinvertieren, 0 →qhalten
Bei negedge Reset:
rstn Wert ist 0 → Reset angewendet → q=0.
Kombinatorisches Element Design-Beispiel
Digitaler Schaltkreis aus 3 Logikgattern → Output o.
module combo (input a,b,c,d, output reg o);
always @ (a or b or c or d) begin
o <= ~((a & b) | (c ^ d));
end
endmodule
Output o als reg deklariert (nutzung in Prozeduralblock). o = 1 wenn RHS true, 0 wenn false.
Verilog
- Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
- Verilog Concatenation meistern: Praktischer Leitfaden
- Verilog Essentials: Kurzer Überblick
- 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
- Verilog $timeformat meistern: Präzision und Anzeigesteuerung