OPTYMALIZACJA MODELI SYMULACYJNYCH ZAMODELOWANYCH W JĘZYKU VERILOG HDL Z WYKORZYSTANIEM INTERFEJSU PLI Arkadiusz Bukowiec Roman Drożdżyński mgr inż. Agnieszka Węgrzyn Instytut Informatyki i Elektroniki, Politechnika Zielonogórska 1. WSTĘP W ciągu ostatnich lat spotkano się z gwałtownym rozwojem elektroniki i informatyki. Przyczyniło się to do projektowania coraz bardziej złożonych i skomplikowanych układów cyfrowych. Wraz ze złożonością wykonywanych układów coraz większą rolę w ścieżce projektowej zaczęły odgrywać języki opisu sprzętu, a w szczególności VHDL i Verilog. Zaletą zastosowania takich języków jest możliwość weryfikacji projektu na każdym etapie oraz przeprowadzenie złożonych testów bez konieczności fizycznej realizacji układu. Drugą, bardzo ważną zaletą jest możliwość przetestowania współpracy naszego projektu z istniejącymi już układami cyfrowymi lub nawet analogowymi poprzez użycie symulacyjnych modeli tych że układów. Przywiązanie projektantów do popularnych i powszechnie znanych języków programowania (np. C), spowodowało powstanie różnego typu interfejsów. Interfejsy te umożliwiają wywoływanie funkcji napisanych za pomocą języków programowania w modułach projektowanych za pomocą języków opisu sprzętu,. Chociaż rozwiązanie takie powoduje różnego rodzaju ograniczenia (np. układ nie jest syntezowalny) to ma ono duże zastosowanie przy tworzeniu układów czysto symulacyjnych jak i różnego rodzaju modułów testowych. 2. INTERFEJSY PROGRAMOWE Istnieje wiele interfejsów programowych wspierających projektowanie w językach opisu sprzętu. Najbardziej popularnymi są FLI utworzony dla VHDL a i PLI [1] dla Veriloga. Interfejs FLI stworzony został przez firmę ModelTech dla potrzeb symulatora ModelSim. Główną wadą tego interfejsu jest to, że jest on zaimplementowany tylko w tym symulatorze. Natomiast interfejs stanowi część standardu Veriloga IEEE 1364-1995, co powoduje, że jest on dostępny we wszystkich popularnych symulatorach. Interfejs ten umożliwia zastosowanie funkcji napisanych w języku C podczas tworzenia modułów w Verilogu. Dla potrzeb interfejsu, jego twórcy utworzyli
specjalne biblioteki z funkcjami [2] umożliwiającymi komunikacje z symulatorem oraz przekazywanie danych pomiędzy modułami Veriloga a funkcjami C. Interfejs PLI może być wykorzystywany do wykonywania skomplikowanych obliczeń lub tworzenia statystyk projektu, jednak najbardziej przydatna może być możliwość tworzenia bardzo skomplikowanych modułów symulacyjnych lub rozbudowanych funkcji testujących. 3. SYMULACJA UKŁADÓW ZAMODELOWANYCH W VERILOGU Często podczas projektowania modeli symulacyjnych w językach HDL nie zwraca się uwagi na to ile zasobów systemowych będzie potrzebnych do przeprowadzenia symulacji danego modułu. Powoduje to, że chociaż specyfikacja układu jest całkowicie zgodna z założeniami lub zachowaniem fizycznego układu, to nie jest on optymalny pod kontem symulacji. Problem ten może być nie zauważalny gdy symuluje się tylko jeden moduł, jednak gdy połączy się go z rozbudowanym projektem może się okazać że symulacja będzie trwała bardzo długo. Ponieważ modułów syntezowalnych nie można poddać optymalizacji pod kątem symulacji, jedynym sposobem na skrócenie czasu symulacji całego projekt jest zoptymalizowanie modułów symulacyjnych. Różne symulatory na różne sposoby przydzielają pamięć podczas symulacji projektu napisanego w Verilogu. Jednak najczęściej cały projekt jest ładowany do pamięci komputera w momencie inicjalizacji symulacji i jest on tam przetrzymywany przez cały okres jej trwania. Drugim, poważny problem może stanowić to, że do zaalokowania jednego bitu danych symulatory potrzebują od kilku do kilkunastu bitów. Ze względu, że najczęściej wykorzystywanymi modelami symulacyjnymi, wraz z projektem przeznaczonym do syntezy, są pamięci, problem symulacji zostanie omówiony właśnie na przykładzie pamięci RAM (rys. 1). module ram (WE, DATA, Q, ADDR); endmodule parameter word_size = 8; parameter mem_size = 65536; parameter addr_size = 16; output [(word_size-1):0] Q; input [(word_size-1):0] DATA; input [(addr_size-1):0] ADDR; input WE; reg [(word_size-1):0] ram_mem [0:(mem_size-1)]; always @(WE or ADDR or DATA) if (WE) ram_mem[addr] <= DATA; assign Q = ram_mem[addr]; Rys. 1. Moduł pamięci RAM w Verilogu
Ze względu na rozmiar, pamięci takie nie są implementowalne do struktur FPGA, jednak często wykorzystywane są przez układy projektowane za pomocą języków opisu sprzętu. W celu przyspieszenia ścieżki projektowej w trakcie symulacji tych projektów wykorzystuje się modele symulacyjne istniejących modeli pamięci. Pamięć taka również bardzo dobrze ilustruje przedstawione powyżej problemy związane z symulacją, chociaż dotyczą one wszystkich modułów opisanych w Verilogu. Do przeprowadzenia testów wykorzystano symulatory ModelSim, Active-HDL oraz Cadence. Jak można zauważyć moduł testowy jest typową 64 KB pamięcią RAM. Do przeprowadzenia symulacji wykorzystano moduł zawierający wymuszenia testowe napisany w Verilogu. Poprzez wymuszenia testowe dokonywano najpierw 255 zapisów do pamięci a następnie 255 odczytów. Podczas symulacji za pomocą różnych symulatorów zauważono, że projekt zajmował do 83 MB pamięci operacyjnej komputera. Wynik taki nie może być zadawalający. Jednocześnie gdy posiadany komputer dysponuje mniejszą ilością pamięci RAM system operacyjny zaczyna wykorzystywać plik wymiany utworzony na dysku co znacznie spowalnia czas symulacji. Zjawisko takie zaobserwowano po zwiększeniu pamięci opisanej w modelu testowym. Podobna sytuacja ma również miejsce gdy rozpocznie się symulacje systemu wykorzystującego ten lub podobny model pamięci. Zjawisko takie może więc znacznie spowolnić projektowanie układów cyfrowych, które w czasie symulacji wykorzystują nie zoptymalizowane symulacyjne modele wchodzące w skład przyszłego systemu. 4. WYKORZYSTANIE INTERFEJSU PLI Najbardziej nie pożądanym zjawiskiem, przedstawionym w poprzednim rozdziale, jest alokowanie kilku bitów dla jednego bitu zmiennej. Jednocześnie powszechnie wiadome jest, że języki programowania alokują jedne bit pamięci operacyjnej komputera dla jednego bitu zmiennej. Nasuwa się więc proste rozwiązanie aby zamodelować modele symulacyjne za pomocą języka programowania. Rozwiązanie takie umożliwia interfejs PLI zaimplementowany w symulatorach Veriloga. Jednocześnie dużą zaletą tego interfejsu jest to, że jest on u standaryzowany i ten sam kod można wykorzystać w różnych symulatorach. Przedstawiony kod testowy (Rys. 1) został zoptymalizowany poprzez przeniesienie deklaracji pamięci do kodu napisanego w języku C z wykorzystaniem biblioteki PLI. Jak można zauważyć pamięć została zastąpiona jednowymiarową tablicą 8-bitowych liczb naturalnych (Rys. 2). #define mem_sizes 65536 int8 ram_mem[mem_sizes]; Rys. 2. Deklaracja tablicy w kodzie C Jednemu słowu pamięci odpowiada więc jeden element tablicy. W przypadku tym wstępuje również zgodność adresowania gdyż tablice w języku C jest indeksowana od 0 do mem_size-1. Rozwiązanie to jest wręcz idealne dla wektorów i pamięci o standardowej długości słowa 8-, 16-, 32- i 64-bity, gdyż w tych
przypadkach można zastosować typy o odpowiedniej ilości bitów np. odpowiednio int8, int16, int32, int64. Dla innej, nie typowej, długości słowa można użyć typu o większej ilości bitów i nadmiarowe bity pozostawić nieużyteczne. Drugim sposobem jest stworzenie mniejszej tablicy i w jednym jej elemencie zapisywanie jednego słowo i części następnego (Rys. 3). ELEMENT 1 ELEMENT 2 ELEMENT 3 ELEMENT 4 SŁOWO 1 SŁOWO 2......SŁOWO 2 SŁOWO 3 SŁOWO 4 SŁOWO 5......SŁOWO 5 SŁOWO 6 Rys. 3. Schemat tablicy dla pamięci Przy rozwiązaniu takim dodatkowo należy napisać funkcje konwertującą adres pamięci na indeks tablicy. Wymaganie jest również utworzenie funkcji, która będzie maskowała odpowiednie bity w odczytanych elementach tablicy i ewentualnie składała je w jedno słowo. Rozwiązanie takie ma również jedną wadę jest ono wolniejsze gdyż wymaga dostępu do dwóch elementów tablicy podczas każdorazowego zapisu i odczytu. Może mieć ono jednak zastosowanie podczas tworzenia bardzo dużych pamięci. Zastosowanie pamięci zamodelowanej w PLI wymusza napisanie funkcji, które będą przekazywały dane to modułu Veriloga. Funkcje takie nie są skomplikowane, a przy ich pisaniu wykorzystuje się standardowe funkcje z biblioteki PLI, które umożliwiają taką komunikację. W przedstawionym przykładzie napisano dwie taki funkcje. Jedną do odczytu danych z pamięci Read_mem, a drugą do zapisu danych do pamięci Write_mem (Rys. 4). int Read_mem() { tf_putp(0, ram_mem[tf_getp(1)]); return 0; } static Write_mem() { ram_mem[tf_getp(1)] = tf_getp(2); return 0; } Rys. 4. Funkcje do komunikacji z modułem Veriloga Do przeprowadzenia testów utworzono drugi moduł (Rys. 5) pamięci w którym zamiast zapisu do pamięci umieszczono wywołanie funkcji Read_mem, a w miejsce odczytu wywołnie funkcji Write_mem.
module ram_pli (WE, DATA, Q, ADDR); parameter word_size = 8; parameter addr_size = 17; output [(word_size-1):0] Q; reg [(word_size-1):0] Q; input [(word_size-1):0] DATA; input [(addr_size-1):0] ADDR; input WE; always @(WE or ADDR or DATA) if (WE) $write_mem(addr, DATA); always @(WE or ADDR or DATA) Q = $read_mem(addr); endmodule Rys. 5. Moduł pamięci z wykorzystaniem funkcji PLI Podczas symulacji modułu wykorzystującego interfejs PLI wykryto, że wykorzystanie pamięci operacyjnej komputera spadło do 117 kb. Zauważyć można, że wyniki taki jest nieporównanie mniejszy (Rys. 6). 100000 80000 60000 40000 20000 m oduł bez PLI m oduł z PLI 0 RAM Rys. 6. Obszar alokowanej pamięci przez symulator (w KB) Spowodowało to, że nawet symulacja bardzo rozbudowanych modeli nie wymaga od systemu wykorzystania pliku wymiany co przyczynia się do skrócenia czasu symulacji. Jednocześnie zaobserwowano, że czas ładowania projektu do pamięci komputera zmniejszył się przynajmniej o połowę. Zjawiska te były zauważalne przy wszystkich testowanych symulatorach. Zastosowanie interfejsu PLI w modułach symulacyjnych znacznie zmniejsza zużycie zasobów systemowych oraz czas trwania procesu symulacji. Oszczędności te mogą umożliwić symulację bardziej rozbudowanych projektów, a co za tym idzie przyspieszyć proces ich projektowanie oraz zmniejszyć ryzyko błędu poprzez emulację środowiska pracy opisanego w modelach symulacyjnych z zastosowaniem interfejsu PLI.
5. PODSUMOWANIE W referacie przedstawiono optymalizacji symulacji za pomocą wykorzystania interfejsu PLI oraz ukazano przewagę tego rozwiązania nad standardowym, nie wykorzystującym funkcji napisanych w PLI. Podkreśla również duże znaczenie symulacji modeli opisanych w językach HDL oraz realizację ich z wykorzystaniem interfejsów wspomagających projektowanie. Projekt realizowany był w ramach prac Koła Naukowego fantasic oraz praktyki studenckiej odbytej w firmie Aldec Inc. Dalsze prace związane z wykorzystaniem interfejsu PLI będą dążyły do utworzenia funkcji emulujących zachowanie całego środowiska pracy oraz rozbudowanych funkcji ułatwiających testowanie modeli zaprojektowanych w języku Verilog. LITERATURA I MATERIAŁY 1. Institute of Electrical and Electronics Engineers, IEEE standard 1364-1995 IEEE Standard Hardware Description Language Based on the Verilog Hardware Description Language, New York, 1996 2. Swapnajit Mittra, Principles of Verilog PLI, Kluwer Academic Publishers, 1999 3. http://www.aldec.com 4. http://www.modelsim.com