-- Modelo de test de un contador basado en tabla de verificación para autotest
-- La señal okq corresponde a la salida esperada
--
Declaración de la entidad

Entity testXTaula is

port (okq: out bit); -- Señal de salida: se activa cuando se produce error

end;
Architecture bhr of testXTaula is
type mostra is record -- Paso1: Registro de las señales de la tabla de test

enable, load: bit;
d, q: natural range 0 to 15;

end record;
type array_test is array (natural range <>) of mostra; -- Paso 2: Creación de un array de registros
constant test: array_test:=( -- Paso 3: Inicialización del array

('1','1', 5, 5), --carga
('1','0', 12, 6), --contar
('1','0', 12, 7), --contar
('1','0', 12, 7), --contar+error
('0','0', 12, 8), --mantener
('0','0', 12, 9), --mantener+error
('1','0', 14, 9), --contar
('1','1', 14, 14), --carga
('1','0', 14, 15), --contar
('1','0', 14, 0), --contar
('1','0', 14, 1) --contar

);
Component compt_x -- Declaración del DUT, el contador
port (

ck, enable, load: in bit;
d: in natural range 0 to 15;
q: out natural range 0 to 15);

end component;
constant t: time := 2 ns; -- Constante temporal
constant delta: time := 1 ns;
signal
ck, enable, load: bit:='1'; -- Señales de interconexión
signal d, q, testq: natural range 0 to 15;
begin

compt: compt_x port map (ck, enable, load, d, q); -- Instanciación del DUT
ck <= not ck after t; -- Generación del reloj automática
process
begin

for i in test'range loop -- Bucle de aplicación de la tabla de verificación

enable <= test(i).enable; -- Aplicación de la señal de enable
load <= test(i).load; -- Aplicación de la señal de carga
d <= test(i).d; -- Entrada paralela
wait until ck'event and ck='1'; -- Aplicación del vector de verificación
testq <= test(i).q;
wait for delta; -- Después de un delta se comprueba la salida

end loop;

end process;
okq <= '0' when testq=q else '1'; -- Señal de comprobación de salida

end bhr;


WcN - Joan Oliver. Diseño de circuitos digitales con VHDL