Pisanie testbencha
Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 82 z 90.
Wyzwanie
W tej lekcji utworzysz moduł testujący, aby sprawdzić, czy sterownik sygnalizacji świetlnej działa poprawnie.
Co należy zrobić:
Utwórz moduł testujący, który:
- Deklaruje sygnały (
regdla clk i reset,wiredla red, yellow, green) - Tworzy instancję modułu
traffic_lighto nazwieuut - Generuje zegar, który zmienia stan co 1 jednostkę czasu
- Utrzymuje reset przez 2 jednostki czasu, a następnie go zwalnia
- Uruchamia symulację przez 100 jednostek czasu
Symulacja jest sprawdzana na podstawie tego, co wypisuje, więc blok initial musi również wygenerować dokładnie te wiersze:
- Wypisz
Traffic Light Testza pomocą$displayprzed ustawieniem zegara i resetu - Po upływie 100 jednostek czasu wypisz
Test completeza pomocą$display - Zakończ symulację za pomocą
$finish, które dodaje własny wiersz do wyniku
Spróbuj swoich sił
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
reg [5:0] counter;
// Przypisania wyjść
always @(*) begin
case (state)
0: begin green = 1; yellow = 0; red = 0; end
1: begin green = 0; yellow = 1; red = 0; end
2: begin green = 0; yellow = 0; red = 1; end
default: begin green = 0; yellow = 0; red = 1; end
endcase
end
// Maszyna stanów z odmierzaniem czasu
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2;
counter <= 0;
end else begin
if (counter == 0) begin
case (state)
0: begin
state <= 1;
counter <= 10;
end
1: begin
state <= 2;
counter <= 40;
end
2: begin
state <= 0;
counter <= 30;
end
endcase
end else begin
counter <= counter - 1;
end
end
end
endmodule
module testbench;
// TODO: Zadeklaruj reg dla clk i reset
// TODO: Zadeklaruj wire dla red, yellow, green
// TODO: Utwórz instancję modułu traffic_light o nazwie uut
// Podłącz clk, reset, red, yellow, green
// TODO: Generuj sygnał zegarowy (zmieniaj stan co 1 jednostkę czasu)
initial begin
$display("Traffic Light Test");
// TODO: Ustaw początkową wartość clk na 0
// TODO: Zastosuj reset (reset=1 przez 2 jednostki czasu, następnie reset=0)
// TODO: Uruchom symulację na 100 jednostek czasu
$display("Test complete");
$finish;
end
endmoduleWszystkie 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