# Programación en VHDL/Bancos de pruebas

En VHDL es posible describir modelos para la simulación. Estos modelos no tienen demasiadas restricciones, necesitando únicamente un intérprete de las instrucciones VHDL. En cambio, en la síntesis se añaden una cantidad de restricciones como pueden ser aquellas que tienen que ver con las del tiempo, ya que no es posible aplicar retardos a la hora de diseñar un circuito.

## Retrasos

El retraso es uno de los elementos más importantes de la simulación, puesto que el comportamiento de un circuito puede cambiar dependiendo del cambio de las diferentes señales. Cuando se realiza una asignación se produce de forma inmediata, puesto que no se ha especificado ningún retraso. Este comportamiento puede ser alterado mediante la opción AFTER cuando se asigna un valor a una señal. Su sintaxis corresponde a la siguiente línea.
Donde tiempo es un valor de tiempo indicado en us, ns, ms, ... Un ejemplo puede ser el siguiente.
Pero esta sentencia es mucho más compleja, por ejemplo se puede asignar inicialmente un valor y modificarlo posteriormente o incluso que sea modificado cada cierto tiempo.
También es posible introducir una espera entre dos sentencias mediante la palabra reservada WAIT. La sintaxis de esta operación es más compleja que la anterior.
Lista corresponde a una lista de sensibilidad de señales, es decir, se permanecerá en espera hasta que se produzca un cambio en alguna de las señales de la lista. Condición se trata de una espera indeterminada hasta que la condición sea verdadera. Por último, el tiempo es un valor definido en una unidad de tiempo. A continuación se muestra un ejemplo de las tres esperas posibles.

## Niveles lógicos

Normalmente existen tres niveles lógicos: 0, 1 y X, donde éste último se refiere a un valor desconocido (puede estar a alto o bajo nivel, no se sabe cuál de los dos).
También existen las llamadas fuerzas. S equivale a la salida obtenida de una conexión a alimentación o a tierra a través de un transistor. R es idéntico al anterior, pero su obtención es a través de una resistencia. Z también es igual a las anteriores, pero esta vez es cuando la señal es obtenida mediante una alta impedancia. Por último, se encuentra I, que indica que no se sabe qué fuerza existe en el bus.
El tipo std_logic amplía estas fuerzas, incluyendo U y -. La primera indica que una señal no ha sido inicializada y la segunda que no importa el valor que se ponga.

## Notificaciones

En la simulación de circuitos es interesante el uso de las notificaciones, gracias a ellas se pueden advertir que señales han sido activadas o incluso comprobar si una señal ha tomado un valor determinado. El uso de notificaciones se realiza mediante ASSERT, seguida de una condición como elemento de activación. La sentencia puede utilizarse tanto en entornos concurrentes como en serie.
Si la condición no se cumple aparecerá en la pantalla del simulador el mensaje que se ha especificado y el nivel de gravedad, ambos son opcionales y en el caso de no indicar ningún mensaje aparecerá "Assertion Violation". Los diferentes niveles de gravedad pueden ser (de menor a mayor): note, warning, error (por defecto) y failure. Dependiendo del nivel de gravedad la simulación puede detenerse.
A continuación se muestran una serie de ejemplos de esta sentencia.

## Descripción de un banco de pruebas

Una de las partes más importantes en el diseño de cualquier sistema son las pruebas para la verificación del funcionamiento de un sistema. Con las metodologías tradicionales la verificación sólo era posible tras su implementación física, lo que se traducía en un alto riesgo y coste adicional. Lo más sencillo es cambiar las entradas para ver cómo son las salidas, en una herramienta de simulación, siempre que su diseño sea sencillo, en caso contrario lo más cómodo sería crear un banco de pruebas.
Un banco de pruebas es una entidad sin puertos, cuya estructura contiene un componente que corresponde al circuito que se desea simular y la alteración de las diferentes señales de entrada a dicho componente, para poder abarcar un mayor número de casos de prueba. Es recomendable realizar la descripción del banco de pruebas de un sistema a la vez que se describe su diseño. Las siguientes líneas muestra la sintaxis de un banco de pruebas.
A continuación se muestran las diferentes metodologías que se pueden llevar a cabo para la realización de un banco de pruebas. Para su explicación se utilizará un ejemplo de un diseño muy sencillo, donde un vector es rotado un bit hacia la izquierda o derecha dependiendo de la entrada met, su entidad corresponde al siguiente trozo de código.

### Método tabular

Para verificar la funcionalidad de un diseño se debe elaborar una tabla con las entradas y las respuestas que se esperan a dichas entradas. Todo ello se deberá relacionar mediante código VHDL. Las siguientes líneas muestran un ejemplo con el diseño que se expuso anteriormente.

### Uso de ficheros (vectores de test)

En el caso anterior los casos de prueba y el código de simulación permanecían juntos, pero es posible separarlos de forma que, por un lado se encuentren las pruebas y por otro el código. Esto es posible ya que VHDL dispone de paquetes de entradas/salida para la lectura/escritura en ficheros de texto, como ya se comentó el paquete textio dispone de los subprogramas necesarios para el acceso a dichos ficheros.
Supóngase los casos de prueba desarrollados en el caso anterior, en el siguiente fichero de texto se han escrito los vectores de prueba:
A continuación se muestra el código relacionado con la simulación, en él se incluye el acceso al fichero anterior que contiene los diferentes vectores de test.

### Metodología algorítmica

Existe otro tipo de test, los cuales se basan en realizar algoritmos para cubrir el mayor número de casos posibles. A continuación se muestra un ejemplo, el cual aplica esta metodología.