Patrón de verificación a partir de forma de onda

La generación del patrón de verificación a partir de las formas de onda que excitan al modelo es la forma más simple de generar un modelo de verifiación

Los pasos que deben seguir son:

- Crear el modelo (código VHDL) estructurado que contenga al modelo (DUT) a verificar
- Crear en la arquitectura el formato de las formas de onda de las entradas del DUT

Ejemplo

Supongamos que se quiere comprobar el código correspondiente a un full-adder
Puesto que el full-adder tiene tres entradas, la forma exhaustiva de comprobar su funcionamiento es proporcionando todas las combinaciones posibles a sus entradas

En este caso, la forma de onda de las señales de entrada podrían estar descritas como

a <= not (a) after 1 ns;
b<= not (b) after 2 ns;
c_in<= not (c_in) after 4 ns;

Con ello, a los 8 ns se habría generado el código de comprobación completo, puesto que se habrían generado todas las posibles combinaciones de entrada

Este procedimiento parece simple. Sin embargo, cuando el modelo es algo más complejo suele ser más árduo encontrar fácilmente un modelo que compruebe con cierta seguridad el DUT

En lo que sigue de capítulo vamos a considerar como DUT la siguiente descripción de un contador

El siguiente código (que corresponde a un modelo de verificación ya completo del contador) pretende mostrar, de distintas formas, como se pueden generar formas de onda determinadas para un modelo. Hay que mirarlo con cuidado...

-- Código de verificación del contador
-- Generación de los vectores de comprobación a partir de forma de onda 'manual'

-- El modelo, de momento, sólo genera las entradas al circuito, por lo que no hace falta especificar entradas/salidas
Entity testXManual is
end;
Architecture bhr of testXManual is

Component compt_x --Declaración del modelo a verificar
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; -- El tiempo se especificará en función de t
signal ck, enable, load: bit:='1'; -- Deben declararse, e inicializar, las señales del interconexionado
signal d, q: natural range 0 to 15 := 14;
begin

cont: compt_x port map (ck, enable, load, d, q); --Llamada al modelo DUT
ck <= not ck after t; -- Se elige una señal de reloj de funcionamiento 'general'
load<= '0', '1' after 3*t+(1 ns), '0' after 4*t+(1 ns); -- Se especifica momento de carga de estado del contador
process -- Se ejecutarán acciones particulares en la aplicación del patrón
begin

wait until q=2; -- Uso de wait con motivo de establecer una acción en un estado determinado
enable <= '0';
wait for 2*t+(1 ns); -- Se espera a que el flanco de reloj actualice el estado (provocado por load)
enable <= '1';
wait; -- ¡Es un wait genérico! Sirve para que el simulador ejecute la transacción y evolucione

end process;

end bhr;

El siguiente gráfico muestra la respuesta del modelo

Algunas conclusiones de este código:

- Cuando en el DUT existe una señal de reloj puede ser conveniente tomarla como sincronismo global. Hay que recordar inicializar el reloj en la declaración, previo a la entrada en la arquitectura

- Pueden crearse formas de onda fáciles para las entradas utilizando after

- Uso de wait: es muy interesante observar que nos puede servir para generar tiempos de espera o ir a estados determinados ejecutando, a continuación, acciones correspondientes. En el ejemplo se muestran tres variaciones del wait:

- Unido a until. Indica tiempo de espera indefinido hasta que se ejecute un evento determinado

- Unido a for. Indica tiempo definido de espera

- Sólo. Fuerza la ejecución del evento que está pendiente

Anterior
Volver a inicio curso
Volver a inicio capítulo
Siguiente


WcN - Joan Oliver. Diseño de circuitos digitales con VHDL: VHDL: modelado y verificación