Tworzenie sygnałów testowych
Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 74 z 90.
Bodziec odnosi się do wartości wejściowych, które stosujesz w swoim projekcie, aby sprawdzić, czy działa poprawnie. Zmieniając dane wejściowe i obserwując dane wyjściowe, możesz zweryfikować, czy projekt zachowuje się zgodnie z oczekiwaniami.
Pomyśl o tym jak o testowaniu maszyny: naciskasz różne przyciski (bodziec) i obserwujesz, co się dzieje (wyjścia). Tworzenie dobrych bodźców jest niezbędnym elementem pisania testbencha.
Na przykład przyjrzyj się bodźcowi w następującym testbenchu:
module testbench;
reg a, b;
wire c;
and_gate dut (
.a(a),
.b(b),
.c(c)
);
initial begin
// BODZIEC ZACZYNA SIĘ TUTAJ
// Przypadek testowy 1: Oba wejścia mają wartość 0
a = 0; b = 0; #10;
// Przypadek testowy 2: a=0, b=1
a = 0; b = 1; #10;
// Przypadek testowy 3: a=1, b=0
a = 1; b = 0; #10;
// Przypadek testowy 4: Oba wejścia mają wartość 1
a = 1; b = 1; #10;
// BODZIEC KOŃCZY SIĘ TUTAJ
$finish;
end
endmoduleKażdy bodziec jest stosowany, a następnie czekamy 10 jednostek czasu (#10) przed kolejnym bodźcem. Dzięki temu DUT ma czas na wygenerowanie wyjścia.
Metody tworzenia STIMULUS
| Metoda | Najlepsze zastosowanie | Przykład |
|---|---|---|
| Przypisania sekwencyjne | Proste testy | a = 0; b = 0; #10; |
| Pętla for | Testowanie wszystkich kombinacji | for (i = 0; i < 4; i++) |
| Pętla repeat | Powtarzające się wzorce | repeat (10) #5 clk = ~clk; |
| Pętla forever | Sygnały ciągłe | forever #5 clk = ~clk; |
Metoda 1: Przypisania sekwencyjne
Najprostszy sposób na utworzenie STIMULUS. Przypisujesz wartości jedna po drugiej, z opóźnieniami.
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
endMetoda 2: Pętla for
Przydatna, gdy chcesz przetestować wszystkie możliwe kombinacje danych wejściowych.
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i;
#10;
end
$finish;
endTo testuje: 00, 01, 10, 11.
Metoda 3: Pętla repeat
Przydatna do wielokrotnego powtarzania tego samego bodźca.
initial begin
a = 0; b = 1;
repeat (10) begin
#10 a = ~a;
end
$finish;
endMetoda 4: Pętla nieskończona
Przydatna w przypadku ciągłych sygnałów, takich jak zegary.
initial begin
clk = 0;
forever #5 clk = ~clk;
endWażne zasady
| Zasada | Wyjaśnienie |
|---|---|
| Używaj opóźnień między przypisaniami sygnałów pobudzających | #10 daje czas na reakcję DUT |
Używaj reg dla sygnałów pobudzających | Ponieważ zmieniają się w czasie |
Dodaj $finish na końcu | Aby zatrzymać symulację |
Wyzwanie
Otrzymujesz moduł bramki OR. Twoim zadaniem jest dodanie brakujących sygnałów pobudzających i instrukcji $display, aby wyświetlić wyniki.
Co zrobić:
Dodaj sygnały pobudzające, aby przetestować wszystkie cztery kombinacje wejść (00, 01, 10, 11):
- W każdym wierszu ustaw wartości dla
xiy - Dodaj
#10, aby wprowadzić opóźnienie - Dodaj
$display, aby wyświetlić wynik
Instrukcja <strong>$display</strong> powinna wyglądać tak:
$display("%d %d | %d", x, y, z);Spróbuj swoich sił
module or_gate (
input x,
input y,
output z
);
assign z = x | y;
endmodule
module testbench;
reg x, y;
wire z;
or_gate dut (
.x(x),
.y(y),
.z(z)
);
initial begin
$display("x y | z");
$display("---------");
// TODO: Dodaj wymuszenie sygnałów i wyświetlenie wyniku dla 0 0
// TODO: Dodaj wymuszenie sygnałów i wyświetlenie wyniku dla 0 1
// TODO: Dodaj wymuszenie sygnałów i wyświetlenie wyniku dla 1 0
// TODO: Dodaj wymuszenie sygnałów i wyświetlenie wyniku dla 1 1
$finish;
end
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ętli14Podstawy testbencha
Czym jest testbenchTworzenie sygnałów testowychDisplay i MonitorDumpfile i DumpvarsKorzystanie z zadań systemowychPodsumowanie — pełny testbench3System 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