Panel Sources de Vivado

1.6 Simulación

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 testbench alu_tb.vhd que se encuentra en la carpeta ./sim.

1.6.1 Iniciar la simulación:

En la ventana Flow Navigator selecciona:

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 ico_left_btn.

    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 ico_left_btn 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: ico_restart Run ‣ Restart

  • Ejecutar la simulación 1 ms: ico_run_for 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 ico_t0 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 testbench alu_tb.vhd no es correcto y deberemos corregirlo.

Ventana de simulación de Vivado

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.

1.6.4 Corregir y relanzar la simulación

  • 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 ico_relaunch, 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 ico_t0, 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 ico_zoom_out y mostrar la simulación completa ico_view_all.

    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.

1.6.5 Medir el tiempo entre eventos

  • Como ejemplo, se va a medir el tiempo entre flancos de la señal z_tb:

  • reinicia la simulación: Run ‣ Restart ico_restart

  • ejecuta la simulación 1000 ns: Run ‣ Run for ‣ 1000 ns ico_run_for

  • Mueve el cursor a la posición de inicio: icono ico_t0 en la ventana de formas de onda.

  • Mueve el cursor al primer flanco de bajada de la señal z_tb:

    • Selecciona z_tb ico_left_btn y pulsa icono ico_next_trans (Next Transition).

    • Añade un marcador: icono ico_marker_add (Add Marker).

    • Mueve el cursor hasta la siguiente transición de z_tb ico_next_trans.

    • Selecciona el marcador, haciendo click ico_left_btn 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

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 ico_save (Save Waveform Configuration), esta acción permite recuperar la configuración actual en una nueva simulación, Gurada el archivo en la carpeta sim.

1.6.6 Representación esquemática del diseño

  • En la ventana Flow Navigator selecciona:

    RTL Analysis ‣ Open Elaborated Design ‣ Schematic

    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.