Está en la página 1de 55

Lógica Programable

con FPGAs
Bancos de prueba
Testbenchs
Agenda
 Concepto de banco de prueba.
 Testbenchs
 Funcionamiento del simulador.
 VHDL orientado a bancos de prueba.
 Ejemplos de testbenchs.

Ing. Ariel Dalmas Di Giovanni 2


Testbench
 Banco de prueba.
 Se arma un banco como el del laboratorio,
pero “programando”.

Testbench

Dispositivo
Señales Bajo Verificación de
estimulo Prueba salidas
(DUT o UUT)

Ing. Ariel Dalmas Di Giovanni 3


Testbench
 Se utilizan para evaluar el funcionamiento
de los bloques.
 La idea es controlar las entradas a un
bloque para poder analizar las salidas y/o
los estados internos del bloque.

Ing. Ariel Dalmas Di Giovanni 4


Esquema básico
Testbench
Gráficos formas
Generador reloj señal

Dispositivo Comparación salidas


Generador reset Bajo esperadas
Prueba
(DUT o UUT)
Otras Otras

Ing. Ariel Dalmas Di Giovanni 5


Ejemplo: Evaluar un FFD
Testbench
Entradas a Salida a verificar
controlar

Generador
Reset

¿Qué voy a verificar?


¿Cómo lo voy a verificar?
Generador ¿Qué “instrumentos” necesito?
reloj

Ing. Ariel Dalmas Di Giovanni 6


Ejemplo: Plan de verificación de un
FFD
Reset
 Estado inicial entradas: D= ‘U’, E = 0.
 Espero que el reset esté en estado bajo.
 Un instante después verifico que Q se corresponda con la condición inicial.
 Verifico funcionamiento normal
 Habilito el FF  E = ‘1’.
 Coloco D = ‘1’, verifico en el próximo clock el valor de la salida Q=‘1’.
 Repito con D = ‘0’.
 Verifico Enable
 Deshabilito el FF  E =‘0’.
 Cambio el estado de D y se debe mantener la salida en los próximos ciclos
de reloj.
 Habilito el FF  E = ‘1’. Verifico que en el próximo reloj la salida tome el
valor de D.

Ing. Ariel Dalmas Di Giovanni 7


Lo que hay que saber antes de escribir el
testbench:
 Especificación técnica del bloque a verificar
 Condiciones temporales de las entradas y salidas.
 Protocolo de comunicación.
 Funcionamiento esperado del bloque.
 Etc…
 Qué voy a verificar.
 El funcionamiento completo.
 Una condición específica de funcionamiento.
 Una salida específica.
 Etc…
 Cómo lo voy a hacer
 Observando la salida después de un estado de entrada determinada.
 Verificando contra un algoritmo interno.
 Verificando con resultados esperados disponible en archivos.
 Necesito generar un “instrumento” (proceso) para chequear al dispositivo bajo
ensayo.
Esto se debe considerar en la carga de trabajo
 Etc….

Ing. Ariel Dalmas Di Giovanni 8


Funcionamiento del simulador
 Analiza temporalmente todos los procesos involucrados,
y arma una cola de ejecución para un instante temporal
determinado.
 Una vez que ese instante fue resuelto, es decir: todas
las asignaciones fueron resueltas, se avanza al instante
inmediato.
 Al principio (t = 0) resuelve las inicializaciones:
 Las señales que son inicializados por el diseñador
(“:=”, no las condiciones de reset).
 Los valores no inicializados se fuerzan a ‘U’
(uninitialized).

Ing. Ariel Dalmas Di Giovanni 9


Funcionamiento del simulador
 Por tanto, el simulador se ejecutará mientras existan
cambios en las señales. Deberemos indicar el fin de los
procesos.
 Si hacemos lazos, deberemos evitar que sean infinitos,
ya que esto implica que hay posibles cambios, por ende
se continuará la ejecución.
 Normalmente para finalizar el test detendremos el reloj.
 Los simuladores permiten ejecutar durante un lapso de
tiempo, es útil en ciertas circunstancias, pero no en la
normalidad de los test.

Ing. Ariel Dalmas Di Giovanni 10


VHDL para simulación
Recordando que…

Simulación
.vhd

VHDL
VHDL
Para Descripción
síntesis .vhd

Ing. Ariel Dalmas Di Giovanni 11


VHDL para simulación
 Se verán muchas sentencias que no son
sintetizables.
 Algunas sentencias se utilizan tanto en
simulación como en síntesis.
 La escritura del banco de pruebas es
“más” similar a programar.
 Existen ejecuciones en secuencia.

Ing. Ariel Dalmas Di Giovanni 12


Partes de un testbench
Procesos
independientes

Testbench

Generador reloj Gráficos formas señal


Dispositivo
Comparación salidas
Generador reset Bajo
esperadas
Prueba
(DUT o UUT)
Entradas Otras

Proceso independiente
Entidad sin o manejado por el
puertos proceso principal
Componente

Ing. Ariel Dalmas Di Giovanni 13


Partes de un testbench
 El testbench es
 Una entidad (entity) sin puertos.
 Todo lo que está dentro del “banco” se describe dentro de
la architecture.
 Cada generador independiente es un proceso concurrente.
 Proceso explícito
 Proceso implícito
 Existirá un proceso principal desde donde
 Se controlan las entradas al bloque.
 Se verifican las salidas.
 Es aquí donde se escribe la secuencia de verificación.
 El dispositivo a evaluar es un componente  component.
Ing. Ariel Dalmas Di Giovanni 14
Partes de un testbench
 Definir el prototipo del componente
 Tip:copie la definición de la entidad y
reemplace
 entity  component
 Se define antes del begin de la architecture.
 Se define en un paquete package

 Se debe instanciar el componente


 Deesta manera será un proceso concurrente
más del testbench.
Ing. Ariel Dalmas Di Giovanni 15
En VHDL
entity bloque_tb is
end entity bloque_tb; Entidad del
tesbench

architecture test of bloque_tb is


component c_not is Prototipo del
port ( a_i : in std_logic; componente
b_o : out std_logic);
Señales del
end component c_not ; testbench

begin Procesos
-- proceso reloj.
-- proceso reset.
-- Instanciación componente Instancio
-- proceso principal. componente
end architecture test;

Ing. Ariel Dalmas Di Giovanni 16


Instanciación de componentes
 Para instanciar se utiliza la sentencia:
<instancia> : <componente> port map (….);

Puerto

Nombre local del


test

Señal del testbench


El componente a
instanciar

Ing. Ariel Dalmas Di Giovanni 17


Instanciación de componentes
 Instanciación posicional
… port map (in1,out1);
Las señales del testbench se mapean con los puertos según el orden de la
definición (como en un llamado a función en programación)

 Instanciación nominativo
… port map (a_i => in1 , b_o => out1);

Puerto del Se mapea tácitamente el


componente puerto con la señal del
Señal interna del
testbench testbench

Ing. Ariel Dalmas Di Giovanni 18


Instanciación de componentes
architecture test of bloque_tb is
component c_not is Prototipo del
componente
port ( a_i : in std_logic;
b_o : out std_logic);
end component c_not ;
begin Instanciación del
dut : c_not componente
port map (a_i => in1 , b_o => out1);
-- proceso reloj.
-- proceso reset.
-- proceso principal.
end architecture test;

Ing. Ariel Dalmas Di Giovanni 19


Tipos de dato time
 Es un tipo de dato físico de VHDL, permite
representar el tiempo.
 Se definen también las unidades:
fs, ps, ns, us, ms, sec, min , hr
 Ej de señal tipo time:
signal t : time := 10 ps;
t <= t + 5 ps

Ing. Ariel Dalmas Di Giovanni 20


Medición de tiempo
 Si se quiere obtener el tiempo actual se puede utilizar
now.
t <= now;
 Es muy útil para medir tiempos parciales durante el
test.
 Por ejemplo:
variable t : time := 10 ps;
……
t := now;
…..
……
t := now – t;

Ing. Ariel Dalmas Di Giovanni 21


Tipo de dato boolean
 El tipo de dato booleano es muy útil para
modelar flags: true or false.
 Suele usarse como condicional.
 No es un tipo de dato muy apto para
utilizar en un puerto (síntesis).
 Se suele usar como parámetro (generic)
de un bloque.

Ing. Ariel Dalmas Di Giovanni 22


Detención del testbench wait
 La sentencia wait, detiene la ejecución del
testbench por siempre.
 Se puede combinar con sentencias condicionales:
 wait until: detener hasta que ocurra una condición.
 wait for: detener durante un tiempo determinado.
 wait on: espera que ocurra un evento del listado de
señales especificado (simil lista de sensibilidad).

Ing. Ariel Dalmas Di Giovanni 23


Detención del testbench wait
wait until reset = ‘0’; Se bloquea hasta que el reset
pase a estado ‘0’

wait for 10 ps; Se bloquea durante 10 ps.

Se bloquea por siempre


wait;

Se bloquea hasta que ocurra


wait on s1,s2; un evento en S1 ó S2.

Ing. Ariel Dalmas Di Giovanni 24


Ejemplo- Generador reloj.
gen_clock: process
begin
clk <= '1'; Usar constantes
wait for 50 ns;
clk <= '0';
wait for 50 ns;
if Fin then “Fin” es una señal booleana, que
wait; por defecto arranca en FALSE.

end if;
end process gen_clock;

Ing. Ariel Dalmas Di Giovanni 25


Ejemplo- Generador Reset.
gen_reset: process
begin El tiempo de reset mayor a un
reset <= '1'; período de reloj e impar
wait for 5*50 ns;
reset <= '0';
wait; El proceso queda detenido
end process gen_reset; definitivamente

Ing. Ariel Dalmas Di Giovanni 26


Verificación
 Para verificar condiciones se utiliza la sentencia
assert (afirmación).
 Se complementa con report y severity.
 Formato:

assert <condición afirmativa>


report <“mensaje de error”>
severity <tipo de severidad>;
Si no se cumple
la afirmación se
reporta.

Ing. Ariel Dalmas Di Giovanni 27


Verificación
 Tipos de severidad:
 note: Informativa.
 warning: Advertencia.
 error: Error.
 severity: Grave. Se detiene el test.
 La idea es detener el test cuando no se cumple
la afirmación.
 El mensaje (report) debe contener información
sobre qué fallo y qué valor se esperaba.
 El ISim suele informar el tiempo en el cual se
produjo el fallo.

Ing. Ariel Dalmas Di Giovanni 28


Verificación
¿Puedo informar el
estado de una señal?
 Ejemplo
assert enable = ‘1’
report “enable, no es ‘1’, es ‘0’” &
“el valor no es el esperado”.
severity failure;

Permite concatenar strings

Ing. Ariel Dalmas Di Giovanni 29


Atributos
 Los atributos son información adicional de
los elementos (tipo de datos) declarado en
VHDL.
 Nos serán de utilidad para generalizar
descripciones.
 El atributo image nos permitirá obtener el
valor “imprimible” de datos std_logic e
integer.
Ing. Ariel Dalmas Di Giovanni 30
Atributos
Comilla recta

 Formato:
<elemento> ’ atributo.
 Ejemplo (image):
std_logic ’ image (q_o)
Señal

atributo

Tipo de dato

Ing. Ariel Dalmas Di Giovanni 31


Mensaje de usuario
 Los simuladores poseen una consola para
informar.
 Desde el test podemos escribir en esta.
 Se utiliza el mismo mecanismo para
escribir en un archivo.
 La consola se asocia al flujo estándar de
salida “output”.

Ing. Ariel Dalmas Di Giovanni 32


La receta..
Definir una variable (en el proceso) del tipo line.
• variable s : line;
• line es un tipo de dato definido en:
• library std; use std.textio.all;
Cargar la línea “s” con el mensaje a escribir, mediante
write.
• write (s , string’(”Mensaje”));

Escribir la línea en el flujo usando writeline.


• writeline (output, s);

Ing. Ariel Dalmas Di Giovanni 33


Quiero ver un testbench

Ejemplo: FF-D
Ing. Ariel Dalmas Di Giovanni 34
Recordemos el Plan de verificación
de un FFD
 Reset
 Estado inicial entradas: D= ‘U’, E = 0.
 Espero que el reset esté en estado bajo.
 Un instante después verifico que Q se corresponda con la condición
inicial.
 Verifico funcionamiento normal
 Habilito el FF  E = ‘1’.
 Coloco D = ‘1’, verifico en el próximo clock el valor de la salida Q=‘1’.
 Repito con D = ‘0’.
 Verifico Enable
 Deshabilito el FF  E =‘0’.
 Cambio el estado de D y se debe mantener la salida en los próximos
ciclos de reloj.
 Habilito el FF  E = ‘1’. Verifico que en el próximo reloj la salida tome
el valor de D.
Ing. Ariel Dalmas Di Giovanni 35
Testbench de un FFD
Proceso principal del test

Espero al reset y evalúo el


estado inicial de las salidas

Ing. Ariel Dalmas Di Giovanni 36


Testbench de un FFD
Voy a probar la entrada de
datos (dato), dejo fija la señal
de habilitación.

Coloco un dato nuevo y veo


si cambia la salida después
del próximo flanco de reloj y
un infinitésimo más

Ing. Ariel Dalmas Di Giovanni 37


Testbench de un FFD
Evalúo el “enable”, guardo en
una variable auxiliar el valor
inalterable de la salida

Si estuvo todo bien, muestro un


mensaje, detengo el reloj, y el
testbench.

Ing. Ariel Dalmas Di Giovanni 38


Ejercicio 1
 Arme un proyecto para probar el FF-D, en
función de los archivos “FlipFlopD.vhd” y
“FlipFlopD_tb.vhd”.
 Complete el test y evalué el
funcionamiento.

Ing. Ariel Dalmas Di Giovanni 39


Ejercicio 2
 Arme un testbench para un multiplexor de 2
a 1.
 Evalúe los valores obtenidos

Ing. Ariel Dalmas Di Giovanni 40


Ejercicio 2
 Utilizando el testbench del multiplexor de
2 a 1, genere un testbench para un
multiplexor genérico de “N” salidas.

Ing. Ariel Dalmas Di Giovanni 41


Observaciones

 El testbench nunca queda genérico


totalmente
 Es necesario realizar mucho copy & paste.
 Se producen errores por copiar y reemplazar.
 El test deja de ser estable.
 Mediante el uso de funciones y
procedimientos se puede reducir y
minimizar estas cuestiones.
 Se pueden utilizar lazos iterativos.
Ing. Ariel Dalmas Di Giovanni 42
Lazos
 Son sentencias iterativas iguales a las
utilizadas en otros lenguajes de
programación.
 Se pueden utilizar en síntesis, pero
siempre el rango de la iteración debe estar
definido por un valor constante.
 Dos iteradores for loop y while.

Ing. Ariel Dalmas Di Giovanni 43


Lazos- for - loop
La variable de iteración es local al lazo.
No hace falta declararla

for i in <rango> loop


sentencia 1.
sentencia 2.
…..
sentencia n. El rango se puede definir:
end loop; - Ej: 0 to 2.
- Ej: 2 downto 0.
- atributos: <señal>’ range

Ing. Ariel Dalmas Di Giovanni 44


Lazos- while - loop

while <condicion> loop


sentencia 1.
sentencia 2.
…..
sentencia n.
end loop;

Ing. Ariel Dalmas Di Giovanni 45


Reemplazo de sentencias por lazos
Verificación de 3 salidas

“salida” es std_logic_vector

Ing. Ariel Dalmas Di Giovanni 46


Ejemplo test del contador

Ver: contador_tb.vhd

Ing. Ariel Dalmas Di Giovanni 47


Ejercicios
1. Realice un testbench para el generador de
checksum.
2. Realice un testbench para el codificador de binario
a siete segmentos.
3. Tomando como base el testbench del contador
(contador_tb.vhd) utilice lazos para verificar todos
los valores de cuenta de 0 a 9.
4. Realice un tesbench para verificar el
contador_enable.

Ing. Ariel Dalmas Di Giovanni 48


Esquema Avanzado
Esquema avanzado
Testbench
Gráficos formas señal
Generador reloj
Comparación salidas
Dispositivo esperadas
Generador reset
Bajo
Prueba
(DUT o UUT) Otras
Otras

Comparación salidas
esperadas
Archivos
estímulos Archivos
Script resultados Archivos
¿OK? resultados
esperados

Ing. Ariel Dalmas Di Giovanni 50


Esquema avanzado
 El uso de archivos potencia la evaluación.
 Se suele utilizar para verificar bloques
donde se necesita variar o someterlo a un
volumen de datos importante.
 Por ejemplo una memoria

Ing. Ariel Dalmas Di Giovanni 51


Esquema avanzado -Memoria
Testbench
Data

ADDR

Entradas a
controlar Comparo

Generador
Reset
Resultados
Generador
reloj

Ing. Ariel Dalmas Di Giovanni 52


Ventajas test avanzado
 El test es escalable
 Cantidadde datos
 Tamaños de buses de dirección y datos
 Combinaciones de Rd/Wr

 Permite escrituras / lecturas aleatorias. En


contraste con un lazo.
 Posibilita que los archivos sean generados
desde un lenguaje de alto nivel.

Ing. Ariel Dalmas Di Giovanni 53


Preguntas

Ing. Ariel Dalmas Di Giovanni 54


¡¡Muchas gracias!!

Ing. Ariel Dalmas Di Giovanni 55

También podría gustarte