Menu
Coddy logo textTech

Endlosschleife

Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 61 von 90.

Die forever-Schleife wiederholt einen Codeblock kontinuierlich, für immer. Sie hört niemals von selbst auf.

Eine forever-Schleife wird endlos wiederholt ausgeführt. Sie ist nützlich für die Erzeugung von Taktsignalen und anderen kontinuierlichen Signalen in Testbenches.

Syntax:

forever begin
  // Code, der endlos wiederholt wird
end

Einfaches Beispiel

forever begin
  $display("This prints forever");
end

Dies wird endlos ausgegeben und bringt deine Simulation zum Absturz. Füge immer eine Verzögerung oder eine Abbruchbedingung hinzu.

Erzeugen eines Takts (Häufige Verwendung)

Die häufigste Verwendung von forever ist das Erzeugen eines Takts:

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk;   // Alle 5 Zeiteinheiten umschalten
  end
end

Dies erstellt eine Uhr, die während der gesamten Simulation läuft.

Forever mit Disable

Sie können eine forever-Schleife mit einer disable-Anweisung stoppen:

initial begin : clock_gen   // Name hier hinzugefügt
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end
initial begin
  #100;
  disable clock_gen;   // Jetzt funktioniert dies
end

Forever vs. andere Schleifen

SchleifeStoppt?Verwendung
forJa (nach festen Iterationen)Bekannte Anzahl an Wiederholungen
whileJa (wenn Bedingung falsch ist)Unbekannte Stoppbedingung
repeatJa (nach festen Iterationen)Bekannte Anzahl an Wiederholungen
foreverNein (niemals)Kontinuierliche Signale (Takt)

Wichtige Regeln

RegelErklärung
Muss eine Verzögerung enthalten#10 oder @(posedge clk)
Ohne Verzögerung hängt die SimulationEndlosschleife ohne Zeitfortschritt
Zusammen mit disable verwenden, um zu stoppenOder die Simulation endet nie
Am besten in Testbenches verwendenNicht synthetisierbar
challenge icon

Aufgabe

Was zu tun ist:

Fügen Sie die fehlende forever-Schleife hinzu, um einen Takt (Clock) zu erzeugen, der alle 10 Zeiteinheiten umschaltet.

Spickzettel

Die forever-Schleife wiederholt einen Codeblock kontinuierlich ohne Unterbrechung. Fügen Sie immer eine Verzögerung hinzu, um ein Aufhängen der Simulation zu verhindern.

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk; // Toggle every 5 time units
  end
end

Stoppen Sie eine forever-Schleife mit disable in Verbindung mit einem benannten Block:

initial begin : clock_gen
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end

initial begin
  #100;
  disable clock_gen;
end

Wichtige Regeln:

  • Muss eine Verzögerung enthalten (#10 oder @(posedge clk)), andernfalls hängt sich die Simulation auf
  • Verwenden Sie disable zum Stoppen, da die Simulation sonst nie endet
  • Nicht synthetisierbar — nur für die Verwendung in Testbenches

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
endmodule
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen