Koncepcja realizacji testów jednostkowych w języku VHDL VII Krajowa Konferencja Naukowa RUC'2004 REPROGRAMOWALNE UKŁADY CYFROWE Koncepcja realizacji testów jednostkowych w języku VHDL Przemysław Sołtan e-mail: kerk@ie.tu.koszalin.pl
Wprowadzenie Koncepcja realizacji testów jednostkowych Projektowanie jednostek testowych VHDL Osadzanie testów we własnych projektach Raportowanie wyników testu Rozszerzenia biblioteki (np. logika nstd_logic) Rozwój biblioteki vhdlUnit Podsumowanie
Koncepcja realizacji testów Projekt VHDL TESTOWANIE (test benches) standardowe mechanizmy asercji VHDL; własne procedury testowe (niestandardowe procedury – trudności z ponownym wykorzystaniem kodu testowego); porównywanie przebiegów testowych – waveform (uzależnienie od mechanizmów dostarczonych przez środowisko projektowe); testy jednostkowe – biblioteka vhdlUnit
Testy jednostkowe Testy jednostkowe - moduły testujące (jednostki testowe), które można uruchamiać w izolacji od pozostałych Raporty – kontrola jakości wykonywanej pracy Złożoność projektów wymusza automatyzację testów i odciążenie projektanta od wykonywania powtarzalnych czynności Testowany system Testy jednostkowe Raporty
Koncepcja realizacji testów testy jednostkowe (rozbudowanie mechanizmów asercji, raportowania i automatyzacji testów); Raporty (HTML/XML) TestBench Stymulus Testowany model (VHDL) VhdlUnit (vhdl) TestCase Asercja – wymuszenie zachowania określonego warunku podczas pracy symulowanego systemu (np. przyjmowanie przez dany sygnał określonego stanu - wartości)
Standardowe metody asercji Asercja sprawdzająca warunek Czy a=b ? assert a = b report 'Błąd...: a jest różne od b' severity ERROR; komunikat błędu wyświetlany na konsoli wyświetlany komunikat przy niespełnionym warunku, a=b ograniczone sposoby raportowania błędów; działanie w zakresie pojedynczych symulacji
Metody asercji biblioteki vhdlUnit assertEquals(a,b); a=b a<>b Raport Name Status Type Time(s) N/A Success assertEquals(0,0) 50 ns Name Status Type Time(s) N/A Error assertEquals(0,1) 50 ns rozbudowana lista metod asercji assertXXX dla różnych typów danych (możliwość rozszerzania o metody asercji dla własnych typów danych np. nstd_logic) raportowanie wyników w postaci tabel
Pakiety biblioteki vdhlUnit vhdlUnit.vhd library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_TEXTIO.all; use STD.TEXTIO.all; use work.vhdlUnit_cfg.all; package vhdlUnit is ... 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 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); end vhdlUnit; package body vhdlUnit is vhdlUnit_cfg.vhd package vhdlUnit_cfg is constant TEST_PROJECT_NAME : String := "Nazwa testu"; constant TEST_PROJECT_HOME : String := "lokalizacja"; end vhdlUnit_cfg; plik konfiguracyjny metody asercji
TestBench + vhdlUnit UUT mapowanie biblioteki vhdlUnit proces testowy library ieee; use ieee.std_logic_unsigned.all; use ieee.std_logic_1164.all; use work.vhdlUnit.all; use work.vhdlUnit_cfg.all; entity fa_tb is end fa_tb; architecture TB_ARCHITECTURE of fa_tb is component fa port(...) end component; begin STIMULUS: process ... end process; UUT : fa port map (...); TestCaseA : process end process end architecture; TestBench.vhdl Stymulatory Testowany komponent UUT Jednostka testowa TestCase proces testowy
Struktura jednostki testowej vhdlUnit.vhdl TestBench.vhdl setUp(…) … assertTime(…) assertWait(…) assertEquals(…) assertTrue(…) assertInfo(…) fail; tearDown; Jednostka testowa Stymulatory TestCase : process begin setUp(“Test“,true); wait for assertTime(50ns); assertEquals(out1,’0’); … tearDown; wait end process; 1 2 Testowany komponent 3 UUT vhdlUnit_cfg.vhdl 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. 1 2 3 setUp(...) assertXXX() tearDown;
TestCase - przykłady bezpośrednie porównania porównanie z TestCase : process begin setUp("bramka_and4",true); -- inicjalizacja testu wait for assertTime(50ns); assertEquals("out_1",out_1,'0'); wait for assertTime(100ns); assertEquals("out_1",out_1,'0'); ... wait for assertTime(800ns); assertEquals("out_1",out_1,'1'); tearDown; -- koniec testu wait; end process; bezpośrednie porównania 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; porównanie z wektorem danych
Przykład – test pełnego sumatora FA Wzorzec TestBench ? Raport
Osadzanie testów vhdlunit.properties – plik buforujący dane przekazywane pomiędzy kolejnymi symulacjami vhdlUnit.do open new VhdlUnit_tb (unit_initialize) initialize update test 1 Raport (Html/XML) update test 2 Testowane komponenty update test N close VhdlUnit_tb (unit_finalize) finalize
Osadzanie testów Przykładowe makro środowiska ActiveHDL (ALDEC) 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 ... asim FINALIZE_VHDL_UNIT endsim Przykładowe makro środowiska ActiveHDL (ALDEC) VhdlUnit_tb (unit_initialize) Testowane komponenty VhdlUnit_tb (unit_finalize) Sekwencyjne wywołanie symulacji testowych wraz z dodatkową symulacją początkową (INITIALIZE_VHDL_UNIT) i końcową (FINALIZE_VHDL_UNIT)
Konfiguracja vhdlUnit vhdlUnit_cfg.vhd package vhdlUnit_cfg is constant TEST_PROJECT_NAME : String := "Nazwa testu"; constant TEST_PROJECT_HOME : String := "lokalizacja"; constant TestCase_1 : boolena := true; constant TestCase_2 : boolena := false; end vhdlUnit_cfg; Plik konfiguracyjny umożliwia selektywne włączanie określonych procesów testowych TestCaseB : process begin setUp(“Test“,TestCase_2); wait for assertTime(50ns); assertEquals(out1,’0’); … tearDown; wait end process; TestCaseA : process begin setUp(“Test“,TestCase_1); wait for assertTime(50ns); assertEquals(out1,’0’); … tearDown; wait end process; Dwie jednostki testowe (procesy) znajdujące się w jednym wspólnym lub dwóch niezależnych testbench’ach wykonywanych w niezależnych symulacjach
Raportowanie wyników testu Info Success Error Failure statystyka testu
Moduł rozszerzający - przykład library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_TEXTIO.all; use STD.TEXTIO.all; use work.vhdlUnit_cfg.all; package vhdlUnit is ... procedure assertEquals(arg1,arg2 : in std_logic); end vhdlUnit; vhdlUnit.vhd 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; package vhdlUnit_ext_nstd_logic is ... procedure assertEquals(arg1,arg2 : in nstd_logic); function nstd2std(arg : in nstd_logic) return std_logic; function std2nstd(arg : in std_logic) return nstd_logic; end vhdlUnit; package body vhdlUnit is procedure assertEquals(arg1,arg2 : in nstd_logic) is begin assertEquals("N/A", nstd2std(arg1),nstd2std(arg2)); end; end vhdlUnit_ext_nstd_logic; TestBench (nstd_logic) use work.vhdlUnit_cfg.all; use work.vhdlUnit.all; use work.vhdlUnit_ext_nstd_logic.all vhdlUnit_ext_nstd_logic.vhd vhdlUnit.vhd Biblioteka vhdlUnit nie wymaga modyfikacji (przeciążanie metod asercji)
Rozwój biblioteki vhdlUnit Dodatkowe moduły raportujące (np. XML, SVG) Implementacja metod asercji pobierających wzorcowe dane z zewnętrznych plików assert(FILE), assert(LIST), assert(WAVE) Porównywanie przeprowadzonych testów z ich wcześniejszymi wersjami (rejestrowanie postępu prac projektowych – liczby poprawnie działających testów, ...) Rozbudowa mechanizmów przekazywania danych pomiędzy dwoma symulacjami (vhdlUnit.properties)
vhdlUnit Open Source Project http://kik.ie.tu.koszalin.pl/vhdlunit
Podsumowanie Niezależność od środowiska projektowego (całość kodu opracowana w języku VHDL) Możliwość rozszerzania o własne moduły (vhdlUnit_ext_nstd_logic.vhd) „Zgodność nazewnicza” z innymi bibliotekami testów jednostkowych (JUnit) Możliwość wspólnego raportowania wyników testu dla wielu niezależnych symulacji