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 kontinuierlich ausgeführt). Sehen wir uns nun den initial-Block an.
Was ist ein Initial-Block?
Der initial-Block wird am Anfang der Simulation (Zeit 0) nur einmal ausgeführt. Wenn er fertig ist, wird er nicht erneut ausgeführt.
Es wird hauptsächlich in Testbenches verwendet für:
- Das Festlegen von Anfangswerten
- Das Erzeugen von Testsignalen
- Das Anzeigen von Nachrichten
- Das Starten der Simulation
Syntax
initial begin
// Anweisungen werden einmal sequenziell ausgeführt
endGrundlegendes 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 | |
|---|---|---|
| Ausführung | Einmal | Kontinuierlich (für immer) |
| Verwendung für | Testbenches, Initialisierung | Hardware (Flip-Flops, Zähler) |
| Synthetisierbar? | Nein (nur Simulation) | Ja (mit Sensitivitätsliste) |
Wichtige Hinweise
initial-Blöcke sind nicht synthetisierbar. Sie können nicht in Hardware umgewandelt werden- Verwende
initialnur in Testbenches - Wenn die Testbench eine freilaufende Taktquelle enthält (z. B.
always #5 clk = ~clk;), läuft die Simulation unendlich weiter, sofern du nicht$finishaufrufst; bei nur eineminitial-Block stoppt der Simulator von selbst, sobald keine Ereignisse mehr vorhanden sind, aber das Hinzufügen von$finishist trotzdem gute Praxis
Aufgabe
Füge den fehlenden initial-Block hinzu, der a auf 0 setzt und a anschließend nach 10 Zeiteinheiten auf 1 setzt.
Was zu tun ist:
- 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: Initial-Block hier hinzufügen
// 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