Przemysław Sołtan - kik
Transkrypt
Przemysław Sołtan - kik
KONCEPCJA REALIZACJI TESTÓW JEDNOSTKOWYCH W JĘZYKU VHDL Przemysław Sołtan Politechnika Koszalińska, Wydział Elektroniki, ul. Śniadeckich 2, 75-543 Koszalin e-mail: [email protected] Streszczenie W pracy zaproponowano nową koncepcję tworzenia i realizacji testów dla systemów cyfrowych przedstawionych w postaci modeli VHDL. Nowa koncepcja jest oparta o metodologię projektowania XP (Extreme Programming), i polega na tworzeniu niezależnych jednostek testowych w postaci bloków przedstawiających procesy VHDL, co umożliwia ich selektywne uruchomienie. W oparciu o nową koncepcję opracowana została biblioteka vhdlUnit pozwalająca na automatyzację procesu testowania oraz tworzenie raportów i statystyk. Autor w praktyczny sposób wykorzystał bibliotekę podczas realizacji własnych projektów. Zaimplementowano rozszerzenie biblioteki o obsługę wielowartościowego typu danych oraz zaproponowano kierunki rozwoju rozszerzające jej funkcjonalność. 1. WPROWADZENIE Klasyczne testowanie układów polega na podawaniu wymuszeń do testowanego systemu i obserwowaniu jego zachowania. Jest to badanie zachowawcze (behawioralne). Podczas tworzenia projektów przy użyciu języka opisu sprzętu, np. VHDL, mamy do czynienia z symulacją programową badanych układów. W takim przypadku standardowe mechanizmy ich testowania można rozwinąć o tzw. testy jednostkowe szeroko stosowane w przypadku testowania oprogramowania. Termin testy jednostkowe definiuje się jako moduły testujące (jednostki testowe), które można uruchamiać w izolacji od pozostałych. Raporty Testy jednostkowe Testowany System Rys. 1. Testowany system i środowisko testowe Współczesne projektowanie boryka się z problemami testowania i weryfikacji tworzonych systemów. Złożoność projektów wymusza automatyzację procesu testowania i odciążenie projektanta od wykonywania powtarzalnych czynności. Celem testowania jest wykrycie obecności błędów, a nie ich braku. Wynika to z trudności w dowodzeniu poprawności i wiarygodności systemów ze względu na dużą ich złożoność. Zastosowanie „sprzężenia zwrotnego” za pomocą zautomatyzowanych testów jednostkowych umożliwia kontrolę jakości wykonanej pracy przy pomocy generowanych raportów. W ostatnich latach opracowano również metodologię projektowania XP (Extreme Programming) [6], która się bazuje na realizacji testów jednostkowych. Głównym założeniem XP jest to, aby projekt rozpoczynać od zdefiniowania testów pomimo, że brak jeszcze reszty kodu projektowanego systemu. Takie zdefiniowanie wymagań zwraca uwagę na to, co jest ważne w projekcie, i jaki jest postęp prowadzonych prac. Tworzenie testów wraz z kodem programu umożliwia automatyczne wykrywanie błędów wprowadzanych podczas projektowania. Kod stanowi również formę dokumentacji, dzięki której wiadomo, jak ma zachowywać się system. Naprzemienne tworzenie testów i kodowania wprowadza inkrementny tryb pracy, co eliminuje występowanie nieoczekiwanych sytuacji wydłużających cykl projektowy. 2. KONCEPCJA REALIZACJI TESTÓW JEDNOSTKOWYCH W VHDL Realizacja testów jednostkowych w języku VHDL nie jest próbą eliminacji sprawdzonych standardowych mechanizmów testowania. Jej głównym celem jest rozbudowa mechanizmów asercji, raportowania oraz automatyzacji testów. Termin asercja określa wymuszenie zachowania określonego warunku podczas pracy symulowanego systemu (np. przyjmowanie przez dany sygnał określonego stanu - wartości). W standardzie języka VHDL zdefiniowano obsługę asercji. Jednak istotną wadą tego mechanizmu jest ograniczona możliwość raportowania przebiegu testu i porównywania wyników z innymi symulacjami. W tym celu przezwyciężenia wymienionej wady autor zaprojektował własne metody asercji uwzględniające możliwość sprawdzania wartości dla różnych typów danych. Jako podstawową jednostkę testową zaproponowano realizację procesów VHDL wykorzystujących zaprojektowane metody asercji oraz pomocnicze metody sterujące procesem raportowania wyników testu. Tak przygotowany proces jako moduł testowy (TestCase) jest następnie umieszczany wewnątrz standardowego testu zaprojektowanego przez projektanta (TestBench). Kod testowy zawiera również zestaw procesów stymulujących testowany model (Stymulus). Opisana koncepcja została przedstawiona na rys. 2. Raporty (HTML/XML) VhdlUnit (vhdl) TestBench Stymulus TestCase Testowany model (VHDL) Rys. 2. Koncepcja implementacji biblioteki testów jednostkowych. Podczas symulacji następuje wywoływanie metod asercji opisanych w zewnętrznej bibliotece (vhdlUnit), która realizuje raportowanie wyników test. Realizację biblioteki testów jednostkowych w języku VHDL wzorowano na bibliotece JUnit zaprojektowanej przez Erich’a Gamma i Kent’a Beck’a wspomagającej wykonywanie testów jednostkowych programów tworzonych przy użyciu języka Java. Proces automatyzacji uzyskuje się poprzez sekwencyjne wywołanie testowanych symulacji wraz ze specjalną symulacja inicjującą i kończącą wykonanie testu. Całość wspomagana jest przez mechanizm makr środowiska projektowego. 3. PROJEKTOWANIE JEDNOSTEK TESTOWYCH Wykorzystanie biblioteki polega na tworzeniu jednostek testowych w postaci dodatkowych procesów dołączanych do zaprojektowanych testów. Proces testowy jest najmniejszą jednostką testową składającą się z metody setUp(...) inicjującej test, grupy metod asercji assertXXX(...) testujących stan testowanych sygnałów, oraz metody teardown zakończenia testu. Wywołanie poszczególnych testów powoduje wykonywanie procesów jednostek testowych, których strukturę przedstawiono na rys. 3. Testowanie modułów testowych umożliwia przeprowadzanie testowana poszczególnych komponentów systemu w izolacji od pozostałych. vhdlUnit.vhdl setUp(…) … assertTime(…) assertWait(…) assertEquals(…) assertTrue(…) assertInfo(…) fail; tearDown; TestBench.vhdl Jednostka testowa Stymulatory TestCase : process begin setUp(“Test“,true); wait for assertTime(50ns); assertEquals(out1,’0’); … tearDown; wait end process; Testowany komponent UUT Rys. 3. Struktura jednostki testowej (proces TestCase). W bibliotece vhdlUnit zaprojektowano zestaw funkcji i procedur testowych napisanych przy użyciu języka VHDL, których listę przedstawiono poniżej. Lista funkcji i procedur biblioteki vhdlUnit procedure setUp(name: in string; test:boolean); procedure tearDown; function assertWait(t:in time)return time; function assertTime(t:in time)return time; procedure assertEquals(name: in String; arg1,arg2: in std_logic); procedure assertZero(arg: in std_logic); procedure assertTrue(arg: in std_logic); procedure assertFalse(arg: in std_logic); procedure assertInfo(message: in string); procedure assertSame(name: in String; arg1,arg2: in std_logic); procedure assertNotSame(name: in String; arg1,arg2: in std_logic); procedure assertInfo(message : in String); procedure fail(name: in String); Dodatkowo w każdym kodzie testowym wykorzystującym bibliotekę vhdlUnit należy zadeklarować użycie jej pakietu (use work.vhdlUnit.all). Jednostkowość wyboru testów jest realizowana przez określanie parametru test w metodzie setUp(name: in string; test:boolean) jednostek testowych. Oznacza to, że każda jednostka testowa (process) będzie podlegała wykonaniu przy wartości parametru ustawionego na wartość true. Dla wartości false dana jednostka testowa będzie nieaktywna. Aby zrealizować selektywne wybieranie wystarczy jako wartość wprowadzić własną stałą definiowaną w dodatkowym pliku konfiguracyjnym vhdlUnit_cgf.vhd np. setUp(”test”,TestCase_1). W ten sposób uzyskuje się globalną kontrole nad sterowaniem wszystkich jednostek testowych (TestCase) całego projektu zgrupowaną w jednym pliku. Dla lepszego zobrazowania struktury jednostki testowej poniżej przedstawiono dwa przykłady procesów testowych przedstawiających odpowiednio proces oparty o wzorzec bezpośrednich porównań oraz proces oparty o wzorzec w postaci wektora danych: Przykładowy proces testowy oparty o wzorzec bezpośrednich porównań. TestCase : process begin setUp("bramka_and4",true); wait for assertTime(50ns); wait for assertTime(100ns); ... wait for assertTime(800ns); tearDown; -- koniec testu wait; -- inicjalizacja testu assertEquals("out_1",out_1,'0'); assertEquals("out_1",out_1,'0'); assertEquals("out_1",out_1,'1'); end process; Przykładowy proces testowy oparty o wzorzec w postaci wektora danych. TestCase : process constant test_vector: nstd_logic_vector(1 to 16) := "0000000000000001"; constant test_time: time := 50ns; begin setUp("bramka_and4",true); -- inicjalizacja testu for i in 1 to test_vector'LENGTH loop wait for assertTime(i*test_time); assertEquals("out_1",out_1,test_vector(i)); end loop; tearDown; -- koniec testu wait; end process; 4. PROCES WYKONANIA TESTU: Proces wykonania testu odbywa się w trzech fazach: • wywołanie metody initialize; • wywołanie zestawu testów (testbench) poszczególnych architektur projektowanego układu lub grupy układów wraz z procesami opisującymi jednostki testowe (process TestCase); • wywołanie metody finalize zakończenia realizacji testów. Podczas inicjalizacji następuje przygotowanie ustawień początkowych i utworzenie pliku vhdlUnit.htm raportującego przebieg testu (open new). Ze względu na „bezstanowość” języka VHDL pomiędzy symulacjami (brak możliwości przekazywania wartości zmiennych) przekazywanie danych testowych zrealizowano przy pomocy dodatkowego pliku konfiguracyjnego vhdlUnit.properties uaktualnianego po zakończeniu każdego testu (update). Po wykonaniu fazy finalizacji następuje ostateczny zapis raportu i jego prezentacja wraz ze statystykami (close). Przebieg tego procesu przedstawiono na rys. 4. open new update Raport (Html/XML) update update close initialize VhdlUnit_tb (unit_initialize) test 1 test 2 Testowane komponenty test N finalize VhdlUnit_tb (unit_finalize) vhdlUnit.do Rys. 4. Proces przebiegu grupy testów jednostkowych. Automatyzacja testów ma kluczowe znaczenie przy projektowaniu złożonych systemów, w przypadku których należy sprawdzać poprawność wcześniej zaprojektowanej funkcjonalności po wprowadzeniu nowego i poprawianiu dotychczasowego kodu. 5. OSADZANIE TESTÓW Do uruchomienia testów jednostkowych wykorzystano język makr (plik vhdlUnit.do) udostępniony przez środowisko ActiveHdl firmy Aldec, Inc. W przypadku symulatorów innych firm należy wykorzystać ich specyficzne właściwości lub pliki wsadowe określonego systemu operacyjnego. Idea polega na sekwencyjnym wywołaniu określonych symulacji. Reszta operacji wykonywana jest przez bibliotekę z poziomu funkcji i procedur VHDL. Przykładowa zawartość pliku VhdlUnit.do clear SetActiveLib -work set PROJECT_HOME "$DSN\src\vhdlunit\examples" comp -include "$PROJECT_HOME\vhdlunit\vhdlUnit_cfg.vhd" comp -include "$DSN\src\vhdlUnit\vhdlUnit.vhd" asim INITIALIZE_VHDL_UNIT run 1ns endsim comp -include "$PROJECT_HOME\fa.vhd" comp -include "$PROJECT_HOME\testbench\fa_TB.vhd" asim TESTBENCH_FOR_fa run 400 ns endsim asim FINALIZE_VHDL_UNIT run 1ns endsim Podczas całego procesu testu wykonują się symulacje testowe wraz z dodatkową symulacją początkową (INITIALIZE_VHDL_UNIT) i końcową (FINALIZE_VHDL_UNIT). W projekcie zastosowano plik konfiguracyjny vhdlUnit_cfg.vhd umożliwiający tworzenie samodzielnych zestawów testów korzystających z tej samej biblioteki. Przykładowa zawartość pliku VhdlUnit_cfg.vhd package vhdlUnit_cfg is constant TEST_PROJECT_NAME : String := "Nazwa testu"; constant TEST_PROJECT_HOME : String := "lokalizacja"; constant TestCase_1 : boolena := false; -- stała dla jednostki testowej end vhdlUnit_cfg; Zawartość biblioteki nie podlega wewnętrznej modyfikacji w celu jej konfiguracji i dostosowania do określonego projektu. Z tego względu można ją wielokrotnie wykorzystywać przy różnych testach. 6. RAPORTOWANIE WYNIKÓW TESTU Zaprojektowana biblioteka umożliwia raportowanie przebiegu testów w postaci dokumentów HTML. W postaci kolorowych wierszy tabel następuje odwzorowanie wyników testów, co ułatwia ich późniejszą analizę i wyłapywanie błędnych sytuacji. Podobnie jak przy standardowej asercji języka VHDL, w raportowaniu testów jednostkowych zastosowano poziomy obsługi błędów (error levels) o następujących stanach: Info, Success, Error, Failure. Rys. 5. Widok przykładowego raportu wygenerowanego przy użyciu biblioteki vhdlUnit. Podczas wywołania finalizacji testu utworzona zostaje statystyka testu obejmująca procentowy udział prawidłowo wykonanych testów i testów zakończonych niepowodzeniem. Wynik przykładowego testu przedstawiono w raporcie z rys. 5. 7. MODUŁY ROZSZERZAJĄCE Biblioteka vhdlUnit została zastosowana przy testowaniu projektów opartych o logikę wielowartościową. W tym celu zaprojektowano pakiet vhdlUnit_ext_nstd_logic.vhd rozszerzający funkcjonowanie biblioteki o nowy typ danych nstd_logic. Fragment zawartości pakietu vhdlUnit_ext_nstd_logic.vhd library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_TEXTIO.all; use STD.TEXTIO.all; library nstd_logic_2000; use nstd_logic_2000.nstd_logic_2000.all; use work.vhdlUnit.all; -- uzyj standardowej biblioteki vhdlUnit package vhdlUnit_ext_nstd_logic is procedure assertEquals(arg1,arg2 : in nstd_logic); procedure assertZero(arg: in nstd_logic); ... function nstd2std(arg : in nstd_logic) return std_logic; function std2nstd(arg : in std_logic) return nstd_logic; end vhdlUnit_ext_nstd_logic; W pakiecie rozszerzającym zastosowano funkcje nstd2std i std2nstd konwersji pomiędzy dwoma typami danych. Przy ich użyciu zaprojektowano metody asercji dla typu nstd_logic bez dodatkowej ingerencji w kod biblioteki vhdlUnit. Główną zmianą jest sposób wywołania biblioteki, ponieważ oprócz wpisu use work.vhdlUnit.all należy umieszczać również użycie biblioteki rozszerzonej use work.vhdlUnit_ext_nstd_logic.all. Rozszerzenie korzysta również ze standardowej biblioteki nstd_logic_2000 zaprojektowanej przez autorów i wykorzystywanej podczas wielu projektów modelowania układów cyfrowych pracujących w logice wielowartościowej[5]. Weryfikacja opracowanych układów przy użyciu biblioteki rozszerzonej miała na celu automatyzację testów funkcjonowania modelu układu FPGA zaprojektowanego przy użyciu bramek pracujących w trybie prądowym. Podczas tego projektu wykazano szczególną użyteczność zaprojektowanej biblioteki ponieważ złożona rekonfigurowalność modelowanego systemu wymagała wykonania wielu samodzielnych symulacji oraz ich weryfikowania. Dodatkowo istotnym czynnikiem było umożliwienie przeprowadzania automatycznych testów porównawczych działania modelu pracującego w logice wielowartościowej nstd_logic z modelem opartym o typ std_logic. 8. ROZWÓJ BIBLIOTEKI VHDLUNIT Biblioteka została zaprojektowana w celu uproszczenia procesów testowych realizowanych przy własnych projektach. Uniwersalność biblioteki umożliwia zastosowanie jej przy innych projektach wymagających pełnej automatyzacji raportowania wyników. Aktualnie wywoływanie testów odbywa się poprzez mechanizm konsolowych skryptów. Istotną modyfikacją biblioteki jest stworzenie graficznego interfejsu GUI za pomocą którego będzie można w sposób selektywny wywoływać wybrane testy (aktualnie selekcja odbywa się przy pomocy pliku konfiguracyjnego). W tym przypadku zainicjowano projekt utworzenia takiego interfejsu przy użyciu darmowego języka skryptowego TCL/TK dostępnego w większości komercyjnych środowisk projektowych VHDL. Zastosowanie testów jednostkowych nadaje się do testowania pojedynczego układu (entity) dla jednej lub wielu architektur, jak również dla grupy niezależnych układów. To projektant decyduje jaki test realizuje określone warunki akceptacji projektowanego systemu. Autor skupił się głównie na wykorzystaniu biblioteki we własnych projektach opartych o typy std_logic i nstd_logic. Modułowość projektu umożliwia dodawanie własnych procedur asercji obsługujących inne wyspecjalizowane typy danych. Pomysłem wartym uwagi jest rozszerzenie biblioteki o moduły obsługi jednostek testowych wykorzystujących, jako wartości testowe, dane zawarte w zewnętrznych plikach (pliki tekstowe oraz waveformy). W planach przewidziana jest rozbudowa biblioteki o dodatkowe moduły raportujące między innymi zapis wyników testów w postaci dokumentów XML. Zaletą XML’a jako formatu danych jest możliwość łatwego przetwarzania jego zawartości i wykorzystania wyników do powtórnej analizy. Dzięki temu istnieje możliwość obróbki wyników przez zewnętrzne biblioteki (przekształcenia styli XSL, wizualizacja graficzna przy użyciu grafiki wektorowej SVG, porównywanie przeprowadzonych testów z ich wcześniejszymi wersjami, dokumentowanie postępu prac i wskazywanie zmian zaistniałych w projekcie). Projekt biblioteki vhdlUnit posiada status otwartego oprogramowania (Open Source) i jest dostępny pod adresem http://kik.ie.tu.koszalin.pl/vhdlunit 9. PODSUMOWANIE Podstawową zaletą stosowania biblioteki vhdlUnit jest możliwość modyfikowania elementów projektu i wykonanie grupowych testów funkcjonalności wcześniej sprawdzanych konfiguracji układu. Dzięki tej właściwości uzyskuje się łatwość eksperymentowania z nowymi pomysłami z uwzględnieniem automatycznej weryfikacji wcześniej wykonanej pracy. Ważną cechą biblioteki jest jej niezależność od środowiska projektowego. Całość kodu opisana została przy użyciu języka VHDL. Przydatność biblioteki zweryfikowano w praktyczny sposób podczas projektu reprogramowalnego układu FPGA zamodelowanego przy użyciu bramek pracujących w trybie prądowym. LITERATURA I ŹRÓDŁA [1] The Programmable Logic Data Book. Xilinx, Inc., 2000 [2] Rushton A., Vhdl for logic synthesis, John Wiley & Sons, 1998 [3] Sjoholm S., Lindh L., Prentice Hall, 1997 [4] Skahill K., Język vhld, projektowanie programowalnych układów logicznych, WNT 2001 [5] P. Sołtan, O. Maslennikow, R. Berezowski, M. Rajewska, „Automatyzacja procesu implementacji układów cyfrowych w technologii prądowych układów FPGA”, KKE'01, Kołobrzeg 2003. [6] http://www.xprogramming.com Praca wykonana w ramach grantu KBN 3T11B05926 CONCEPT OF DESIGN AND REALIZATION UNITY TESTS IN VHDL Przemysław Sołtan Technical University of Koszalin, Department of Electronics, Ul. Sniadeckich 2, 75-453 Koszalin e-mail: [email protected] Abstract In this paper, a new concept of design and realization of testing procedures for digital systems represented by VHDL models is proposed. This conception is based on Extreme Programming methodology, and assumes that unity tests are designed as the independent testing blocks represented by the VHDL process operators. Based on the new conception, the library named vhdlUnit one is design. It allows to perform the testing procedure in automated way, and to obtain the test reports and statistics. Author uses the vhdlUnit library for testing of several own VHDL projects. Moreover, the extension of this library is designed for testing of systems operating in a multiple-valued radix N logic.