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 entradasEn 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 isComponent 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;
begincont: 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
beginwait 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 evolucioneend 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