200 likes | 443 Views
Koncepcja realizacji testów jednostkowych w języku VHDL. VII Krajowa Konferencja Naukowa. RUC'2004 REPROGRAMOWALNE UKŁADY CYFROWE. Przemysław Sołtan e-mail: kerk @ ie.tu.koszalin.pl. Wprowadzenie. Koncepcja realizacji testów jednostkowych Projektowanie jednostek testowych VHDL
E N D
Koncepcja realizacji testów jednostkowych w języku VHDL VII Krajowa Konferencja Naukowa RUC'2004REPROGRAMOWALNE UKŁADY CYFROWE 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
Testowany system Testy jednostkowe Raporty 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
Koncepcja realizacji testów • testy jednostkowe(rozbudowanie mechanizmów asercji, raportowania i automatyzacji testów); TestBench Raporty (HTML/XML) Stymulus Testowanymodel (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 • ograniczone sposoby raportowania błędów; • działanie w zakresie pojedynczych symulacji Asercja sprawdzająca warunek Czy a=b ? assert a = b report 'Błąd...: a jest różne od b' severity ERROR; wyświetlany komunikat przy niespełnionym warunku, a=b komunikat błędu wyświetlany na konsoli
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 Metody asercji biblioteki vhdlUnit • 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 assertEquals(a,b); a=b a<>b Raport
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 ... end vhdlUnit; 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 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 begin ... end process; UUT : fa port map (...); TestCaseA : process begin ... end process end architecture; mapowanie biblioteki vhdlUnit TestBench.vhdl Stymulatory Testowany komponent UUT Jednostka testowa TestCase proces testowy
Struktura jednostki testowej TestBench.vhdl vhdlUnit.vhdl Jednostka testowa setUp(…) … assertTime(…) assertWait(…) assertEquals(…) assertTrue(…) assertInfo(…) fail; tearDown; 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 assertXXXtestujących stan testowanych sygnałów, oraz metody teardown zakończenia testu. 1 3 2 tearDown; assertXXX() setUp(...)
TestCase - przykłady 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; endprocess; 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 VhdlUnit_tb (unit_initialize) open new initialize update test 1 update Raport (Html/XML) 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 Endsim ... ... ... asim FINALIZE_VHDL_UNIT run 1ns endsim 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 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 assertEquals(arg1,arg2 : in std_logic); ... end vhdlUnit; 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)
vhdlUnitOpen 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