ENTORNO VISUAL DE SIMULACIÓN DE MIPS BASADO EN VHDL Jesús M. Álvarez Llorente, Nieves Pavón Pulido Departamento de Ingeniería Electrónica, Sistemas Informáticos y Automática, Escuela Politécnica Superior, Universidad de Huelva. Julio Ballesteros Rubio Departamento de Informática, Escuela Politécnica, Universidad de Extremadura. Resumen: En este trabajo presentamos una aplicación que permite la simulación visual del funcionamiento de una máquina basada en MIPS. La novedad de este sistema frente a los simuladores convencionales es que el motor de simulación es el resultado de la simulación real con un entorno de desarrollo de VHDL, que puede ser modificada y simulada de diversas formas con el objetivo de comprobar y estudiar su funcionamiento. Así conseguimos conjuntar la versatilidad de un entorno comercial de desarrollo de VHDL y la facilidad de manejo y amenidad de un entorno gráfico. Finalmente, se ha definido un lenguaje ensamblador que permite desarrollar pequeñas aplicaciones de prueba para el computador simulado. Palabras clave: Multimedia e Hipermedia en educación, Evaluación de entornos educativos. Introducción La máquina MIPS, descrita en [Pat95], es el sistema más empleado actualmente como referencia en la enseñanza de las asignaturas de arquitectura de computadores. Existen multitud de simuladores de todo tipo para mostrar el funcionamiento de cualquiera de las versiones de MIPS, y no es difícil encontrar en Internet descripciones VHDL completas de las mismas. En nuestro sistema utilizamos una máquina basada en la versión segmentada de MIPS con control de riesgos, en la se que ha efectuado una reducción en el formato y repertorio de instrucciones. La simulación mediante VHDL de una máquina como MIPS permite al alumno enfrentarse a la construcción real de una UCP. Sin embargo, algunas de las herramientas que permiten trabajar con VHDL no proporcionan, como resultado de la simulación, más que una larga lista de tiempos y estados que resultan bastante abstractos y difíciles de interpretar para un alumno que comienza a conocer el funcionamiento de la UCP y los sistemas segmentados. Nuestro sistema de simulación pretende proporcionar un interface gráfico que facilite la interpretación de los resultados numéricos obtenidos mediante la utilización de una herramienta VHDL convencional, en concreto el simulador VSIM distribuido por Model Technology Incorporated, Version 1.2. Debido a las limitaciones de la versión compilador utilizado, se ha hecho una simplificación sobre la estructura de la máquina MIPS, reduciendo el repertorio de instrucciones y la capacidad de memoria. La máquina resultante se describe detalladamente más adelante. El proceso de simulación con el nuevo sistema parte de la construcción de la descripción VHDL de la máquina, sobre la cual se pueden realizar determinadas modificaciones para comprobar el funcionamiento (por ejemplo, cambiar una definición de comportamiento por una definición estructural). Esta descripción es compilada mediante el entorno de Model Technology. El siguiente paso es la creación de un programa de prueba para la UCP diseñada. Para este propósito se ha definido un lenguaje ensamblador que permite realizar programas sencillos utilizando el repertorio de instrucciones, etiquetas, variables, etc. Se dispone de un editor de código fuente y un programa ensamblador que traduce la aplicación codificada a una representación que es aceptada, a través de un fichero, por la descripción VHDL de la UCP. A continuación, desde el entorno gráfico, se invoca al simulador VSIM, con el que debemos trabajar de la forma habitual, haciendo que se muestre el estado de las señales que nos interesen, programando la resolución de tiempo deseada, y realizando una simulación suficientemente larga como para que el programa codificado pueda terminar. Si no dispusiéramos del entorno gráfico, lo siguiente sería analizar el fichero de resultados intentando identificar las operaciones de cada etapa de segmentación, el estado de las señales de control, etc., mediante un conjunto de números binarios y decimales que proporciona el simulador. Sin embargo, el analizador gráfico, la última etapa de simulación con nuestro sistema, nos permitirá repetir la simulación mostrando los resultados en un esquema gráfico en el que se representan todos los bloques y señales de la máquina. La activación de líneas de control se representa mediante colores, y las líneas de datos muestran su contenido mediante una etiqueta. Disponemos de opciones que nos permiten avanzar y retroceder en el proceso de ejecución del programa, así como realizar una ejecución auto-animada. De esta forma se puede observar fácilmente cómo se desarrolla la ejecución del programa a través de las distintas etapas de segmentación. Objetivos Los objetivos propuestos para este sistema son los siguientes: - Disponer de un entorno gráfico sencillo e intuitivo, que muestre gráficamente el estado de la máquina y permita avanzar y retroceder en el proceso de simulación. - Proporcionar un lenguaje de programación que permita probar el funcionamiento con diferentes programas de forma rápida y sencilla. - Utilizar un entorno VHDL real para realizar la descripción del computador, de modo que sirva para estudiar este lenguaje mediante un ejemplo real, aprovechando las ventajas de una simulación gráfica y la existencia de un compilador. - Realizar la simulación al nivel de las señales eléctricas digitales que gobiernan la UCP. Puesto que la simulación inicial desde el entorno VHDL puede configurarse para atender a cualquier conjunto de las señales de la máquina, podemos centrarnos en componentes aislados de la UCP, o estudiarla de forma global. Incluso podemos hacer ambas cosas durante la misma simulación, mostrando u ocultando señales durante el desarrollo de la misma. - Que sea adaptable a diferentes herramientas de desarrollo VHDL. Metodología Como se ha comentado anteriormente, se han diseñado tres partes fundamentales que componen la aplicación. El corazón del simulador es la implementación del comportamiento de una máquina basada en una versión reducida de MIPS en VHDL, que produce una simulación real en un fichero que contiene la información obtenida sobre tiempos y estado de la máquina. Este fichero de tiempos y estados es recogido por la aplicación creada para mostrar los resultados de forma visual. Por otro lado, la aplicación ofrece la posibilidad de crear programas sencillos en ensamblador, compilarlos y traducirlos a código máquina de MIPS. De esta forma, el alumno puede familiarizarse muy pronto con la forma de trabajo de una máquina que utiliza técnicas de segmentación para producir resultados de forma más eficiente. El simulador permite visualizar el contenido de la memoria de instrucciones y de la memoria de datos. El conjunto de instrucciones máquina obtenidas del proceso de compilación se utilizan como el programa que estará cargado en la memoria de instrucciones, y que ejecutará MIPS al realizar la simulación desde el entorno de VHDL, obteniéndose como resultado el fichero con los datos de la simulación. Luego, la aplicación interpreta dicho fichero para que sea posible observar visualmente cómo evolucionan en el tiempo los diversos componentes de la máquina y cómo fluye la información a través de la segmentación. Veamos cada parte del simulador más detalladamente. Descripción de la máquina MIPS restringida Se utiliza una arquitectura tipo RISC segmentada, con una profundidad de 5 etapas. Cada etapa se encuentra separada de la siguiente por el correspondiente registro de segmentación: Etapa IF (Búsqueda de la instrucción) (Registro IF/ID); Etapa ID (Decodificación de la instrucción) (Registro ID/EX); Etapa EX (Ejecución de la instrucción) (Registro EX/MEM); Etapa MEM (Escritura en memoria) (Registro MEM/WB); Etapa WB (Postescritura) Existe un banco de registros formado por 8 registros denominados R0 a R7, de 16 bits cada uno. Además, se emplean mapas de memoria separados para instrucciones y datos. El tamaño de la palabra de memoria es de 8 bits. La organización de la memoria de instrucciones se hace teniendo en cuenta que cada instrucción ocupa dos palabras de memoria (16 bits). El tamaño más adecuado para la memoria de instrucciones es de 128 palabras de 2 bytes, es decir, una RAM de 256×8 palabras. En el caso de la memoria de datos se ha utilizado una memoria RAM de 256×8, de manera que puede ser direccionada por completo mediante el campo de dirección del formato de instrucción. Disponemos de 2 formatos de instrucción. Por un lado tenemos instrucciones de tipo registroregistro, utilizadas en las operaciones que de UAL, y por otro, instrucciones que utilizan direcciones de memoria: carga, almacenamiento y saltos. Las instrucciones registro-registro utilizan tres campos de direccionamiento de registro, dos como operando fuente (RS, RT) y uno como operando destino (RD). Cada uno de estos campos es de 3 bits. Además, existe un campo de operación (CO) que identifica este formato de instrucciones (debe establecerse al valor 00), y un campo de operación extendida (COX), que identifica el tipo concreto de operación registro-registro (Figura 1). Existen 5 instrucciones de este tipo: ADD (RD←RS+RT), SUB(RD←RS–RT), AND (RD←RS∧RT), OR (RD←RS∨RT), SLT (Si RS<RT, RD←1, SI NO, RD←0). Figura 1: Formato de instrucción registro-registro 15 14 13 CO 12 11 10 RS 9 8 7 6 RT 5 4 3 2 RD 1 0 COX Las instrucciones con direcciones de memoria contienen un único campo de operación (CO), dos campos de registros (RS, RD) y un campo de dirección de 8 bits (Figura 2). Son las siguientes: LW (RS←Memoria[Dirección+RT]), SW (Memoria[Dirección+RT]←RS), BEQ (Si RS=RT, PC←PC+Dirección). Figura 2: Formato de instrucción de memoria 15 14 CO 13 12 RS 11 10 9 RT 8 7 6 5 4 3 2 1 0 Dirección Dado que el diseño realizado utiliza técnicas de segmentación, aumenta la eficiencia en la ejecución de las instrucciones, pero se producen riesgos por dependencias de datos y riesgos de control de saltos. El primer tipo de riesgo se ha solucionado mediante la detención del flujo de ejecución hasta la eliminación del mismo, y el segundo tipo de riesgo se ha solucionado suponiendo el salto no realizado. Teniendo en cuenta todo lo dicho anteriormente, el diagrama de bloques que se obtiene se muestra en la Figura 3. Todos los bloques se describieron en VHDL a nivel de comportamiento. Esta descripción puede ser modificada ligeramente, por ejemplo, para probar implementaciones diferentes de los elementos definidos a nivel de comportamiento (por ejemplo para probar una definición estructural). Las posibles modificaciones están limitadas debido a que los cambios realizados no se muestran en el simulador gráfico sin modificar y recompilar el sistema. Figura 3: Diagrama de bloques de la unidad segmentada Descripción del lenguaje ensamblador Para permitir la programación de la máquina se ha diseñado un sencillo lenguaje ensamblador. Un programa en ensamblador consta de una secuencia de líneas, donde cada línea puede contener una de las siguientes posibilidades: - Una línea en blanco, que será ignorada. - Un comentario, comenzando por dos guiones (“--”), que ocupará el resto de la línea. - La definición de una variable (DB, DW). - La definición de una etiqueta. - Una instrucción en ensamblador. No se distingue entre mayúsculas y minúsculas, y se consideran palabras reservadas todas las instrucciones y directivas: ADD, SUB, AND, OR, SLT, LW, SW, BEQ, DB, DW. Un identificador válido para una etiqueta o una variable puede ser cualquier combinación de caracteres formada por letras, números y el carácter underscore (“_”), que no coincida con una palabra reservada, otra etiqueta u otra variable. El repertorio de instrucciones reconocidas por el ensamblador se muestra en la Figura 4. Figura 4: Repertorio de instrucciones Instrucción Significado Formato Operación realizada ADD Suma ADD R1 R2 R3 R1 ← R2 + R3 SUB Resta SUB R1 R2 R3 R1 ← R2 - R3 AND AND lógico AND R1 R2 R3 R1 ← R2 ∧ R3 OR OR lógico OR R1 R2 R3 R1 ← R2 ∨ R3 SLT Establecer si menor SLT R1 R2 R3 Si (R2<R3) R1←1 SI NO R1←0 LW R1 VAR [R2] R1 ← Memoria [VAR + R2] LW Cargar palabra LW R1 [R2] R1 ← Memoria [R2] SW R1 VAR [R2] Memoria [VAR + R2] ← R1 SW R1 [R2] Memoria [R2] ← R1 BEQ R1 R2 VAR Si (R1=R2) PC = VAR SW BEQ Almacenar palabra Saltar si igual Los 8 registros de la máquina se direccionan en las instrucciones que utilizan este direccionamiento mediante los identificadores R0 a R7. Las referencias a posiciones de memoria de datos se realizan mediante la especificación de variables. La definición de variables se puede realizar en cualquier parte del programa en ensamblador, utilizando alguna de las palabras reservadas (DB, DW) para la definición del tamaño de la variable. La definición de una variable admite opcionalmente un valor inicial. La definición de etiquetas tiene como objetivo la declaración de puntos de destino para realizar saltos con la instrucción de ramificación condicional (BEQ). La Figura 5 muestra un ejemplo de un programa sencillo que realiza la multiplicación de dos números. Para facilitar la programación, el sistema creado incorpora un editor con las opciones habituales en Windows (cortar, pegar, buscar, etc.). Este editor es la pantalla principal del sistema (Figura 6) y desde él se accede al resto de las opciones a través de menús, botones y teclas rápidas. Figura 5: Ejemplo de programa en ensamblador -- PROGRAMA PARA MULTIPLICAR DOS NUMEROS POSITIVOS DW DW DW DW uno 1 factor1 15 factor2 7 producto -- Ponemos 0 en R0 para hacer direccionamientos y para tener cero -- Ponemos factor1 en R1 y factor2 en R2 -- Iniciamos el producto en R3 a 0 -- Guardamos 1 en R7 SUB R0 R0 R0 LW R1 factor1 [R0] LW R2 factor2 [R0] SUB R3 R3 R3 LW R7 uno [R0] bucle: BEQ ADD SUB BEQ R2 R3 R2 R0 R0 R3 R2 R0 fin R1 R7 bucle fin: SW R3 producto [R0] stop: BEQ R0 R0 stop Figura 6: Editor de ensamblador Descripción de la interfaz gráfica de simulación El analizador gráfico permite realizar un seguimiento visual del comportamiento de la máquina ante un determinado conjunto de instrucciones. Tras escribir un programa en ensamblador, la secuencia de pasos que hay que seguir para analizar gráficamente el comportamiento es la siguiente: - Ensamblar el programa. - Simular el programa ensamblado con VSIM. Aquí se puede decidir si mostrar o no todas las señales de la máquina, el tiempo de simulación, etc. - Terminar VSIM y analizar gráficamente la simulación. Una vez que estamos dentro de la pantalla del analizador gráfico (Figura 7), podemos avanzar y retroceder en el tiempo de simulación a nuestro antojo. El estado de la máquina se muestra mediante colores y etiquetas en las líneas que representan el esquema de la unidad segmentada: - Las líneas de control (binarias) se colorean en rojo cuanto están activadas (1 lógico), en negro cuando están desactivadas (0 lógico), o en gris si no se conoce su estado (porque no fue trazada durante la simulación con VSIM). - Las líneas de datos muestran su estado mediante una etiqueta que representa el valor decimal que transmiten, o un interrogante ("?") cuando se desconoce su valor (debido a que no fue trazada durante la simulación con VSIM). Además de avanzar y retroceder manualmente en el tiempo, podemos analizar automáticamente todo el fichero de simulación configurando una velocidad de avance automático (esto es, el tiempo que transcurre desde que se muestra un estado y el siguiente). En la parte inferior derecha de la pantalla de análisis tenemos una ventana donde se muestran los nombres de las señales que actualmente se están visualizando. Figura 7: Ventana del simulador gráfico Los datos de la simulación con VSIM se almacenan en un fichero de texto (listfile) que contiene una lista de señales y estados. Este fichero es interpretado por la interfaz gráfica para mostrar los estados de la máquina. Podemos guardar este fichero de simulación para su uso posterior, y analizar otros ficheros almacenados sin necesidad de realizar de nuevo la simulación real con VSIM. La descripción VHDL toma como entradas para llenar la memoria del computador dos ficheros, ram_mips.dt1 y ram_mips.dt2, correspondientes a la memoria de instrucciones y la memoria de datos, que se obtienen como resultado de la última compilación realizada con éxito de un programa en ensamblador. Desde el entorno podemos consultar estos ficheros (Figura 8). Figura 8: Ventana para mostrar el contenido del programa compilado Conclusiones Como conclusión podemos decir que este sistema de simulación proporciona una serie de ventajas y cumple los objetivos propuestos al principio del trabajo. Disponemos de un entorno visual que nos permite comprender cómo funciona una unidad segmentada, con la posibilidad de probar su comportamiento con diferentes programas de forma rápida y sencilla gracias al ensamblador proporcionado. Además, el hecho de utilizar un entorno VHDL real para realizar la descripción del computador, amplía las posibilidades del sistema de modo que también sirve como herramienta para el estudio de dicho lenguaje, utilizando el entorno gráfico como instrumento de apoyo a la interpretación de resultados. Esta es una posibilidad ampliamente demandada en los entornos de la enseñanza de arquitectura de computadores. Sería deseable, sin embargo, que la simulación no estuviera restringida a un pequeño subconjunto de la máquina MIPS original, limitación debida a que la versión de VHDL utilizada no permite trabajar con grandes volúmenes de información. Trabajo futuro Conocidas las limitaciones del sistema, el trabajo futuro se centra en ampliarlo siguiendo las siguientes directrices: - Adaptación del sistema a un entorno VHDL más moderno, que permita mayores posibilidades de simulación y mayor complejidad en la descripción de la unidad segmentada. - Ampliación de la máquina hasta el repertorio y dimensiones originales, tanto en su descripción VHDL como en el lenguaje ensamblador. - Generación de un entorno para definir gráficamente las ampliaciones sobre la arquitectura del computador, de forma que las modificaciones realizadas en el código VHDL puedan ser reflejadas en el simulador gráfico con total precisión sin tener que recompilar el sistema. Bibliografía Patterson, D.A., Hennessy J.L. (1995). Organización y Diseño de Computadores. McGraw Hill. Ashenden P.J., (1996). The Designers Guide to VHDL, Morgan Kaufmann Publisher. Model Technology Inc. (1991). V-System PC, User´s Manual. Dirección de los autores Jesús M. Álvarez Llorente (llorente@uhu.es) Universidad de Huelva, Escuela Politécnica Superior; Carretera Huelva-La Rábida, 21071, Palos de la Frontera (Huelva). Tfno.: 959 530 245 ext. 2321 Nieves Pavón Pulido (npavon@uhu.es) Universidad de Huelva, Escuela Politécnica Superior; Carretera Huelva-La Rábida, 21071, Palos de la Frontera (Huelva). Tfno.: 959 530 245 ext. 2339 Julio Ballesteros Rubio (julioba@unex.es) Universidad de Extremadura, Escuela Politécnica; Ctra. de Trujillo s/n, 10071, Cáceres. Tfno.: 927 257 189