Kurs Verilog cz.3 - symulacja
Masz własną stronę WWW (prywatną lub firmową)? Dodaj ją do katalogu stron związanych z elektroniką. Wpis jest całkowicie darmowy!
Znamy już najważniejszy element każdego projektu w Verilogu. Gdy moduł jest zaprojektowany możemy (a nawet musimy, chyba że jest on banalnie prosty) sprawdzić jego działanie. Najlepszym sposobem na zweryfikowanie poprawności projektu jest przygotowanie i przeprowadzenie odpowiedniej symulacji.
Dla zawziętych elektroników, praktyków symulacja nie kojarzy się najlepiej. W przypadku układów programowalnych jest to jednak nieodzowny element każdego projektu, ale nie ma się czego bać - wygląda to o niebo lepiej niż w przypadku układów analogowych.
O tym, jakie narzędzie do przygotowania symulacji udostępnia opis sprzętu przekonasz się czytając poniższy tekst.
1. Testbench
Aby przeprowadzić symulację niezbędne jest stworzenie dodatkowego bloku, który określi wymuszenia dla testowanego modułu. Blok taki nosi nazwę testbench i definiuję się go tak, jak każdy inny moduł w Verilogu. Testbench stanowi niejako opis środowiska zewnętrznego układu.
Najlepiej zrozumieć to analizując przykład. Mamy 4-bitowy licznik z możliwością wpisania wartości początkowej, taki jak na rysunku poniżej.

Rysunek 1. Licznik 4-bitowy
Finalnie do naszego układu podłączymy inne układy (źródło impulsów zliczanych, sterowanie, odczyt aktualnej wartości). Symulacją takiego właśnie środowiska zajmuje się testbench.

Rysunek 2. Testbench licznika
Aby zilustrować powyższe informacje napiszemy moduł licznika, oraz testbench dla niego.
Zacznijmy od licznika, ta część jest dość prosta:
module licznik( input wire clk, input wire load, input wire [3:0] i_Q, output reg [3:0] o_Q ); always @(posedge clk or posedge load) if(load) o_Q <= i_Q; else if(clk) o_Q <= o_Q + 1; endmodule
Licznik będzie zliczał impulsy na narastającym zboczu sygnału clk, ładowanie wartości początkowej nastąpi na narastającym zboczu sygnału load.
Testbench będzie symulował źródło zliczanych impulsów, oraz zajmie się wpisaniem początkowej wartości równej 6.
module licznik_tb(); reg sys_clk; reg load; reg [3:0] Q; wire [3:0] cnt; licznik UUT( .clk(sys_clk), .load(load), .i_Q(Q), .o_Q(cnt) ); initial begin sys_clk = 0; Q = 8'd6; load = 0; load = #100 1; load = #100 0; end initial begin // wyświetlenie wyników symulacji $monitor ($time, " | %d", cnt); end //----------------------------------- always #25 sys_clk <= ~sys_clk; //----------------------------------- endmodule
Szczegółowo testbench omówimy w kolejnych częściach kursu, tutaj przedstawiona jest pewna idea.
Wyniki można obserwować jako przebiegi czasowe oraz w konsoli symulacji (dzięki zastosowaniu funkcji $monitor).
2. Kilka uwag
- warto stosować nazwy modułów testbenchy z przyrostkiem _tb, jest to dobry zwyczaj ułatwiający orientację w plikach projektu,
- testowanie układu przed jego implementacją jest jednym z najważniejszych i nabardziej czasochłonnych etapów projektowania,
- testowanie odbywa się na dwóch poziomach: behawioralnym oraz tzw. post-route czyli uwzględniającą rozmieszczenie elementów (oraz opóźnienia z tego wynikające) wewnątrz układu programowalnego.
W następnej części przyjrzymy się bliżej składni języka Verilog.

