Verilog Control Flow meistern: IF-ELSE, Case, Loops und mehr
Hardware-Verhalten lässt sich ohne bedingte Anweisungen und andere Möglichkeiten zur Steuerung des Logikflusses nicht implementieren. Verilog bietet eine Reihe von Control-Flow-Blöcken und -Mechanismen, um dies zu erreichen.
if-else-if
Diese bedingte Anweisung dient dazu, eine Entscheidung darüber zu treffen, ob bestimmte Anweisungen ausgeführt werden sollen oder nicht. Sie ist der if-else-if-Anweisung in C sehr ähnlich. Wenn der Ausdruck zu true ausgewertet wird, wird die erste Anweisung ausgeführt. Wenn der Ausdruck zu false ausgewertet wird und ein else-Teil existiert, wird der else-Teil ausgeführt.
// if-Anweisung ohne else-Teil
if (expression) [statement]
// if-Anweisung mit else-Teil
if (expression) [statement] else [statement]
// if-else für mehrere Anweisungen muss
// in "begin" und "end" eingeschlossen werden
if (expression) begin [multiple statements] end
else begin [multiple statements] end
// if-else-if-Anweisung
if (expression) [statement]
else if (expression) [statement]
else [statement]
Der else-Teil eines if-else ist optional und kann Verwirrung stiften, wenn ein else in einer verschachtelten if-Folge weggelassen wird. Um diese Verwirrung zu vermeiden, ist es einfacher, das else immer dem vorherigen if zuzuordnen, dem ein else fehlt. Eine andere Möglichkeit ist, Anweisungen in einen begin-end-Block einzuschließen. Der letzte else-Teil behandelt den "none-of-the-above"- oder Default-Fall, bei dem keine der anderen Bedingungen erfüllt war.
Hier klicken, um mehr über if-else-if zu erfahren
Schleifen bieten eine Möglichkeit, einzelne oder mehrere Anweisungen innerhalb eines Blocks ein- oder mehrmals auszuführen. In Verilog gibt es vier verschiedene Arten von Schleifenanweisungen.
forever-Schleife
Diese führt die Anweisungen innerhalb des Blocks kontinuierlich aus.
forever [statement]
forever begin [multiple statements] end
Beispiel
module my_design;
initial begin
forever begin
$display ("This will be printed forever, simulation can hang ...");
end
end
endmodule
Simulationslog:
ncsim> run This will be printed forever, simulation can hang ... This will be printed forever, simulation can hang ... ... This will be printed forever, simulation can hang ... This will be printed forever, simulation can hang ... This will be printed forever, simulation can hang ... This will be printed forever, simulation can hang ... Result reached the maximum of 5000 lines. Killing process.
repeat-Schleife
Diese führt Anweisungen eine feste Anzahl von Malen aus. Wenn der Ausdruck zu X oder Z ausgewertet wird, wird er als Null behandelt und gar nicht ausgeführt.
repeat ([num_of_times]) begin [statements] end
repeat ([num_of_times]) @ ([some_event]) begin [statements] end
Beispiel
module my_design;
initial begin
repeat(4) begin
$display("This is a new iteration ...");
end
end
endmodule
Simulationslog:
ncsim> run This is a new iteration ... This is a new iteration ... This is a new iteration ... This is a new iteration ... ncsim: *W,RNQUIE: Simulation is complete.
while-Schleife
Diese führt Anweisungen so lange aus, wie ein Ausdruck wahr ist, und beendet sich, sobald die Bedingung falsch wird. Wenn die Bedingung von Anfang an falsch ist, werden die Anweisungen überhaupt nicht ausgeführt.
while (expression) begin [statements] end
Beispiel
module my_design;
integer i = 5;
initial begin
while (i > 0) begin
$display ("Iteration#%0d", i);
i = i - 1;
end
end
endmodule
Simulationslog:
ncsim> run Iteration#5 Iteration#4 Iteration#3 Iteration#2 Iteration#1 ncsim: *W,RNQUIE: Simulation is complete.
for-Schleife
for (initial_assignment; condition; increment_variable) begin [statements] end
Dies steuert Anweisungen mittels eines Dreischritt-Prozesses:
- Initialisierung einer Schleifenzählervariablen
- Auswertung des Ausdrucks, normalerweise mit der Schleifenzählervariablen
- Inkrementieren der Schleifenzählervariablen, sodass der Ausdruck später falsch wird und die Schleife beendet wird
Beispiel
module my_design;
integer i = 5;
initial begin
for (i = 0; i < 5; i = i + 1) begin
$display ("Loop #%0d", i);
end
end
endmodule
Simulationslog:
ncsim> run Loop #0 Loop #1 Loop #2 Loop #3 Loop #4 ncsim: *W,RNQUIE: Simulation is complete.
Hier klicken, um mehr über for-Schleifen zu erfahren.
Verilog
- C# Ausdrücke, Anweisungen & Blöcke: Umfassender Leitfaden mit Beispielen
- Java Ausdrücke, Anweisungen und Blöcke verstehen
- Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
- Verilog Concatenation meistern: Praktischer Leitfaden
- Verilog Assignments verstehen: Typen, Syntax und Best Practices
- Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
- Verilog Control Flow meistern: IF-ELSE, Case, Loops und mehr
- Verilog Functions meistern für effizientes RTL-Design
- Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
- Verilog Delay Control verstehen: Timing-Techniken und Best Practices