Um testbench de autoverificação é um programa VHDL que verifica a exatidão do dispositivo em teste (DUT) sem depender de um operador para inspecionar manualmente a saída. O testbench de autoverificação é executado inteiramente por conta própria e imprime uma mensagem “OK” ou “Falha” no final.
Cada módulo VHDL deve ter um testbench de autoverificação associado. É importante poder verificar se todos os módulos têm o comportamento pretendido a qualquer momento. Por exemplo, quando você faz alterações no DUT, em um submódulo ou em um módulo de interface. Todos nós sabemos que as coisas podem quebrar, e sua melhor ferramenta para detectar esses problemas é o testbench de autoverificação.
O dispositivo em teste
Vamos pular direto e criar um exemplo de um testbench de autoverificação. Primeiro, precisamos de algo para testar, um DUT. Para isso criei o módulo no código abaixo. É um conversor de código binário para Gray.
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;
O código cinza é um esquema de codificação de número alternativo, diferente da codificação binária regular. A principal propriedade e propósito do código Gray é que apenas um bit muda ao contar entre valores numéricos adjacentes.
Decimal
Binário
Cinza
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
A tabela acima mostra como o código Gray difere do código binário.
A bancada de teste
Começaremos criando o testbench básico e instanciando o DUT dentro dele. O código abaixo mostra o arquivo testbench com o DUT instanciado e todas as importações necessárias.
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;
Observe que estamos importando std.env.finish que requer VHDL-2008. Se você tentar compilar o testbench no ModelSim sem alterar nada, receberá o seguinte erro:
# ** Warning: gray_converter_tb.vhd(6): (vcom-1516)
Package "STD.ENV" does not exist in this language version.