Blok initial
Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 47 z 90.
Verilog ma dwa bloki proceduralne: initial (wykonuje się raz) i always (wykonuje się ciągle). Teraz omówimy blok initial.
Czym jest blok initial?
Blok initial wykonuje się tylko raz na początku symulacji (w chwili 0). Gdy zakończy działanie, nie wykonuje się ponownie.
Jest używane głównie w środowiskach testowych do:
- Ustawiania wartości początkowych
- Generowania sygnałów testowych
- Wyświetlania komunikatów
- Rozpoczynania symulacji
Składnia
initial begin
// Instrukcje wykonują się jednokrotnie, po kolei
endPodstawowy przykład
initial begin
$display("Simulation started");
$display("This runs once");
$finish;
endWynik:
Simulation started
This runs onceUżywanie bloku initial do generowania sygnałów testowych
initial begin
a = 0;
#10 a = 1;
#10 a = 0;
#10 $finish;
endZmienia to wartość a w chwilach: 0, 10 i 20.
initial a zawsze
initial | always | |
|---|---|---|
| Uruchamia się | Raz | Ciągle (bez końca) |
| Zastosowanie | Testbenche, inicjalizacja | Sprzęt (przerzutniki, liczniki) |
| Syntezowalne? | Tylko dla wartości początkowych (FPGA) | Tak (z listą czułości) |
Ważne uwagi
- Bloki
initialsłużą głównie do symulacji. Narzędzia syntezy nie potrafią zamienić opóźnień, takich jak#10, ani zadań, takich jak$display, na sprzęt - Używaj
initialgłównie w testbenchach. W module projektu używają go tylko narzędzia syntezy FPGA i tylko do ustawienia początkowej wartości rejestru lub pamięci - Jeśli testbench zawiera zegar działający bez przerwy (np.
always #5 clk = ~clk;), symulacja będzie działać w nieskończoność, chyba że wywołasz$finish; gdy występuje tylko blokinitial, symulator zatrzymuje się sam, gdy nie pozostają żadne zdarzenia, ale dodanie$finishto nadal dobra praktyka
Wyzwanie
Dodaj brakujący blok initial, który ustawia a na 0, a następnie po 10 jednostkach czasu ustawia a na 1.
Co zrobić:
- Dodaj
initial beginiend - Ustaw
a = 0 - Odczekaj
#10 - Ustaw
a = 1 - Dodaj $finish, aby zakończyć symulację
Spróbuj swoich sił
module test;
reg a;
// TODO: Dodaj tutaj blok initial
// Ustaw a = 0
// Poczekaj #10
// Ustaw a = 1
// Dodaj $finish;, aby zakończyć symulację
endmoduleTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
1Wprowadzenie
Czym jest VerilogSprzęt a oprogramowanieTwój pierwszy modułKomentarzePoziomy abstrakcji projektu4Operatory, część 1
Operatory arytmetyczneOperator moduloOperatory porównaniaPowtórka — prosta matematykaOperatory bitowe7Przypisania i bramki
Przypisanie ciągłePrzypisanie z operatoramiWbudowane prymitywy bramekBramki AND, OR i NOTBramki XOR i XNORPodsumowanie — układ z bramek logicznych10Podejmowanie decyzji
Instrukcja ifIf-elsePowtórka – prosty komparatorInstrukcja caseCaseX i CaseZPowtórka – projektowanie ALU13Odmierzanie czasu i opóźnienia
Czym są opóźnieniaOpóźnienia bramekOpóźnienia przypisańDyrektywa timescaleGenerowanie zegaraPodsumowanie — kontrola czasu2Typy danych
Typ WireTyp RegLiczby całkowite i rzeczywisteWektoryTabliceParametryPowtórka — deklarowanie sygnałów5Operatory — część 2
Operatory logiczneOperatory redukcjiOperatory przesunięciaOperator konkatenacjiOperator warunkowyPowtórzenie — wyzwanie z operatorami11Pętle
Pętla forPętla whilePętla repeatPętla nieskończonaInstrukcja wyłączaniaPowtórka — wzorce pętli3System liczbowy
Reprezentacja binarnaLiczby o określonej szerokościLiczby o nieokreślonej szerokościLiczby ujemneWartości specjalne X i ZPodsumowanie — formaty liczb6Moduły
Struktura modułuPorty wejściowe i wyjściowePorty dwukierunkoweInstancjonowanie modułuMapowanie portów według nazwMapowanie portów według kolejnościPodsumowanie — zbuduj moduł9Bloki proceduralne
Blok alwaysBlok initialLista czułościPrzypisanie blokującePrzypisanie nieblokującePodsumowanie — always a initial12Projekt multipleksera
Projekt multipleksera 2 do 1Projekt multipleksera 4 do 115Sterownik sygnalizacji świetlnej
Definiowanie stanówLogika maszyny stanówPoćwicz samodzielnie: Kompilator Verilog online