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.

Podobne dokumenty