Hasta ahora, hemos estado estudiado el lenguaje VHDL y hemos visto diversos ejemplos del mismo. Pero veamos cómo es un flujo de diseño basado en dicho lenguaje. Tal como se muestra en la figura. A partir de unas especificaciones del diseño a realizar, se aborda un proceso de modelado en VHDL, que acabará dando lugar al correspondiente modelo descrito en este lenguaje. Y que será el punto de partida para las tareas posteriores de simulación y síntesis. Para validar que el modelo VHDL desarrollado se ajusta a las especificaciones del diseño, procederemos con la etapa de simulación del mismo. Esto puede requerir múltiples iteraciones de simulación, o incluso alguna que otra iteración de modelado para reajustar dicho modelo hasta que lo demos por correcto. Con el modelo VHDL simulado y validado ya podemos proceder a su implementación hardware a través de los procesos de síntesis, que son los encargados de convertir este modelo en su materialización física para una determinada tecnología. Esta etapa también puede requerir algunas iteraciones hasta conseguir la realización hardware adecuada y con las prestaciones deseadas. Veamos todo ello en base a algunos ejemplos. Y empecemos por el modelado. Imaginemos que queremos desarrollar un módulo sumador-restador en función de la entrada "opcode" de números positivos, entradas "a" y "b". Y que nos devolverá el resultado en valor absoluto sobre la salida "z"; mientras que sobre la salida "sign" nos indicará el signo, "0" para positivo, "1" para negativo, de dicho resultado. Bien, pues este podría ser su modelo en VHDL. Que ahora, con todo lo que ya hemos aprendido, ya podríais analizar y entender. El siguiente paso sería simular dicho modelo en VHDL. Para ello, es necesario entender el concepto de banco de pruebas, o test bench en VHDL. Para poder simular el comportamiento hardware de un determinado modelo VHDL, necesitamos poder definir los estímulos a aplicar a las entradas de dicho modelo, para estudiar cómo reacciona y cómo se comporta. Y para ello se necesita el concepto de banco de pruebas o test bench. Tal como muestra la figura de arriba, el banco de pruebas o test bench no es más que un nuevo módulo VHDL. Que se conectará a las entradas del módulo a verificar, módulo bajo test, para ir aplicando estímulos a dichas entradas. Así mismo, las respuestas de salida del módulo bajo test se pueden llegar a conectar al mismo banco de pruebas donde puede haber una parte del mismo dedicada a analizar los resultados para detectar automáticamente errores de funcionamiento. Para el desarrollo de un entorno de test de este estilo, se dispone de toda la potencialidad del propio lenguaje VHDL, pudiendo dar lugar a bancos de pruebas o test bench de muy diferentes niveles de inteligencia y complejidad. Como vemos en estas figuras, estos entornos de test son como autocontenidos. Es decir, no hay conexiones hacia el exterior. Una vez tenemos todo el entorno montado en VHDL, ya podríamos proceder a su simulación, para después observar y analizar la evolución de sus señales. Tanto las entradas y salidas primarias, como las señales internas del módulo bajo test. En todo caso, muy a menudo se utilizan versiones más simples de estos entornos de test, o de estos bancos de pruebas, como esta que se muestra en la figura de abajo, donde el banco de pruebas se limita a inyectar estímulos a las entradas del módulo bajo test y sin que se produzca ninguna interacción entre ambos módulos, pues las respuestas del módulo bajo test no son tratadas en el banco de pruebas. Este será el caso que utilizaremos en este curso. Y del que vamos a ver un pequeño ejemplo en base el módulo "AddSub", sumador-restador, modelado en la transparencia anterior. Aquí tenemos de nuevo la entidad y la arquitectura del módulo a verificar. Y para el que desarrollaremos un entorno de test simple como el esquematizado en esta figura. Donde vemos que sólo proporcionaremos estímulos al módulo "AddSub". Sin llegar a hacer ningún tipo de análisis automático de sus resultados. Y este módulo VHDL de la derecha, es un posible entorno de test sencillo. Donde vemos que definimos una entidad llamada "TB_AddSub" sin ningún puerto de entrada/salida. Y que corresponde al sistema "TB_AddSub" completo de la figura de la izquierda. Para esta entidad definimos una arquitectura que conectará el proceso de generación de estímulos con el módulo bajo test. Y para ello, en la parte declarativa, definimos las señales de conexión entre ambos módulos, entre el proceso de generación de estímulos y el módulo que testear o verificar. En la parte descriptiva de esta arquitectura, entre el "begin" y el "end", vemos que instanciamos al módulo a testear, el módulo "AddSub", y conectamos sus puertos de entrada/salida a las señales que acabamos de declarar. Y definimos un proceso concurrente, el proceso "Stimuli", que generará los estímulos necesarios para las señales de entrada del módulo "AddSub". Y así, poder proceder a la simulación del conjunto completo. Siendo este el sistema "TB_AddSub" completo cuya simulación evolucionaría como veremos a continuación. Veamos ahora cómo evolucionaría el cronograma de simulación de este conjunto banco de pruebas más modulo bajo test. En primer lugar, ponemos unos valores en las señales de entrada del módulo "AddSub". C = 0110, d = 0011 y oper = add. Y a continuación, esperamos 100 nanosegundos que permitirán evaluar las entradas anteriores por parte del módulo "AddSub". Produciendo los resultados correspondientes como podemos ver en el cronograma de arriba a la izquierda. Después, cambiamos la entrada oper = sub. Y volvemos a ejecutar un "wait for 100 nanosegundos". Esperamos 100 nanosegundos para que dicho cambio de tipo de operación se evalué por el módulo "AddSub" y dé los resultados pertinentes en el cronograma. Y así, vamos avanzando hasta el final del proceso "Stimuli" donde llegamos a un "wait" sin condición de reactivación. Finalizando de esta forma la simulación cuyos resultados han ido apareciendo en el cronograma de arriba a la izquierda de esta transparencia. Veamos ahora un pequeño ejercicio o cuestión sobre la generación de estímulos de este ejemplo que acabamos de utilizar. ¿Se podrían considerar equivalentes estos dos procesos de generación de estímulos que tenemos aquí? ¿Este y este? Bien, pues la respuesta es que sí se pueden considerar equivalentes. En el primer caso, vamos definiendo los valores de las entradas del módulo "AddSub" a medida que va avanzando el tiempo de simulación. Mientras que, en el segundo caso, en primer lugar definimos los valores al principio del proceso. Y los cargamos en los drivers correspondientes. Esta parte de aquí. Y luego utilizaremos la sentencia wait para ir avanzando en periodos de 100 nanosegundos. Para que los distintos valores cargados en los drivers de las señales de entrada al módulo "AddSub" sean evaluados por este módulo. Y produzcan los resultados correspondientes. Bien, de este flujo de diseño basado en VHDL ya sólo nos falta ver un ejemplo de síntesis. Y para ello utilizaremos un ejemplo que ya conocéis. Un sumador paralelo de "n" bits que, en este caso, simularemos y sintetizaremos para un valor de "n = 4". Es decir, un sumador paralelo de 4 bits. Este es un modelo y para este modelo hemos hecho una simulación cuyos resultados se muestran en el cronograma siguiente. Donde en un momento dado vemos que las entradas X, Y toman los valores de "X = 3", "0011" en binario, e "Y = 1", "0001" en binario y "Cin = 0". Si en este instante de tiempo observamos el resultado, vemos que es "Z = 4", "0100", y "Cout = 0". Lo que parece correcto, pues X valía 3, Y valía 1, 3 más 1 es igual a 4 y no tenemos acarreo de salida. Si ahora procedemos a sintetizar dicho módulo contra una biblioteca de celdas o puertas lógicas como las estudiadas en este curso, podríamos obtener un resultado de este estilo donde podemos observar las tres entradas a la izquierda del (cronograma) esquema. Las dos salidas a la derecha y un conjunto de puertas interconectadas, que son inversores, orex, andori, etc. Que con los conocimientos adquiridos ya podéis comprobar realmente implementan un sumador completo de 4 bits. Y ahora ya acabamos resumiendo esta sesión. Donde hemos visto una selección de las sentencias concurrentes más importantes del VHDL. Hemos introducido muy brevemente el flujo de diseño basado en HDL que consta de tres etapas, modelado, simulación y síntesis. Y se han mostrado ejemplos sencillos de todo ello. Y con esta sesión cerramos esta introducción al lenguaje VHDL para facilitar su uso y comprensión dentro del curso de sistemas digitales. Muchas gracias y hasta la próxima.