Mejora la verificación de hardware con un testbench interactivo basado en Tcl
Un testbench interactivo es una configuración de simulador donde la entrada al dispositivo bajo prueba (DUT) es proporcionada por un operador mientras el testbench se está ejecutando. Lo más frecuente es que esto signifique ingresar comandos en la consola del simulador para proporcionar estímulos al DUT.
Aunque siempre debe crear un testbench de auto-comprobación, un testbench interactivo puede ser un buen complemento. Es más fácil realizar pruebas ad-hoc con un testbench interactivo a mano, que cambiar el código del testbench de auto-comprobación.
A menudo, descubrirá problemas en el laboratorio que querrá probar en el testbench. Con un testbench interactivo, puede ser tan fácil como escribir la secuencia de entrada que se ha observado para replicar el comportamiento indeseable en el simulador.
Tcl interactuando con VHDL
La mayoría de los simuladores VHDL usan Tcl como lenguaje de consola. Los simuladores tienen un montón de comandos específicos del proveedor, pero la buena noticia es que pueden tratarse como cualquier otro comando Tcl. Puede usar Tcl para crear scripts complejos, mayormente portables, para gestionar y dar soporte a sus testbenches VHDL.
Cambiando señales VHDL desde Tcl
Para interactuar con VHDL, necesitamos encontrar el comando para cambiar el valor de una señal. En ModelSim, este es el comando "force". Como se especifica en el documento de referencia de comandos, la sinopsis del comando es:
force {<object_name> <value> [[@]<time_info>][, <value> [@]<time_info>]... [-deposit | -drive | -freeze] [-cancel [@]<time_info>] [-repeat [@]<time_info>]
El interruptor que quiere usar es la bandera "-deposit". Esto cambia el valor de la señal VHDL instantáneamente, pero permite que otro controlador VHDL o Tcl lo cambie a otra cosa en un momento posterior.
Ignorando las opciones que no usamos, la sinopsis simplificada se ve así:
force -deposit <signal_name> <value>
El disparador VHDL
Ahora que sabemos cómo controlar señales VHDL desde Tcl, necesitamos crear algún tipo de proceso receptor en nuestro testbench VHDL. El código siguiente muestra un ejemplo mínimo de tal testbench.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity interactive is
end interactive;
architecture sim of interactive is
-- Controlado por Tcl
signal trigger : std_logic := '0';
begin
process is
begin
wait until trigger = '1';
report "Triggered!";
end process;
end architecture;
El proceso se despertará cuando la señal trigger cambie de algo a '1'. Imprimirá "Triggered!" en la consola cuando esto suceda, permitiéndonos probar el concepto de controlar procesos VHDL desde Tcl.
Hice exactamente eso en la consola de ModelSim. Los comandos emitidos, así como la salida, pueden verse en el transcript a continuación.
VSIM 1> run 10 ns; VSIM 2> force -deposit /trigger '1' VSIM 3> run 0 ns; # ** Note: Triggered! # Time: 10 ns Iteration: 0 Instance: /interactive VSIM 4> force -deposit /trigger '0' VSIM 5> run 10 ns;
Ejecuté el testbench durante 10 nanosegundos después de iniciar la simulación.
Luego, forcé la señal trigger a '1'. En la siguiente línea, esperé 0 nanosegundos. El propósito de esto es crear un ciclo delta. Quiero que el proceso se dispare, pero no quiero que pase tiempo de simulación.
Finalmente, forcé la señal trigger de vuelta a '0' antes de continuar el testbench.
Podemos ver que el proceso VHDL se despertó después de la línea "run 0 ns", e imprimió "Triggered!" en la consola.
Leyendo valores de señales VHDL en Tcl
Para leer valores de señales en ModelSim, puede usar el comando "examine". Podemos, por ejemplo, leer el valor de la señal trigger usando este comando en la consola de ModelSim:
VSIM 6> examine /trigger # 0
Querrá asignar el valor a una variable Tcl cuando use "examine" en un script. Intentemos esto en la consola de ModelSim:
VSIM 7> set triggerVal [examine /trigger] # 0
Luego podemos, por ejemplo, imprimir la variable usando el comando Tcl "puts":
VSIM 8> puts "triggerVal: $triggerVal" # triggerVal: 0
Deteniendo el simulador después de cada prueba
La forma más fácil de ejecutar la prueba el tiempo suficiente para que el DUT reaccione, es simplemente ejecutar el simulador por un valor de tiempo fijo. Por ejemplo, si el DUT debería reaccionar después de dos ciclos de reloj, y el período del reloj es 10 nanosegundos, usaríamos el comando "run 20 ns" en nuestro script Tcl.
Si el DUT no tiene un tiempo de reacción fijo, una aserción VHDL puede usarse para detener la simulación y pasar el control a una función de callback Tcl. En ModelSim, esto significaría establecer un punto de interrupción desde su script Tcl usando el comando "when":
when [[-fast] [-id <id#>] [-label <label>] {<when_condition_expression>} {<command>}]
También tendría que definir una función de callback "onBreak" en Tcl que se ejecutará cuando se alcance el punto de interrupción. La función "onBreak" está especificada en la referencia de comandos de ModelSim.
Los inconvenientes de las pruebas dirigidas por Tcl
Hay inconvenientes en el uso de testbenches que dependen en gran medida de scripts Tcl. Los más aparentes son los problemas de velocidad y portabilidad.
Los testbenches dirigidos por Tcl funcionan iniciando y deteniendo el simulador múltiples veces para interactuar con el código VHDL. Iniciar y detener la simulación para ejecutar una función Tcl entre medio, consume más tiempo que ejecutar un testbench VHDL continuamente. Mientras Tcl es un lenguaje interpretado, VHDL se compila en el simulador y se ejecuta mucho más rápido que Tcl.
Aunque Tcl es portable a otros simuladores, los comandos específicos del simulador que tendrá que usar, no lo son. Incluso si encuentra los comandos equivalentes en el otro simulador, pueden funcionar de manera diferente. Los proveedores de simuladores inventan su propio conjunto de reglas para los comandos que soportan. Por lo tanto, un testbench dirigido por Tcl debe considerarse menos portable que un testbench puro VHDL.
Nuevo curso de VHDL y FPGA
* Estoy creando un nuevo curso de VHDL y FPGA que profundizará en testbenches extensivamente. Aprenderá cómo crear un diseño FPGA desde cero. Después de completar el curso, sabrá cómo crear testbenches de auto-comprobación, y cómo reutilizar el código para crear un testbench interactivo.
* Actualizado 12 de octubre de 2020: He completado el curso. Haga clic en la imagen a continuación para obtener más información.
El producto que crearemos es un módulo controlador de matriz de puntos LED. Usaremos la placa de desarrollo Lattice iCEstick de $49. Al final, implementaremos el diseño en una protoboard. Podrá escribir en el teclado de su computadora, y los caracteres aparecerán en la pantalla LED de matriz de puntos controlada por el FPGA.
¡Lea más sobre el curso Dot Matrix VHDL y FPGA aquí!
Apertura:
Por decidir.
VHDL
- Construcción de un proyector láser interactivo con sensores Zigbee y plataforma Gravio Edge
- Convertir una Fresadora en Torno: Pasos Fáciles para Metalúrgicos
- Dominando las Sentencias Using en C#: Importaciones, Alias y Directivas Estáticas
- Introducción a VHDL: Construyendo tu primera compuerta AND
- Guía completa de conversiones de tipos VHDL con Numeric_Std y Std_Logic_Arith
- Ejemplo de procedimiento VHDL: Incrementando un vector Standard Logic
- Aprovechando records VHDL para interfaces FIFO limpias y reutilizables
- Dominando tipos Signed vs Unsigned en VHDL: Perspectivas prácticas
- Variables VHDL explicadas: Ejemplos prácticos y reglas para diseño fiable
- Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
- Cómo construir un testbench de auto-comprobación en VHDL: Guía práctica