Forever Loop
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 61 von 90.
Die forever loop wiederholt einen Codeblock kontinuierlich, forever. Sie stoppt nie von selbst.
Eine forever-Schleife wird ohne end wiederholt ausgeführt. Sie ist nützlich zum Erzeugen von Taktsignalen und anderen kontinuierlichen Signalen in Testbenches.
Syntax:
forever begin
// Code, der sich für immer wiederholt
endEinfaches Beispiel
forever begin
$display("This prints forever");
endDies wird endlos ausgegeben und deine Simulation zum Absturz bringen. Füge immer eine Verzögerung oder eine Abbruchbedingung hinzu.
Eine Uhr erzeugen (häufige Verwendung)
Die häufigste Verwendung von forever besteht darin, eine Uhr zu erzeugen:
initial begin
clk = 0;
forever begin
#5 clk = ~clk; // Umschalten alle 5 Zeiteinheiten
end
endDies erstellt eine Uhr, die während der gesamten Simulation läuft.
forever mit disable
Du kannst eine forever-Schleife mit einer disable-Anweisung stoppen:
initial begin : clock_gen // Name hier hinzugefügt
clk = 0;
forever begin
#5 clk = ~clk;
end
endinitial begin
#100;
disable clock_gen; // Jetzt funktioniert das
endforever im Vergleich zu anderen loop
| loop | Stoppt? | Wann verwenden? |
|---|---|---|
for | Ja (nach einer festgelegten Anzahl von Iterationen) | Bekannte Anzahl von repeats |
while | Ja (wenn die Bedingung falsch ist) | Unbekannte Abbruchbedingung |
repeat | Ja (nach einer festgelegten Anzahl von Iterationen) | Bekannte Anzahl von repeats |
forever | Nein (niemals) | Kontinuierliche Signale (Takt) |
Wichtige Regeln
| Regel | Erklärung |
|---|---|
| Muss eine Verzögerung enthalten | #10 oder @(posedge clk) |
| Ohne Verzögerung hängt die Simulation | Endlosschleife ohne time advancement |
Mit disable verwenden, um zu stoppen | Oder die Simulation endet nie |
| Am besten in Testbenches verwenden | Nicht synthesizierbar |
Aufgabe
Was zu tun ist:
Füge die fehlende forever-Schleife hinzu, um eine Uhr zu erzeugen, die sich every 10 time units umschaltet.
Probier es selbst
module forever_challenge;
reg clk;
initial begin
clk = 0;
// TODO: forever-Schleife hinzufügen, um clk alle 10 Zeiteinheiten umzuschalten
end
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicÜbe selbstständig: Online-Verilog-Compiler