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
endEinfaches Beispiel
initial begin
$display("Simulation started");
$display("This runs once");
$finish;
endAusgabe:
Simulation started
This runs onceInitial-Block für Testsignale verwenden
initial begin
a = 0;
#10 a = 1;
#10 a = 0;
#10 $finish;
endDies ändert a zu den Zeitpunkten 0, 10 und 20.
Initial vs. Always
initial | always | |
|---|---|---|
| Wird ausgeführt | Einmal | Kontinuierlich (für immer) |
| Verwendung | Testbenches, Initialisierung | Hardware (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#10oder Aufgaben wie$displaynicht in Hardware umwandeln- Verwende
initialhauptsä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$finishaufrufst; mit nur eineminitial-Block hält der Simulator von selbst an, wenn keine Ereignisse mehr ausstehen, aber es ist trotzdem empfehlenswert,$finishhinzuzufügen
Aufgabe
Füge den fehlenden initial-Block hinzu, der a auf 0 setzt und anschließend nach 10 Zeiteinheiten a auf 1 setzt.
Aufgabe:
- Füge
initial beginundendhinzu - Setze
a = 0 - Warte
#10 - Setze
a = 1 - 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
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 erstellen9Prozedurale Blöcke
Always-BlockInitial-BlockSensitivitätslisteBlockierende ZuweisungNicht blockierende ZuweisungZusammenfassung – Always vs. InitialÜbe selbstständig: Online-Verilog-Compiler