Endlosschleife
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 61 von 90.
Die forever-Schleife wiederholt einen Codeblock ununterbrochen, für immer. Sie hört niemals von selbst auf.
Eine forever-Schleife wird endlos wiederholt ausgeführt. Sie ist nützlich, um in Testbenches Takte und andere kontinuierliche Signale zu erzeugen.
Syntax:
forever begin
// Code, der sich endlos wiederholt
endEinfaches Beispiel
forever begin
$display("This prints forever");
endDadurch wird endlos etwas ausgegeben und deine Simulation stürzt ab. Füge immer eine Verzögerung oder eine Abbruchbedingung hinzu.
Eine Taktfrequenz erzeugen (häufige Verwendung)
Die häufigste Verwendung von forever ist das Erzeugen eines Taktsignals:
initial begin
clk = 0;
forever begin
#5 clk = ~clk; // Alle 5 Zeiteinheiten umschalten
end
endDadurch wird eine Uhr erstellt, die während der gesamten Simulation läuft.
Endlos mit Disable
Du kannst eine forever-Schleife mit einer disable-Anweisung anhalten:
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
endEndlosschleife im Vergleich zu anderen Schleifen
| Schleife | Wird sie angehalten? | Wann wird sie verwendet? |
|---|---|---|
for | Ja (nach einer festgelegten Anzahl von Durchläufen) | Bekannte Anzahl von Wiederholungen |
while | Ja (wenn die Bedingung falsch ist) | Unbekannte Abbruchbedingung |
repeat | Ja (nach einer festgelegten Anzahl von Durchläufen) | Bekannte Anzahl von Wiederholungen |
forever | Nein (nie) | Kontinuierliche Signale (Uhr) |
Wichtige Regeln
| Regel | Erklärung |
|---|---|
| Muss eine Verzögerung enthalten | #10 oder @(posedge clk) |
| Ohne Verzögerung hängt die Simulation | Endlosschleife ohne Zeitfortschritt |
Beende die Schleife mit disable oder beende die Simulation mit $finish | Andernfalls endet die Simulation nie |
| Am besten in Testbenches verwenden | Nicht synthetisierbar |
Aufgabe
Was zu tun ist:
Füge die fehlende forever-Schleife hinzu, um ein Taktsignal zu erzeugen, das alle 10 Zeiteinheiten umschaltet.
Probier es selbst
module forever_challenge;
reg clk;
initial begin
clk = 0;
// TODO: Füge eine forever-Schleife hinzu, 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 Designs4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – einfache MathematikBitweise Operatoren7Zuweisungen und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-GrundelementeUND-, ODER- und NICHT-GatterXOR- und XNOR-GatterRückblick – Logikgatter-Schaltung10Entscheidungsfindung
If-AnweisungIf – ElseRückblick – Einfacher KomparatorCase-AnweisungCasex und CasezRückblick – ALU-Entwurf13Zeitsteuerung und Verzögerungen
Was sind Verzögerungen?GatterverzögerungenZuweisungsverzögerungenTimescale-DirektiveTakterzeugungZusammenfassung – Zeitsteuerung2Datentypen
Wire-TypReg-TypInteger und RealVektorenArraysParameterZusammenfassung – Signale deklarieren5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenSchiebeoperatorenVerkettungsoperatorBedingter OperatorRückblick – Operatoren-Herausforderung11Schleifen
For-SchleifeWhile-SchleifeWiederholungsschleifeEndlosschleifeAnweisung deaktivierenRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit fester BreiteZahlen ohne feste BreiteNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturInput- und Output-PortsInout-PortsModulinstanziierungPortzuordnung nach NamenPortzuordnung nach ReihenfolgeRückblick – Ein Modul erstellenÜbe selbstständig: Online-Verilog-Compiler