Een self-checking testbench is een VHDL-programma dat de juistheid van het te testen apparaat (DUT) verifieert zonder afhankelijk te zijn van een operator om de output handmatig te inspecteren. De zelfcontrolerende testbench werkt volledig zelfstandig en drukt uiteindelijk een bericht "OK" of "Mislukt" af.
Elke VHDL-module moet een bijbehorende autocontrole-testbank hebben. Het is belangrijk om op elk moment te kunnen controleren of alle modules het beoogde gedrag hebben. Bijvoorbeeld wanneer u wijzigingen aanbrengt in de TU Delft, een submodule of een interfacemodule. We weten allemaal dat dingen kapot kunnen gaan, en je beste hulpmiddel om deze problemen op te lossen is de zelfcontrole-testbank.
Het te testen apparaat
Laten we meteen beginnen en een voorbeeld maken van een zelfcontrolerende testbank. Eerst hebben we iets nodig om te testen, een DUT. Daarvoor heb ik de module in de onderstaande code gemaakt. Het is een binaire naar grijze code converter.
library ieee;
use ieee.std_logic_1164.all;
entity gray_converter is
port (
bin : in std_logic_vector;
gray : out std_logic_vector
);
end gray_converter;
architecture rtl of gray_converter is
begin
process(bin) is
begin
gray(gray'high) <= bin(bin'high);
for i in bin'high - 1 downto bin'low loop
gray(i) <= bin(i + 1) xor bin(i);
end loop;
end process;
end architecture;
Grijze code is een alternatief nummercoderingsschema, dat verschilt van gewone binaire codering. De belangrijkste eigenschap en het doel van Gray-code is dat er slechts één bit verandert bij het tellen tussen aangrenzende getalwaarden.
Decimaal
Binair
Grijs
0
0000
0000
1
0001
0001
2
0010
0011
3
0011
0010
4
0100
0110
5
0101
0111
6
0110
0101
7
0111
0100
8
1000
1100
9
1001
1101
10
1010
1111
11
1011
1110
12
1100
1010
13
1101
1011
14
1110
1001
15
1111
1000
De bovenstaande tabel laat zien hoe Gray-code verschilt van binaire code.
De testbank
We beginnen met het maken van de basistestbank en het instantiëren van de DUT erin. De onderstaande code toont het testbench-bestand met de DUT geïnstantieerd en alle benodigde importen.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.env.finish;
entity gray_converter_tb is
end gray_converter_tb;
architecture sim of gray_converter_tb is
signal bin : std_logic_vector(3 downto 0) := (others => '0');
signal gray : std_logic_vector(3 downto 0);
begin
DUT : entity work.gray_converter(rtl)
port map (
bin => bin,
gray => gray
);
end architecture;
Let op:we importeren std.env.finish waarvoor VHDL-2008 vereist is. Als je de testbench in ModelSim probeert te compileren zonder iets te veranderen, krijg je de volgende foutmelding:
# ** Warning: gray_converter_tb.vhd(6): (vcom-1516)
Package "STD.ENV" does not exist in this language version.