Vous êtes sur la page 1sur 14

VHDL – Logique programmable 1/14 Partie 8 – Testbenches

VHDL - Réseaux programmables


Cours – partie 8 -Testbenches

Denis Giacona

ENSISA
École Nationale Supérieure d'Ingénieurs Sud Alsace
12, rue des frères Lumière
68 093 MULHOUSE CEDEX
FRANCE

Tél. 33 (0)3 89 33 69 00

© D.Giacona
VHDL – Logique programmable 2/14 Partie 8 – Testbenches

1. Préambule

• VHDL est à la fois un langage de synthèse, et de simulation

• Un testbench VHDL est ensemble de codes VHDL destinés à la vérification du système

• Dans l’industrie, les testbenches jouent un rôle très important ; ils sont intégrés dans les
spécifications d’un système

© D.Giacona
VHDL – Logique programmable 3/14 Partie 8 – Testbenches

2. Structure d’un banc de test

2.1. Structure générale d’un banc de test à 3 éléments

Banc de test

Générateur de Modèle à tester Vérificateur


a x
stimuli
(vecteurs de b
test)

• Génération de stimuli : création de signaux représentant des transactions correctes ou incorrectes, des délais
minimum et maximum, des conditions d’erreur

• Modèle à tester : description du comportement du système à tester (UUT : Unit Under Test)

• Vérification : comparaison des réponses du modèle avec des résultats attendus ; rapports d’erreurs

© D.Giacona
VHDL – Logique programmable 4/14 Partie 8 – Testbenches

2.2. Exemple de banc de test à 2 éléments

Banc de test

Générateur de Modèle à tester


a x
stimuli
b

Simulateur

© D.Giacona
VHDL – Logique programmable 5/14 Partie 8 – Testbenches

3. Le code VHDL d'un banc de test

 Structure du fichier pour le système à tester

Entité
Entrés,sorties
Architecture
Déclarations
Instructions

 Structure du fichier pour le banc de test

Entité (ni entrée ni sortie)

Architecture
Déclaration de composant du système à tester (UUT: Unit Under Test)
Déclaration des signaux de test (entrées et sorties de l'UUT)

Instruction d'instanciation de l'UUT


Instructions de génération de stimuli (entrées de l'UUT)

© D.Giacona
VHDL – Logique programmable 6/14 Partie 8 – Testbenches

 Code du système à tester (une porte xor)

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity porte_xor is
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
x : out STD_LOGIC);
end porte_xor;

architecture Behavioral of porte_xor is

begin
x <= a xor b;
end Behavioral;

© D.Giacona
VHDL – Logique programmable 7/14 Partie 8 – Testbenches

 Code du banc de test


LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

ENTITY tb_after IS
END tb_after;

ARCHITECTURE behavior OF tb_after IS


-- Component Declaration for the Unit Under Test (UUT)
COMPONENT porte_xor
PORT(
a : IN std_logic;
b : IN std_logic;
x : OUT std_logic
);
END COMPONENT;
-- Signal Declaration
signal a : std_logic := '0';
signal b : std_logic := '0';
signal x : std_logic;

© D.Giacona
VHDL – Logique programmable 8/14 Partie 8 – Testbenches

BEGIN

-- Instantiate the Unit Under Test (UUT)


uut: porte_xor PORT MAP (
a => a,
b => b,
x => x
);

-- Generate stimuli
a <= '1' after 100 ns, '0' after 300 ns;
b <= '1' after 150 ns, '0' after 350 ns;

END;

© D.Giacona
VHDL – Logique programmable 9/14 Partie 8 – Testbenches

4. Instructions VHDL destinées à la génération de stimuli


4.1. Instructions concurrentes

 L’instruction concurrente d’affectation à temps non nul : <= after

a <= '1' after 100 ns, '0' after 300 ns; -- à placer
b <= '1' after 150 ns, '0' after 350 ns; -- dans le corps d’architecture

 Les instructions d’appel de processus

stim_proc: process
begin
-- insérer des instructions séquentielles ici
end process;

© D.Giacona
VHDL – Logique programmable 10/14 Partie 8 – Testbenches

4.2. Instructions séquentielles d’un processus

 Remarques préliminaires

o Un processus destiné à la génération de stimuli n’a pas de liste de sensibilité


o Un processus est cyclique (durée de vie = durée de simulation); arrivé à son mot clé
final end process, il se réexécute toujours, sauf si auparavant il est endormi avec
une instruction d’attente inconditionnelle
o Un processus contient des instructions d’affectation de valeur et obligatoirement
des instructions de contrôle de type wait

 L’instruction séquentielle d’affectation à temps non nul : <= after

Elle joue le même rôle que l’instruction concurrente de même nom.

© D.Giacona
VHDL – Logique programmable 11/14 Partie 8 – Testbenches

 L’instruction séquentielle d’attente conditionnelle : wait for

L’instruction wait for est utilisée pour contrôler le processus. Elle permet de placer des
points d’arrêt momentanés.

-- EXEMPLE 1 : entrées d’une porte xor


-- déclaration des signaux
signal a : std_logic := '0';
signal b : std_logic := '0';
begin -- début du corps d’architecture
stim_proc: process -- pas de liste de sensibilité
begin
wait for 100 ns;
a <= '1';
wait for 50 ns;
b <= '1';
wait for 100 ns;
a <= '0';
wait for 50 ns;
b <= '0';
end process;

© D.Giacona
VHDL – Logique programmable 12/14 Partie 8 – Testbenches

-- EXEMPLE 2 : reset et horloge d’un compteur


-- zone de déclaration
signal clk : std_logic := '0';
signal rst : std_logic := '1';
constant clk_period : time := 100 ns;

-- début du corps d’architecture


begin

clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;

rst <= '0' after 125 ns;

© D.Giacona
VHDL – Logique programmable 13/14 Partie 8 – Testbenches

 L’instruction séquentielle d’attente inconditionnelle : wait

L’instruction wait suspend indéfiniment le processus à partir de l’instant où le simulateur


l’exécute.

stim_proc: process
begin
wait for 100 ns;
a <= '1';
wait for 50 ns;
b <= '1';
wait for 100 ns;
a <= '0';
wait for 50 ns;
b <= '0';
wait; -- suspension du processus
end process;

© D.Giacona
VHDL – Logique programmable 14/14 Partie 8 – Testbenches

 L’instruction séquentielle d’itération : for loop

constant n : positive := 10; -- dans la zone de déclaration de l’architecture

begin -- début du corps d’architecture

boucle: process
begin
loop1: for i in 1 to n-1 loop
a <= '1';
wait for i*100 ns;
a <= '0';
wait for (n-i)*100 ns;
end loop;
end process;

b <= '1' after 10 us;

© D.Giacona

Vous aimerez peut-être aussi