Wraz z pakietem Lattice Diamond dostajemy symulator ModelSim. Jest to popularny program i ma ogromne możliwości. Jednak duża liczba dostępnych opcji ukrytych pod różnymi przyciskami i zaszytych w różnych miejscach menu może być przytłaczająca dla początkujących. Dlatego proponuję, by w pierwszej kolejności zapoznać się z dużo prostszym symulatorem EDA Playground, a kiedy nabierzesz biegłości w testowaniu kodu, przesiąść się na ModelSim.
EDA Playground dostępny jest za darmo pod adresem www.edaplayground.com i działa w przeglądarce internetowej. Kiedy pierwszy raz zobaczyłem tę stronę, pomyślałem, że umieszczenie symulatora Veriloga w przeglądarce internetowej to jakaś ułańska fantazja, jednak po kilku próbach ten pomysł bardzo mi przypadł do gustu. Przede wszystkim ten symulator działa bez instalacji na dowolnym komputerze. Kod możemy zapisać w chmurze, więc mamy do niego dostęp wszędzie tam, gdzie jest internet. Możemy go udostępnić znajomym w postaci linku, a oni mogą go natychmiast zasymulować i modyfikować. Można także kod opublikować dla milionowej społeczności użytkowników EDA Playground oraz można łatwo przeglądać kod innych osób.
Kod, z którym będziemy parcować w tym odcinku kursu, znajdziesz pod adresem www.edaplayground.com/x/LC9i. Wystarczy, że otworzysz tę stronę i klikniesz Run, a po chwili zobaczysz wyniki symulacji. Jednak najpierw poznajmy trochę teorii…
Testbench
Kod języka Verilog podzielony jest na moduły, które są odpowiednikiem klas z C++. Kiedy mamy już napisany kod modułu, musimy powołać go do życia, tworząc jedną lub więcej instancji tych modułów. Wyjątkiem jest moduł top, będący odpowiednikiem funkcji main(). W module top tworzymy instancje podrzędnych modułów, a wewnątrz nich kolejne instancje, i tak dalej. W ten sposób tworzy nam się hierarchia projektu od ogółu do szczegółu.
Moduły stosowane w FPGA mogą mieć także instancje w specjalnych modułach, które nazywane są testbenchami. Są to moduły, które nie mają żadnych wejść ani żadnych wyjść. Prosty testbench może zawierać w sobie instancję tylko jednego modułu, który chcemy przetestować, ale może zawierać także całą hierarchię instancji. Możemy zrobić nawet testbench, który zawierał instancję modułu top, stając się tak jakby nadrzędnym modułem względem modułu top.
W tym momencie musimy wprowadzić rozróżnienie pomiędzy modułami syntezowalnymi i niesyntezowalnymi. Moduły syntezowalne to wszystkie te, które dotychczas widzieliśmy w tym kursie. Możliwa jest ich synteza, czyli wygenerowanie jakiegoś zbioru bramek i przerzutników, które można umieścić w strukturze FPGA.
Moduły niesyntezowalne nie mogą być zaimplementowane w FPGA. Mogą działać jedynie w symulatorach. Ich kod należy rozumieć jako zwyczajny język programowania. Instrukcje wykonują się jedna po drugiej, a ponadto możemy stosować pętle i opóźnienia, tak jakbyśmy pisali normalny program.