Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti 12. VHDL pro verifikaci - Testbench I Praktika návrhu číslicových obvodů Dr.-Ing. Martin Novotný Katedra číslicového návrhu Fakulta informačních technologií ČVUT v Praze Miloš Bečvář, Martin Daněk, Jan Schmidt, Martin Novotný, 2006-2011 1
Verifikace a testování Verifikace je proces, který ověří, že obvod byl navržen podle specifikace Testování je proces, který ověří, že obvod byl vyroben podle návrhu. 2
Verifikace Verifikace srovnává specifikaci a implementaci. Bez specifikace není verifikace. Specifikace je typicky textový dokument (neformální specifikace), který popisuje fyzické, elektrické, funkční a časové vlastnosti obvodu, který bude navržen. 3
Formy verifikace verifikace simulací (Modelsim ) verifikace v simulačním prostředí (testbench), který produkuje stimuly a sbírá-kontroluje odezvy formální verifikace (Formality, Conformal) formální důkaz funkčních vlastností obvodu statická časová analýza (STA) (PrimeTime) automatická kontrola časových vlastností obvodu 4
Verifikační prostředí Design under Verification (DUV) generátor stimulů & kontrola odezvy TESTBENCH RTL VHDL funkční verifikace Netlist + SDF časová verifikace 5
Struktura verifikačního prostředí Nejjednodušší: jeden proces, který generuje stimuly a kontroluje odezvu Více procesů může kontrolovat různé části specifikace VHDL konfigurací můžeme volit úroveň detailu popisu (RTL, netlist s časováním) verifikační případ (test case) 6
Rozvinuté verifikační prostředí modely externích bloků Design Under Verification kontrola odezvy generátory stimulů vstupní data řízení verifikace skript výstupní data 7
VHDL konstrukce pro verifikaci Plná forma přiřazení signálů A<='0', '1' after 10 ns, '0' after 20 ns; Procesy bez citlivostních seznamů s příkazy wait wait for for time wait until condition wait on on signal wait ; Textový vstup, výstup; chybové kontroly (aserce) 8
Kontrola předstihu, přesahu entity DFF DFF is is generic (TD, (TD, TSETUP, THOLD THOLD : time time := := 0ns); 0ns); port port (D, (D, CLK CLK : in in std_logic; Q : out out std_logic); end end DFF; DFF; architecture TIME_CHECK of of DFF DFF is is begin begin main: main: process (CLK) (CLK) begin begin if if CLK='1' then then Q <= <= D after after td; td; end end if; if; end end process; check: process (CLK, (CLK, D) D) begin begin if if CLK='1' and and CLK'event then then assert D'stable (tsetup) report "Porusen predstih" severity waring; end end if; if; if if CLK='1' and and D'event then then assert CLK'stable (thold) report "Porusen presah" severity warning; end end if; if; end end process; end end TIME_CHECK; 9
Porušený předstih a přesah: dějí se strašné věci 10
Psaní verifikačního prostředí (testbench) Neomezujte se na psaní stylem RTL-VHDL. Využívejte všechny možnosti VHDL pro psaní přehledného kódu. Chování popisujte pokud možno sekvenčně bez vedlejších efektů. Řádně dokumentujte svůj kód, nejlépe tak, aby po vymazání VHDL příkazů z komentářů bylo stále patrné, jak kód funguje. 11
Psaní testbenchů (2) Příliš složitě psané procesy (např. RTL-VHDL) mohou nadměrně zatěžovat simulátor a zpomalovat simulaci. Pozor na nekonečné smyčky každý proces musí mít alespoň jeden příkaz wait! Procesy s citlivostním seznamem mají na konci implicitní wait s příslušnými signály. 12
Handshake 13
type type STATE_TYP is is (,MAKE_REQ,RELEASE, ); signal STATE,NEXT_STATE: STATE_TYP; COMB: COMB: process (STATE,ACK) Begin Begin NEXT_STATE <= <= STATE; case case STATE STATE is is when when MAKE_REQ => => REQ REQ <= <= '1'; '1'; if if ACK ACK = '1' '1' then then NEXT_STATE <= <= RELEASE; end end if; if; when when RELEASE => => REQ REQ <= <= '0'; '0'; if if ACK ACK = '0' '0' then then NEXT_STATE <= <= ; ; end end if; if; end end case; case; end end process COMB; COMB; Handshake RTL SEQ: SEQ: process (CLK) (CLK) Begin Begin if if CLK'event and and CLK CLK = '1' '1' then then if if RESET RESET = '1' '1' then then STATE STATE <= <= ; ; else else STATE STATE <= <= NEXT_STATE; end end if; if; end end if; if; End End process SEQ; SEQ; 14
Handshake behavioral -- behavioral handshake model -- sets REQ to 1, waits for ACK in 1, sets REQ to 0 -- no timing, example only Process Begin REQ <= '1'; wait until ACK = '1'; REQ <= '0'; wait until ACK = '0'; End process; 15