Utilizaremos un simulador para depurar y verificar el correcto funcionamiento
del diseño antes de implementarlo en la FPGA.
Para simular el diseño es necesario utilizar un entorno de test (testbench).
El entorno de test es una entidad que engloba a nuestro diseño y que genera los
estímulos de entrada para verificar la corrección funcional del mismo.
Como sólo se utiliza para simulación, se pueden utilizar construcciones VHDL no
sintetizables.
En este diseño utilizamos el testbenchalu_tb.vhd que se encuentra en la
carpeta ./sim.
Simulation ‣ Run Simulation ‣ Run Behavioral Simulation
Se abre la ventana SIMULATION dividida en tres partes:
SCOPE:
Muestra la jerarquía del diseño.
OBJECTS:
Muestra las señales disponibles en el bloque seleccionado en SCOPE
WAVES:
Ventana de formas de onda.
Cuando se ejecuta la simulación por primera vez, en la ventana de formas de
onda se incluyen las señales disponibles en el nivel más alto de la
jerarquía (alu_tb en nuestro caso) y se ejecuta una simulación de 1 us.
1.6.2 Añadir señales a la ventana de formas de onda
Añadiremos las señales internas del módulo alu:
En SCOPE selecciona ALU_0 .
El contenido de la ventana OBJECTS ha cambiado,
pasando a mostrar las señales internas del módulo alu.
Los puertos de
entrada están marcados con el símbolo I, los de salida
O
y las señales internas con un ● (en el menú settings se pueden
seleccionar los tipos de señales mostradas).
Selecciona las señales internas de ALU_0 y arrástralas
a la ventana de formas de onda para incluirlas en la simulación.
Observa que aparecen las señales pero no las formas de onda, es necesario
reiniciar la simulación para que aparezcan.
1.6.3 Reiniciar la simulación y simular durante un tiempo determinado
Reiniciar la simulación: Run ‣ Restart
Ejecutar la simulación 1 ms: Run ‣ Run for ‣ 1 ms
Observarás que algunas señales además de tomar los valores
\(\textsf{'1'}\) y \(\textsf{'0'}\)
toman el valor \(\textsf{'X'}\) (desconocido), si se retrocede al
inicio de la simulación (icono en la ventana de formas de
onda) se observa que la señal
a_tb[7:0] tiene el valor \(\textsf{"UUUUUUUU"}\) (uninitialized)
que se propaga y causa que las salida salida_tb[7:0] tenga todos los
bits a \(\textsf{'X'}\).
Se debe a que el testbenchalu_tb.vhd no es correcto y deberemos
corregirlo.
Ventana de simulación de Vivado tras añadir las señales internas del módulo alu.
En la imagen se muestran las señales internas de la ALU con su nombre
jerárquico completo (alu_tb/ALU_0/signal_name), que permite identificar
la ubicación de la señal en el diseño.
Para activar los nombres largos:
en la ventana de formas de onda seleccione el nombre de la
señal (op_xor[7:0]) botón derecho del ratón ‣ Name ‣ long
También se ha incluido un divisor (ALU) para
agrupar las señales internas del módulo alu.
Para añadir un divisor:
en la ventana de formas de onda: botón derecho del ratón ‣ New Divider.
Activa la pestaña SOURCE (situada junto a SCOPE) y abre el fichero
alu_tb.vhd que encontrarás en el bloque Simulation Sources.
Busca el primer test, observarás que no se le da valor a a_tb por
lo que mantiene el valor \(\textsf{"UUUUUUUU"}\) (uninitialized).
Da un valor a a_tb (\(\textsf{"00000000"}\) por ejemplo) y
guarda el fichero.
Relanza la simulación Run ‣ Relaunch Simulation,
de esta forma se vuelven a compilar los fuentes y se reinicia la simulación.
Si no hay errores, en la ventana de formas de onda aparecerá el resultado
de la simulación. Ve al inicio , comprobarás
que todas las señales tienen un valor lógico válido.
Verifica el correcto funcionamiento del diseño.
Comprueba en la ventana de formas de onda que la operación que
selecciona la señal alu_tb[1:0] se calcula de forma correcta.
Por defecto los buses se representan en hexadecimal, es posible cambiar
el formato: en la ventana de formas de onda seleccione el nombre de la
señal (a_tb[7:0]) botón derecho del ratón ‣ Radix ‣ Unsigned decimal.
Es posible moverse por la simulación utilizando las barras de scroll así
como hacer zoom y mostrar la simulación completa .
En la venta de ondas verás además un cursor (línea vertical amarilla) que
puedes desplazar con el ratón por la simulación, mientras lo desplazas en
la parte superior indica el tiempo, y a la derecha del nombre de las
señales se indica su valor en ese instante.
Como ejemplo, se va a medir el tiempo entre flancos de la
señal z_tb:
reinicia la simulación: Run ‣ Restart
ejecuta la simulación 1000 ns: Run ‣ Run for ‣ 1000 ns
Mueve el cursor a la posición de inicio: icono en la ventana de formas de onda.
Mueve el cursor al primer flanco de bajada de la señal z_tb:
Selecciona z_tb y pulsa icono (Next Transition).
Añade un marcador: icono (Add Marker).
Mueve el cursor hasta la siguiente transición de z_tb.
Selecciona el marcador, haciendo click sobre la
etiqueta que muestra el tiempo.
En la parte inferior de la ventana de ondas aparece una regla
donde se marcan los tiempos tomando como referencia el marcador
seleccionado.
Ventana de simulación de Vivado mostrando la medición del tiempo entre dos flancos de la señal z_tb.
Guarda la configuración de las formas de onda:
En la ventana de formas de onda (Save Waveform
Configuration), esta acción permite recuperar la configuración
actual en una nueva simulación, Gurada el archivo en la carpeta sim.
Verifica que la representación mostrada corresponde con el diseño
de la ALU.
Completa el testbench
En el testbench que hemos utilizado en esta práctica, sólo se definen cuatro
casos de test para verificar el funcionamiento de la ALU.
Completa el test bench introduciendo más casos relevantes que permitan verificar
por simulación el correcto funcionamiento de la ALU para todas las
operaciones definidas.