Menu
CoddyTech

Initial-Block

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

Verilog hat zwei prozedurale Blöcke: initial (wird einmal ausgeführt) und always (wird fortlaufend ausgeführt). Sehen wir uns nun den initial-Block an.

Was ist ein Initial-Block?

Der initial-Block wird zu Beginn der Simulation (Zeit 0) nur einmal ausgeführt. Wenn er beendet ist, wird er nicht erneut ausgeführt.

Es wird hauptsächlich in Testbenches verwendet für:

  • Festlegen von Anfangswerten
  • Erzeugen von Testsignalen
  • Anzeigen von Meldungen
  • Starten der Simulation

Syntax

initial begin
  // Anweisungen werden einmal nacheinander ausgeführt
end

Einfaches Beispiel

initial begin
  $display("Simulation started");
  $display("This runs once");
  $finish;
end

Ausgabe:

Simulation started
This runs once

Initial-Block für Testsignale verwenden

initial begin
  a = 0;
  #10 a = 1;
  #10 a = 0;
  #10 $finish;
end

Dies ändert a zu den Zeitpunkten 0, 10 und 20.

Initial vs. Always

 initialalways
Wird ausgeführtEinmalKontinuierlich (für immer)
VerwendungTestbenches, InitialisierungHardware (Flip-Flops, Zähler)
Synthetisierbar?Nur für Startwerte (FPGA)Ja (mit Sensitivitätsliste)

Wichtige Hinweise

  • initial-Blöcke sind hauptsächlich für Simulationen gedacht. Synthesewerkzeuge können Verzögerungen wie #10 oder Aufgaben wie $display nicht in Hardware umwandeln
  • Verwende initial hauptsächlich in Testbenches. In einem Designmodul verwenden es nur FPGA-Synthesewerkzeuge, und zwar nur, um den Anfangswert eines Registers oder Speichers festzulegen
  • Wenn die Testbench einen freilaufenden Takt enthält (z. B. always #5 clk = ~clk;), läuft die Simulation unbegrenzt weiter, sofern du nicht $finish aufrufst; mit nur einem initial-Block hält der Simulator von selbst an, wenn keine Ereignisse mehr ausstehen, aber es ist trotzdem empfehlenswert, $finish hinzuzufügen
challenge icon

Aufgabe

Füge den fehlenden initial-Block hinzu, der a auf 0 setzt und anschließend nach 10 Zeiteinheiten a auf 1 setzt.

Aufgabe:

  1. Füge initial begin und end hinzu
  2. Setze a = 0
  3. Warte #10
  4. Setze a = 1
  5. Füge $finish hinzu, um die Simulation zu beenden

Probier es selbst

module test;
  reg a;
  
  // TODO: Füge hier einen initial-Block hinzu
  // Setze a = 0
  // Warte #10
  // Setze a = 1
  // Füge $finish; hinzu, um die Simulation zu beenden
  
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

Übe selbstständig: Online-Verilog-Compiler