2. Programozható logikai kapuáramkörök,
2.4. Xilinx ISE környezet és az ISim szimulátor használata
2.4.4. Tervek teszteléséhez tesztpad (test-bench) összeállítása
Manapság sok nagynevű gyártó kínál szimulátor programokat az elektronikus tervek automa-tizált ellenőrzésének biztosításához, de számos ingyenes szoftver is elérhető ezen az alkalma-zási területen. A jegyzet készítése során a Xilinx beépített ISim szimulátorát használjuk, amely az ISE telepítésével válik elérhetővé. Esetünkben inkább a gyors kezelhetőségen, és egyszerűségen, mintsem a professzionális felhasználáson és teljeskörű paraméterezhetőségen volt a hangsúly. Az utóbbiakra számos szimulátor programot találhatunk: az egyik legna-gyobb név a Mentor Graphics – ModelSim szimulátora, amelyet professzionális ipari környe-zetekben használnak (ennek létezik többféle ingyenes oktatói-tanulói változata is – régebbi ISE verziókhoz ModelSim XE-III Starter néven [XILINX], amely a Xilinx ISE 12.3-as válto-zatáig együttműködve regisztráció után ingyenesen licenszelhető. Az új ModelSim Student PE változat már a ModelSim oldaláról érhető csak el [MODELSIM]).
a_in(3 : 0) 2.10. ábra: a 4-bites egyenlőség összehasonlító áramkör testpadjának felépítése:
stimulus, legfelsőbb szintű terv és a jelalak monitorozó összekapcsolása
A HDL leírásokból összeállított tervek megfelelő működését – akár a tervezés minden egyes hierarchia szintjén – szükséges ellenőrizni, és szimulálni. Vizsgálatok kimutatták, hogy a legtöbb tervezési feladatban – komplexitástól függően – nem az egyes entitások HDL leírá-sa (20-30%), hanem sokkal inkább azok megfelelő tesztelése, egy jó tesztpad/tesztágy össze-állítása (~70-80%) jelenti a legnehezebb és egyben legidőigényesebb feladatot, amely a kívánt
kimenet szempontjából egyátalán nem tekinthető közömbösnek. A módszer során a vizsgá-landó entitást, vagy a top-modul szintjéig példányosított entitások csoportját egy ún. tesztágy-ba (testbench) helyezzük el, amelyhez tesztvektorokat, mint gerjesztéseket (stimulus) adha-tunk, hogy szimuláljuk a működését. A szimuláció során a kimeneti jeleket monitorozzuk, amelyben grafikusan (általában hullámforma alapján) vagy akár szövegesen (lista) ábrázolva vizsgálhatjuk meg az entitások viselkedését az egyes jeleik változását, illetve beállítását az esetleges hibák felderítése végett. A korábbi példánknál – 4-bites egyenlőség komparátor – maradva mutatjuk be egy tesztpad összeállítását, és működését, valamint a Xilinx ISim szimu-látor program használatának bevezetését.
A 2.10. ábra szerinti tesztpad (test-bench) VHDL leírása a következő kódrészlet sze-rint adott:
-- Feladat 02 - testbench library ieee;
use ieee.std_logic_1164.all;
entity egyenloseg_4_bit_top_tb is end egyenloseg_4_bit_top_tb;
architecture tb_arch of egyenloseg_4_bit_top_tb is
signal test_in0, test_in1: std_logic_vector(3 downto 0);
signal test_out: std_logic;
begin
-- a top-level entitás példányosítása uut néven uut: entity work.egyenloseg_4_bit_top(arch)
port map(a_in=>test_in0, b_in=>test_in1, eq_out =>test_out);
-- testvektorok generálása -- Stimulus process
stim_proc : process begin
-- test vektor 1 test_in0 <= "0000";
test_in1 <= "0000";
wait for 100 ns;
-- test vektor 2 test_in0 <= "0000";
test_in1 <= "0001";
wait for 100 ns;
-- test vector 3 test_in0 <= "0000";
test_in1 <= "0010";
wait for 100 ns;
-- test vector 4 test_in0 <= "0000";
test_in1 <= "0011";
wait for 100 ns;
--…
-- test vector 254 test_in0 <= "1100";
test_in1 <= "1111";
wait for 100 ns;
-- test vector 255 test_in0 <= "1110";
test_in1 <= "1111";
wait for 100 ns;
-- test vector 256 test_in0 <= "1111";
test_in1 <= "1111";
wait for 100 ns;
-- tesztvektor generálás vége
assert false
report "Szimulacio befejezodott"
severity failure;
end process;
end tb_arch;
A fenti VHDL kódban a legfelsőbb hierarchia szinten lévő 4-bites összehasonlító áramkör van példányosítva ’uut’ (unit under test) néven. A leírás tartalmaz egy process()-t, vagy más néven folyamatot is, amelyben szereplő utasítások a hagyományos magas-szintű nyel-vekhez hasonlóan egymás után, azaz szekvenciálisan hajtódnak végre (lásd későbbi fejezet).
Minden tesztesethez egyedi tesztvektorokat kell definiálni, amelyekhez egy-egy 100 ns-os szimulációs késleltetés tartozik (wait for 100 ns hozzárendelés). Ez az utasítás azt adja meg, hogy az előtte lévő hozzárendelések szerint mennyi ideig kell a tesztvektorok aktuális értékit tartani, miután új értéket kaphatnak.
Megjegyzés: Ha a fenti HDL leírásban a 4-bites egyenlőség összehasonlító áramkör helyes működésének vizsgálatához az össze lehetséges tesztvektor variációt meg kívánjuk adni, akkor a lehetséges 256 tesztesetet fel kellene sorolni, amely nagyban megnöveli a tesztpad
forráskódjának méretét, kezelhetőségét és értelmezését. A későbbiek során az ilyen tesztese-tekre egy jobb megoldást biztosít, ha n-bites számlálókat (counter) használunk a tesztvektorok generálásához (pl. 1 db 4-bites felfelé számlálót test_in0-ra, illetve 1 db 4-bites lefelé számlálót test_in1-re), azért, hogy az összes lehetséges tesztvektort előállítsuk.
Az ISE implementációs és mod ellező feladat további lépései (folytatás)
7. Ezután az 5. lépéshez hasonló módon szerkesszük meg, vagy adjunk hozzá a projekt-hez egy új VHDL forrást („egyenloseg_4_bit_top” leírását) amit a 2.4.2.-ben ismertettünk (a 2.10. ábrán látható). Ebben az esetben az ISE forrás ablaka a követke-ző hierarchia szinteket fogja ábrázolni:
Így. az egyenloseg_4_bit_top.vhd került a legmagasabb hierarchiaszintre (top modul ), amelyben az egyenloseg_1_bit.vhd van példányosítva két architektúra leírással: kapu_szintu, illetve kapu_xnor. Ezután ismételjük meg a 6. lépésben ismertetett szintaxis ellenőrzést a top modulra.
Tesztpad (test-bench) létrehozása:
8. A következő lépésben hozzuk létre a tesztpadot (test bench), amelynek HDL leírását a 2.5.4. során ismertettük. Project → New Source, vagy baloldali eszköztáron New Source ikon segítségével adjunk hozzá a projekthez egy új „VHDL Test-Bench”-et, melynek neve legyen: „egyenloseg_4_bit_top_tb”. A következő ablak rákérdez ar-ra, hogy melyik entitáshoz kívánjuk rendelni a tesztpadot: itt válasszuk ki a legfelsőbb hierarchia szinten lévő „egyenloseg_4_bit_top” entitást, hiszen ennek a tesztjét sze-retnénk elvégezni. Majd a megjelenő tervösszesítő ablakon nyomjunk „Finish” gom-bot. Ekkor az Xilinx ISE a top-entitás alapján legenerál egy tesztpad-ot, amelyben a következő VHDL kódrészletnek megfelelően:
-- No clocks detected in port list. Replace <clock> below with -- appropriate port name
constant <clock>_period : time := 10 ns;
. . .
-- Clock process definitions <clock>_process :process begin
<clock> <= '0';
wait for <clock>_period/2;
<clock> <= '1';
wait for <clock>_period/2;
end process;
. . .
wait for <clock>_period*10;
9. Mivel órajel periódust, mint egy fizikai típussal deklarált mennyiséget egyelőre nem kívánunk használni, és a tesztpad generálásakor az ISE a top-entitásban sem talált óra-jelet, ezért ezeket a <clock>_period tartalmazó sorokat nyugodtan kommentezzük ki, pontosabban a generált tesztpad forráskódját cseréljük ki a Feladat 1 (2.4.3. fejezet) szerint megadott HDL leírással (egyenloseg_4_bit_top_tb). Ezután mentsük el a tesztpad állományt (File → Save) és ellenőrizzük a nyelvi szintaxisát (Process ablak
→ [+] Synthesize XST → Check Synthax)