Verilog controlestroom beheersen: IF-ELSE, Case, en meer
Hardwaregedrag kan niet geïmplementeerd worden zonder conditionele statements en andere manieren om de logica-stroom te controleren. Verilog beschikt over een set controlestroom-blokken en mechanismen om dit te bereiken.
if-else-if
Deze conditionele statement wordt gebruikt om een beslissing te maken over of bepaalde statements uitgevoerd moeten worden of niet. Dit lijkt veel op de if-else-if-statements in C. Als de expressie evalueert naar true, wordt het eerste statement uitgevoerd. Als de expressie false is en er een else-deel bestaat, wordt het else-deel uitgevoerd.
// if-statement zonder else-deel
if (expressie) [statement]
// if-statement met een else-deel
if (expressie) [statement] else [statement]
// if-else voor meerdere statements moet
// omsloten worden door "begin" en "end"
if (expressie) begin
[meerdere statements]
end else begin
[meerdere statements]
end
// if-else-if statement
if (expressie) [statement]
else if (expressie) [statement]
else [statement]
Het else-deel van een if-else is optioneel en kan verwarring veroorzaken als een else weggelaten wordt in een geneste if-reeks. Om deze verwarring te vermijden, is het eenvoudiger om de else altijd te associëren met de vorige if die geen else heeft. Een andere manier is om statements in een begin-end-blok te plaatsen. Het laatste else-deel handelt het geen-van-de-bovenstaande of standaardgeval af waar geen van de andere condities voldaan was.
Klik hier voor meer over if-else-if
Lussen bieden een manier om één of meerdere statements binnen een blok één of meerdere keren uit te voeren. Er zijn vier verschillende typen lusstatements in Verilog.
forever-lus
Deze voert de statements binnen het blok continu uit.
forever [statement]
forever begin
[meerdere statements]
end
Voorbeeld
module my_design;
initial begin
forever begin
$display ("Dit wordt voor altijd geprint, simulatie kan vastlopen ...");
end
end
endmodule
Simulatie-log
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-lus
Deze voert statements een vast aantal keren uit. Als de expressie evalueert naar X of Z, wordt het als nul behandeld en helemaal niet uitgevoerd.
repeat ([aantal_keer]) begin
[statements]
end
repeat ([aantal_keer]) @ ([enkele_event]) begin
[statements]
end
Voorbeeld
module my_design;
initial begin
repeat(4) begin
$display("Dit is een nieuwe iteratie ...");
end
end
endmodule
Simulatie-log
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-lus
Deze voert statements uit zolang een expressie true is en stopt zodra de conditie false wordt. Als de conditie vanaf het begin false is, worden de statements helemaal niet uitgevoerd.
while (expressie) begin
[statements]
end
Voorbeeld
module my_design;
integer i = 5;
initial begin
while (i > 0) begin
$display ("Iteratie#%0d", i);
i = i - 1;
end
end
endmodule
Simulatie-log
ncsim> run Iteration#5 Iteration#4 Iteration#3 Iteration#2 Iteration#1 ncsim: *W,RNQUIE: Simulation is complete.
for-lus
for (initial_toewijzing; conditie; incrementeer_variabele) begin
[statements]
end
Deze controleert statements met een drie-stappenproces:
- Initialiseer een lus-tellervariabele
- Evalueer de expressie, meestal met de lus-tellervariabele
- Incrementeer de lus-tellervariabele zodat de expressie later false wordt en de lus stopt.
Voorbeeld
module my_design;
integer i = 5;
initial begin
for (i = 0; i < 5; i = i + 1) begin
$display ("Lus #%0d", i);
end
end
endmodule
Simulatie-log
ncsim> run Loop #0 Loop #1 Loop #2 Loop #3 Loop #4 ncsim: *W,RNQUIE: Simulation is complete.
Klik hier voor meer over for-lussen.
Verilog
- C# Expressies, Statements & Blokken: Uitgebreide Gids met Praktische Voorbeelden
- Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
- Verilog concatenatie beheersen: Een praktische gids
- Verilog-toewijzingen begrijpen: types, syntax en best practices
- Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
- Verilog controlestroom beheersen: IF-ELSE, Case, en meer
- Verilog-functies beheersen voor efficiënt RTL-ontwerp
- Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik
- Verilog Delay Control begrijpen: Timing-technieken en best practices
- Verilog Clock Generator: Ontwerp & Implementatie Gids
- Java Expressies, Statements en Blokken begrijpen