Tema 4 EL PROCESADOR 4.1. Introducción Un computador es un dispositivo electrónico formado por componentes y subsistemas digitales que permite el procesamiento de datos. Desde el punto de vista estructural, el computador se considera dividido en varios niveles organizados jerárquicamente. La Figura 4.1 muestra la organización del computador según estos niveles. Se distinguen 5 niveles básicos: Nivel Digital: Se corresponde con la máquina fı́sica y engloba todos los circuitos digitales que constituyen el computador y que han sido estudiados en los capı́tulos anteriores. Nivel Instrucciones Máquina: En este nivel se construyen programas en lenguaje máquina (secuencias de 0’s y 1’s), que es el lenguaje capaz de entender la CPU. También se incluye en este nivel la programación en ensamblador. El lenguaje ensamblador es la notación simbólica del lenguaje máquina. Nivel Sistema Operativo: Los sistemas operativos son un conjunto de programas que ayudan al usuario en la explotación del computador, siendo por tanto, una capa software con la que se rodea el hardware para facilitar su utilización. Nivel Lenguajes Alto Nivel: El objetivo de este nivel es facilitar al programador la utilización del computador. Los programas escritos en un leguaje de alto nivel deberán pasar por un proceso intermedio de traducción, denominado compilación, antes de ejecutarse. El objetivo de la compilación es traducir el lenguaje de alto nivel a un lenguaje de bajo nivel que la máquina pueda entender. La figura 4.2 muestra un ejemplo de traducción de un trozo de código codificado en un lenguaje de alto nivel (lenguaje C) a lenguaje ensamblador para el procesador MIPS y de lenguaje ensamblador a lenguaje máquina. El programa que traduce el código escrito en lenguaje ensamblador al código equivalente en lenguaje máquina se llama ensamblador. 1 2 TEMA 4. EL PROCESADOR Aplicaciones Lenguajes alto nivel Sistema operativo Lenguaje maquina Logica digital Figura 4.1: Organización estructural de un computador Nivel Aplicaciones: Este nivel está formado por paquetes de programas de aplicación que sirven para resolver problemas en campos especı́ficos de la ciencia o la gestión. Centrándonos en el nivel digital, los elementos principales de un computador son: la unidad de procesamiento central (CPU, Central Processing Unit) o procesador, la memoria principal, el subsistema de entrada/salida y algunos medios de interconexión de todos estos componentes como se muestra en la figura 4.3. La unidad central de procesamiento (CPU): Controla el funcionamiento del computador y lleva a cabo sus funciones de procesamiento de datos. Frecuentemente se llama simplemente procesador. Sus principales componentes estructurales son: • Unidad de control: Controla el funcionamiento de la CPU y, por tanto, del computador. • Unidad aritmético-lógica (ALU, Arithmetic Logic Unit): Lleva a cabo las funciones de procesamiento de datos del computador. • Registros: Proporcionan almacenamiento interno a la CPU. • Interconexiones CPU: Proporcionan comunicación entre la unidad de control, la ALU y los registros. La memoria principal: Almacena instrucciones y datos. E/S: Transfiere datos entre el computador y el entorno externo. Sistema de interconexión: Proporciona la comunicación entre la CPU, la memoria principal y la E/S. La tarea de un computador es el procesamiento de datos en base al contenido de las instrucciones. Ambos elementos (instrucciones y datos) se almacenan en memoria y se codifican empleando un número especifico de bits. De este modo, la arquitectura de un computador está diseñada para transferir bloques de información (o múltiplos de bloques) de un determinado tamaño. A cada uno de estos bloques se le denomina palabra y 4.1. INTRODUCCIÓN High-level language program (in C) 3 swa p ( i n t v [ ] , i n t k ) { i n t t emp ; t emp = v [ k ] ; v [ k ] = v [ k +1 ] ; v [ k + 1 ] = t emp ; } C compiler Assembly language program (for MIPS) swa p : mu l i a dd lw lw sw sw jr $ 2 , $5 , 4 $ 2 , $4 , $2 $ 1 5 , 0 ( $2 ) $ 1 6 , 4 ( $2 ) $ 1 6 , 0 ( $2 ) $ 1 5 , 4 ( $2 ) $31 Assembler Binary machine language program (for MIPS) 0 0000 000 10100 00 10000 00 0 00001 10 00 0 0000 000 10001 11 00001 10 0 00010 00 01 1 0001 100 01100 01 00000 00 0 00000 00 00 1 0001 100 11110 01 00000 00 0 00000 01 00 1 0101 100 11110 01 00000 00 0 00000 00 00 1 0101 100 01100 01 00000 00 0 00000 01 00 0 0000 011 11100 00 00000 00 0 00000 10 00 Figura 4.2: Programa C compilado a lenguaje ensamblador y después ensamblado a lenguaje máquina su tamaño, en número de bits, se denomina ancho de palabra. Todos los elementos del computador (registros, buses, memorias, periféricos, ALUs) están diseñados para transferir, almacenar o procesar palabras. El modo de funcionamiento de un computador consiste en la ejecución continua de instrucciones que operan sobre diferentes datos. El proceso de ejecución de una instrucción sigue una secuencia de 4 pasos: 1. Lectura o carga de la instrucción: La instrucción se transfiere desde memoria a uno de los registros internos de la CPU, el denominado registro de instrucción (IR, Instruction Register). 2. Decodificación de la instrucción: La unidad de control lee el contenido del IR y 4 TEMA 4. EL PROCESADOR PROCESADOR PC IR ENTRADA Instrucciones REGISTROS UNIDAD DE MEMORIA Datos SALIDA ALU UNIDAD DE CONTROL Figura 4.3: El computador: unidades funcionales básicas decodifica la operación a ejecutar. 3. Ejecución de la instrucción: Se activan las señales necesarias para la ejecución de la operación. 4. Determinación de la siguiente instrucción: Se asume que las instrucciones se ejecutarán de forma ordenada, es decir, después de la ejecución de una instrucción concreta se carga y se ejecuta la siguiente instrucción contigua en memoria. Sin embargo, en ciertas situaciones se realizan saltos, pasando a ejecutarse otra instrucción situada en una posición de memoria diferente. La CPU lleva un control de la dirección en memoria de la siguiente instrucción por medio del empleo de un registro de la CPU especial al que se denomina contador de programa (PC, Program Counter). Después de traer una instrucción, el contenido del PC se actualiza para apuntar a la siguiente instrucción de la secuencia. 4.2. El repertorio de instrucciones El funcionamiento de la CPU está determinado por las instrucciones máquina que ejecuta. Al conjunto de instrucciones distintas que puede ejecutar la CPU se le denomina repertorio de instrucciones de la CPU. El repertorio de instrucciones define las funciones que puede realizar la CPU y tiene, por tanto, un efecto significativo sobre la implementación de la misma. Cada instrucción máquina debe contener la información que necesita la CPU para su ejecución. Los elementos constitutivos de una instrucción máquina son: 4.2. EL REPERTORIO DE INSTRUCCIONES 4 bits Codop 5 6 bits 6 bits Ref. a operando Ref. a operando 16 bits Figura 4.4: Un formato de instrucciones sencillo Código de operación: Especifica la operación a realizar (suma, E/S, etc.). La operación se indica mediante un código binario. Referencia a operandos fuente: La operación puede implicar a uno o más operandos fuente, es decir, operandos que son entradas para la instrucción. Referencia al operando resultado: La operación puede producir un resultado. Referencia a la siguiente instrucción: En la mayorı́a de los casos la siguiente instrucción sigue inmediatamente a la instrucción en ejecución. En tales casos no hay referencia explı́cita a la siguiente instrucción. Cuando sea necesaria una referencia explı́cita, debe suministrarse la dirección de memoria. Los operandos fuente y resultado pueden estar en algunas de las siguientes áreas: Memoria: Como en las referencias a instrucciones siguientes, debe indicarse la dirección de memoria. Registro de la CPU: Salvo raras excepciones, una CPU contiene uno o más registros que pueden ser referenciados por instrucciones máquina. Si existe más de uno, cada registro tendrá asignado un número único, y la instrucción debe contener el número del registro deseado. Dispositivo de E/S: La instrucción debe especificar el módulo y dispositivo de E/S para la operación. En el caso de E/S asignadas en memoria, se dará otra dirección de memoria. Dentro del computador, cada instrucción se representa por una secuencia de bits. Esta secuencia se puede interpretar dividida en campos, correspondientes cada uno de ellos a los elementos constitutivos de la instrucción. La descripción de la instrucción en campos y bits se denomina formato de instrucción. La figura 4.4 muestra un ejemplo sencillo de formato de instrucción. En la mayorı́a de los repertorios de instrucciones se emplea más de un formato. Durante su ejecución, la instrucción se escribe en el registro de instrucción (IR) de la CPU. La CPU debe ser capaz de extraer los datos de los distintos campos de la instrucción para realizar la operación requerida. Los aspectos más importantes a tener en cuenta en el diseño del repertorio de instrucciones son: 6 TEMA 4. EL PROCESADOR Repertorio de operaciones: Cuántas y qué operaciones considerar, y cuán complejas deben ser. Tipos de datos: Los distintos tipos de datos con los que se efectúan operaciones. Formatos de instrucciones: Longitud de la instrucción (en bits), tamaño de los distintos campos, etc. Registros: Número de registros de la CPU que pueden ser referenciados por instrucciones, y su uso. Direccionamiento: El modo o modos de direccionamiento mediante los cuales puede especificarse la dirección de un operando o instrucción. 4.2.1. Modelo de ejecución El modelo de ejecución especifica el dispositivo (memoria, registro, etc.) que almacena los operandos de las instrucciones. Una arquitectura no está restringida a un único modelo, sino que suele dar soporte a varios. La elección de un modelo u otro es fuertemente dependiente de la arquitectura del sistema. Por ejemplo, una unidad aritmético-lógica que está exclusivamente conectada con registros (tanto para acceder a los operandos de entrada como para almacenar el resultado) quedará limitada al empleo de un modelo registro-registro (en el que ambos operandos son registros). Los modelos de ejecución posibles son: Modelo de pila: En este modelo los operandos se almacenan en una pila de modo que se opera con datos de la pila y el resultado es colocado encima de la pila. Se denota por POP a la instrucción que retira de la pila un dato y lo copia a memoria o a un registro. Se denomina PUSH a la instrucción que inserta en la pila un valor de memoria o de un registro. Modelo de registro-registro (o carga/almacenamiento): En este caso ambos operandos deben residir en un registro. Es el modelo de ejecución más extendido, ya que las instrucciones que lo emplean se pueden ejecutar de forma rápida (dado que el acceso a un registro es inmediato). En este modelo es necesario transferir de forma explı́cita los datos entre la memoria y los registros a través de instrucciones de carga y de almacenamiento. Modelo registro-memoria: En este modelo un operando está en un registro y el otro está en una posición de memoria. El resultado se almacena en un registro. Modelo memoria-memoria: Ambos operandos residen en memoria principal y el resultado también se almacena en memoria principal. Mediante este modelo no es necesario transferir los datos entre la memoria y los registros, sin embargo, tiene el inconveniente de que la ejecución de las instrucciones requiere un gran número de ciclos de reloj (necesarios para acceder a los datos en memoria). 4.2. EL REPERTORIO DE INSTRUCCIONES 4.2.2. 7 Direccionamiento En esta sección analizamos las técnicas de direccionamiento más comunes. Se denominan modos de direccionamiento a aquellos algoritmos empleados por el procesador para calcular las direcciones de las instrucciones y datos. La dirección real de memoria especificada por el modo de direccionamiento se denomina dirección efectiva. Direccionamiento inmediato: El operando es una constante cuyo valor se almacena en el campo operando de la instrucción. La ventaja del direccionamiento inmediato es que una vez captada la instrucción no se requiere una referencia a memoria para obtener el operando. La desventaja es que el tamaño del dato está restringido a la longitud del campo de direcciones. Direccionamiento directo: El operando se encuentra almacenado en memoria en la posición indicada por el campo operando. La limitación es que proporciona un espacio de direcciones reducido. Direccionamiento indirecto: La instrucción contiene en el campo operando la dirección de una posición de memoria en la que se almacena la dirección del operando deseado. La desventaja es que la ejecución de la instrucción requiere dos referencias a memoria para capturar el operando, una para captar su dirección y otra para obtener su valor. Direccionamiento de registros: El operando referenciado se encuentra en un registro. El número de registro se especifica dentro de la instrucción en el campo operando. Las ventajas son: (1) solo es necesario un campo pequeño de direcciones en la instrucción; (2) el tiempo de acceso a un registro interno es mucho menor que a la memoria principal. La desventaja es que el espacio de direcciones está muy limitado. Direccionamiento indirecto con registro: La instrucción contiene en el campo operando el número del registro en el que se almacena la dirección de memoria del operando deseado. La ventaja es que este direccionamiento emplea una referencia menos a memoria que el direccionamiento indirecto. Direccionamiento con desplazamiento: El campo operando contiene una dirección relativa o desplazamiento (D). La instrucción también especifica, implı́cita o explı́citamente, otras posiciones de memoria de almacenamiento (R), usualmente registros del procesador, conteniendo información adicional de direccionamiento. La dirección efectiva se calcula a través de una suma (D+R). Los tres usos más comunes del direccionamiento con desplazamiento son: • Desplazamiento relativo: El registro referenciado implı́citamente es el contador de programa (PC). La dirección efectiva es un desplazamiento relativo a la dirección de la instrucción. 8 TEMA 4. EL PROCESADOR • Direccionamiento con registro-base: El registro referenciado (implı́cita o explı́citamente) contiene una dirección de memoria, y el campo de dirección contiene un desplazamiento desde dicha dirección. • Indexado: El campo de operando referencia una dirección de memoria y el registro referenciado contiene un desplazamiento positivo desde esa posición. En la Figura 4.5 se muestra gráficamente un resumen de los modos de direccionamiento vistos aquı́. 4.2.3. Operaciones del repertorio de instrucciones El número de códigos de operación diferentes varı́a ampliamente de una máquina a otra. Sin embargo, en todas las máquinas podemos encontrar los mismos tipos generales de operaciones. Una clasificación tı́pica y útil es la siguiente: Transferencias de datos. Las instrucciones que transfieren datos entre memoria y registros se denominan instrucciones de transferencia de datos. Para acceder a una palabra en memoria la instrucción debe proporcionar la dirección de memoria. La instrucción de transferencia que mueve datos de memoria a algún registro se denomina carga (load ). La instrucción complementaria transfiere datos de un registro a memoria y se denomina almacenamiento (store). Aritméticas. La mayorı́a de las máquinas proporcionan las operaciones artiméticas básicas de suma, resta, multiplicación y división. Estas se tienen siempre para números enteros con signo y, a menudo, para números en coma flotante. Otras operaciones posibles son, por ejemplo, cálculo del valor absoluto, cambiar el signo al operando o incrementar o decrementar el operando. Lógicas. La mayorı́a de las máquinas también disponen de diversidad de operaciones para manipular bits individuales dentro de una palabra o de otra unidad direccionable. Están basadas en operaciones booleanas. De Entrada/Salida. Son instrucciones de transferencia de datos en las cuales el origen/destino es un módulo de E/S. De control de flujo. En todos los tipos de operaciones discutidos hasta aquı́, la siguiente instrucción a ejecutar es la inmediatamente posterior en memoria a la instrucción en curso. Sin embargo, una fracción significativa de las instrucciones de cualquier programa tienen como misión cambiar la secuencia de ejecución de instrucciones. La operación que realiza la CPU es actualizar el contador de programa para que contenga la dirección de alguna de las instrucciones que hay en memoria. Las operaciones de control de flujo que se pueden encontrar en los repertorios de instrucciones son: 4.2. EL REPERTORIO DE INSTRUCCIONES 9 Figura 4.5: Modos de direccionamiento • Instrucciones de bifurcación, también llamadas de salto. Tienen como uno de sus operandos la dirección de la siguiente instrucción a ejecutar. • Instrucciones de salto condicional. Se efectúa la bifurcación (se actualiza el 10 TEMA 4. EL PROCESADOR contador de programa con la dirección especificada en el operando) sólo si se cumple una condición dada, en caso contrario se ejecuta la instrucción siguiente de la secuencia (se incrementa el contador de programa de la forma habitual). • Instrucciones de llamada a subrutina. En cualquier punto del programa se puede invocar o llamar a una subrutina. Se ordena al computador que pase a ejecutar la subrutina y que retorne después al punto en que tuvo lugar la llamada. El uso de subrutinas requiere por tanto dos instrucciones básicas: una instrucción de llamada, que produce una bifurcación desde la posición actual al comienzo de la subrutina, y una instrucción de retorno de la subrutina al lugar desde el que se llamó. De control del sistema. Llamadas al sistema operativo para que realice algún servicio: E/S, detener la ejecución del programa, ... 4.3. Repertorio de instrucciones del MIPS El diseño del juego de instrucciones es un tema complejo y sujeto a un gran número de compromisos. Existen tantos juegos de instrucciones como arquitecturas, cada uno con sus ventajas y sus inconvenientes. No obstante, existen básicamente dos filosofı́as de diseño en las que se pueden agrupar todas las arquitecturas: CISC y RISC. Los diseños CISC (Complex Intruction Set Computer, computadora de conjunto de instrucciones complejo) se basan en un juego de instrucciones muy rico con modos de direccionamiento potentes y complejos. Esto implica que los programas necesitan menos instrucciones, con lo cual son más fáciles de desarrollar y mantener por los programadores. Además, los programas ocupan menos memoria. La filosofı́a RISC (Reduced Instruction Set Computer, computadores de conjunto de instrucciones reducido) en contrapartida se basa en un número relativamente pequeño de instrucciones disponibles, por lo regular unas 50, todas ellas muy sencillas, con pocos modos de direccionamiento, pero que se ejecutan muy eficientemente. En lo que resta del capı́tulo se estudiará un subconjunto del repertorio de instrucciones de un computador real. El repertorio de instrucciones escogido proviene del MIPS, usado por NEC, Nintendo, Silicon Graphics y Sony, entre otros, y es un tı́pico ejemplo de diseño RISC. 4.3.1. Arquitectura del MIPS Las primeras implementaciones de la arquitectura MIPS (familia R20x0 y R30x0) consistieron en una unidad de proceso de enteros (la CPU) y un conjunto de procesadores que realizaban tareas auxiliares u operan con otros tipos de datos, como números en coma flotante. En la figura 4.6 se muestra el esquema del MIPS R2000. El ancho de palabra de la arquitectura MIPS es de 32 bits. La arquitectura MIPS posee 32 registros genéricos de 32 bits ($0-$31) para utilización de la CPU, siendo el registro 4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 11 Memory CPU Coprocessor 1 (FPU) Registers Registers $0 $0 $ 31 $31 Arithmetic unit Multiply divide Lo Arithmetic unit Hi Coprocessor 0 (traps and memory) Registers BadVAddr Cause Status EPC Figura 4.6: Esquema del MIPS R2000 $0 solo de lectura y con valor cero. De los restante registros, solo el $31 es implı́citamente usado por una instrucción. Concretamente, por la instrucción de invocación de una subrutina (jal) y se utiliza para guardar la dirección de retorno, como veremos más adelante. Adicionalmente, el MIPS contiene dos registros para poder operar con operandos de 64 bits, como sucede en el caso de la multiplicación y división, llamados hi (high) y lo (low). En el cuadro 4.1 se puede ver la lista de registros del MIPS y sus usos. Como se ha comentado antes, estos procesadores MIPS no disponen de unidad de coma flotante incluida en el microprocesador, implementando estas funciones en coprocesadores separados. La arquitectura MIPS tiene en cada coprocesador 32 registros de 32 bits para coma flotante ($f0-$f31), que pueden ser organizados en 16 registros de doble precisión con 64 bits (las designaciones par de los registros). En cuanto al direccionamiento de la memoria, éste se realiza por bytes. Esto quiere decir que las direcciones de memoria de 2 palabras consecutivas estarán separadas en 4 unidades (ya que las palabras son de 4 bytes). Cuando una palabra se carga desde memoria a un registro o se pasa a memoria desde un registro, la dirección de memoria involucrada ha de ser múltiplo de 4. Esto es lo que se denomina restricción de alineamiento. Las direcciones que son múltiples de 4 se llaman direcciones alineadas. Un aspecto importante en cualquier procesador con un ancho de palabra superior a 1 12 TEMA 4. EL PROCESADOR Nombre Número Uso $zero $at $v0-$v1 0 1 2-3 $a0-$a3 $t0-$t7 $s0-$s7 $t8-$t9 $k0-$k1 $gp $sp $fp $ra 4-7 8-15 16-23 24-25 26-27 28 29 30 31 Valor constante 0 Reservado para el ensamblador Valores para resultados y evaluación de expresiones Paso de parámetros Registros temporales Registros que deben preservarse Registros temporales Reservado para núcleo de SO Puntero global Puntero de pila Puntero de bloque de activación Dirección de retorno Preservado en llamada n.a. n.a. no sı́ no sı́ no n.a. sı́ sı́ sı́ sı́ n.a.: no aplica Cuadro 4.1: Registros del MIPS y su uso convencional en llamadas a procedimientos byte es el ordenamiento de los bytes dentro de una palabra. Dicho ordenamiento puede tomar dos alternativas: big endian o little endian. En little endian la dirección de un dato es la dirección del byte menos significativo del dato. En big endian la dirección del dato es el byte más significativo del mismo: palabra de 4 bytes Big Endian A B C D Little Endian Este aspecto ha de tenerse en cuenta cuando se intercambia información entre distintas máquinas. Ejemplos de arquitecturas little endian son los procesadores x86, DEC ALPHA y VAX. Ejemplos de arquitecturas big endian son IBM POWER, Motorola 6800 y 68k. Algunos procesadores (por ejemplo MIPS, PowerPC, Alpha y SPARC v9) permiten configurar el comportamiento, estas arquitecturas reciben el nombre de bi-endian. 4.3.2. Tipos de instrucciones MIPS Los tipos básicos de instrucciones que soporta el MIPS son los siguientes: Transferencia de datos Aritméticas y lógicas De Control de Flujo 4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 13 • Salto condicional • Bifurcación Las caracterı́sticas más importantes de estas instrucciones en el procesador MIPS son: La longitud de todas las instrucciones MIPS es de 32 bits. Los operandos de las operaciones aritméticas son siempre registros. MIPS es, por tanto, una arquitectura de carga/almacenamiento (registro-registro). El acceso a memoria se hace a través de las operaciones de carga y almacenamiento (transferencia de datos). Para acceder a una palabra en memoria hay que indicar su dirección. MIPS direcciona bytes individuales. No obstante, debe tenerse en cuenta que la mayor parte de las instrucciones que acceden a memoria lo hacen de forma alineada, por lo que la dirección a la que se accede debe ser múltiplo de 4. 4.3.3. Formatos de las instrucciones MIPS Como comentábamos anteriormente, el número de bits de una instrucción MIPS es siempre de 32, el mismo tamaño que una palabra. Cada instrucción MIPS se divide en una serie de campos a los que se les da unos nombres para identificarlos fácilmente: op: operación básica de la instrucción, tradicionalmente llamada código de operación. rs: primer registro operando fuente. rt: segundo registro operando fuente. rd : registro operando destino, donde se almacena el resultado de la operación. shamt: tamaño del desplazamiento (shift amount). funct: función. Este campo selecciona la variante especı́fica de la operación del campo op, y a veces se le denomina código de función. El compromiso elegido por los diseñadores del MIPS es guardar todas las instrucciones con la misma longitud, pero utilizar diferentes clases de formatos de instrucción para diferentes clases de instrucciones. Los tres tipos de formatos posibles en MIPS son: Formato tipo R: utilizado por las instrucciones aritméticas y lógicas. Formato tipo I: utilizado por las instrucciones de transferencia, las de salto condicional y las instrucciones con operandos inmediatos. 14 TEMA 4. EL PROCESADOR Tipo - R op rs rt rd 6 bits 5 bits 5 bits 5 bits shamt funct 5 bits 6 bits Tipo - I op 6 bits rs 5 bits rt direccion 16 bits 5 bits Tipo - J op 6 bits direccion 26 bits Figura 4.7: Codificación de instrucciones en el MIPS Formatos tipo J: utilizado por las instrucciones de bifurcación. En la figura 4.7 se muestran los campos para cada uno de los tres tipos de formato. Aunque tener múltiples formatos complica la circuiterı́a, se puede reducir la complejidad guardándolos de forma similar. Por ejemplo, los tres primeros campos de los formatos tipo-R y tipo-I son del mismo tamaño y tienen los mismos nombres. Los formatos se distinguen por el valor del primer campo: a cada formato se le asigna un conjunto de valores distintos en el primer campo y por lo tanto la circuiterı́a sabe si ha de tratar la última mitad de la instrucción como tres campos (tipo-R) o como un campo simple (tipo-I), o si la instrucción es tipo-J. 4.3.4. Instrucciones aritmético-lógicas El tipo de formato de las instrucciones aritmético-lógicas es tipo-R y el número de operandos es siempre tres. Estos operandos son siempre registros. El modo de direccionamiento empleado, por tanto, es direccionamiento de registro. En la figura 4.8 se muestran las codificaciones en el lenguaje máquina MIPS para dos ejemplos de instrucciones aritméticas, suma y resta. Para cada instrucción se muestra también la codificación de cada campo en decimal y la representación simbólica de la instrucción utilizando leguaje ensamblador. La instrucción add $rd,$rs1,$rs2 suma el contenido de los registros $rs1 y $rs2 y almacena el resultado en $rd. Muchas veces los programas usan constantes en las operaciones. Para usar una constante utilizando las instrucciones de la figura 4.8 habrı́a que cargarla de memoria al registro para posteriormente sumarla. Una alternativa que evita los accesos a memoria es ofrecer versiones de las instrucciones aritméticas en las cuales un operando es constante. Se usa en este caso el formato de instrucción tipo-I y el modo de direccionamiento es 4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 15 add $7,$3,$6 0 3 6 7 0 32 000000 00011 00110 00111 00000 100000 31 25 20 15 10 5 0 sub $7,$3,$6 0 3 6 7 0 34 000000 00011 00110 00111 00000 100010 31 25 20 15 10 5 0 Figura 4.8: Estructuras del lenguaje MIPS para suma y resta direccionamiento inmediato. En la figura 4.9 se muestra la estructura para el ejemplo de la operación suma inmediata. La instrucción addi $rd,$rs1,inm suma el contenido de $rs1 y el valor inm y almacena el resultado en $rd. addi $8,$8,4 8 8 8 4 001000 01000 01000 0000 0000 0000 0100 31 25 20 15 0 Figura 4.9: Estructura del lenguaje MIPS para la suma inmediata Los operandos constantes aparecen con frecuencia, y situarlos dentro de las instrucciones aritméticas hace que se ejecuten mucho más rápido. 4.3.5. Instrucciones de transferencia Las instrucciones de transferencia son instrucciones tipo-I. En la figura 4.10 se muestran las codificaciones en lenguaje MIPS para dos ejemplos de operaciones de transferencia muy comunes, la carga y el almacenamiento de una palabra (lw y sw respectivamente). El direccionamiento usado en este tipo de instrucciones es direccionamiento con desplazamiento (registro-base). La instrucción lw $rt,desp($rs) carga la palabra almacenada en la dirección de memoria $rs+desp en el registro $rt. La instrucción sw $rt,desp($rs) almacena la palabra contenida en el registro $rt en la dirección de memoria $rs+desp. 16 TEMA 4. EL PROCESADOR Los 16 bits para especificar el desplazamiento significan que una instrucción de carga puede cargar cualquier palabra dentro de la región ±215 de la dirección del registro base $rs. lw $8,1200($15) 35 15 8 100011 01111 01000 31 25 20 1200 0000 0100 1011 0000 15 0 sw $8,1200($15) 43 15 8 101011 01111 01000 31 25 20 1200 0000 0100 1011 0000 15 0 Figura 4.10: Estructura del lenguaje MIPS para las instrucciones de transferencia Existe también otra instrucción de transferencia que implementa MIPS, es la llamada instrucción load upper inmediate (lui) que sirve especı́ficamente para almacenar los 16 bits de la parte alta de una constante en un registro. La instrucción lui $rt,inm almacena los 16 bits de inm en los 16 bits más significativos del registro $rt poniendo los otros 16 bits a cero ($rt=inm((16). En la figura 4.11 se puede ver la operación lui. Version en lenguaje maquina: 001111 00000 01000 lui $8,255 0000 0000 1111 1111 Contenido del registro $8 tras la ejecucion: 0000 0000 1111 1111 0000 0000 0000 0000 Figura 4.11: El efecto de la instrucción lui 4.3.6. Instrucciones de salto condicional Lo que distingue a un computador de una simple calculadora es la habilidad de tomar decisiones. Basándose en los datos de entrada y los valores creados durante la computación, el computador ejecuta diferentes instrucciones. La toma de decisiones se representa comúnmente en los lenguajes de programación de alto nivel usando la sentencia if (si 4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 17 condicional), combinada a veces con sentencias go to (ir a) y etiquetas. El lenguaje máquina del MIPS incluye dos instrucciones de toma de decisiones, similares a una sentencia if con un go to. Las instrucciones beq (branch if equal ) y bne (branch if not equal ). Estas dos instrucciones se conocen tradicionalmente como saltos condicionales. Son instrucciones de tipo-I y el modo de direccionamiento empleado por ambas es direccionamiento con desplazamiento relativo (direccionamiento con desplazamiento relativo al PC donde el desplazamiento se indica en número de palabras en vez de en número de bytes). La instrucción beq $rs,$rt,despl significa ir a la instrucción que se encuentra en la dirección de memoria (PC+4)+4*despl si el valor del registro $rs es igual al valor del registro $rt. La instrucción bne $rs,$rt,despl significa ir a la instrucción que se encuentra en la dirección de memoria (PC+4)+4*despl si el valor de $rs no es igual al valor en $rt. En ensamblador, el uso de etiquetas libera al programador del tedioso cálculo de las direcciones de salto. Estas instrucciones se muestran en la figura 4.12. En este caso se utilizan etiquetas. El ensamblador calculará el desplazamiento necesario para saltar a L1. beq $19,$20,L1 4 19 20 L1 000100 10011 10100 0001 1000 0011 1101 31 25 20 15 0 bne $19,$20,L1 5 19 20 L1 000101 10011 10100 0001 1000 0011 1101 31 25 20 15 0 Figura 4.12: Estructura en lenguaje MIPS de las instrucciones de salto condicional La prueba de igualdad y desigualdad es probablemente la más habitual, pero a veces es útil establecer comparaciones del tipo “menor que”. Para ello se dispone de la instrucción lógica MIPS slt (set on less than), activar si es menor que. El efecto de la instrucción slt $rd,$rs,$rt es $rd=($rs<$rt). También existe la versión de esta instrucción utilizando operandos inmediatos: slti $rd,$rs,inm es $rd=($rs<inm) La estructura de ambas instrucciones se muestra en la figura 4.13. 18 TEMA 4. EL PROCESADOR slt $8,$19,$20 0 19 20 18 8 8 0 42 slti $8,$19,10 10 10 Figura 4.13: Estructura de las instrucciones slt y slti en el MIPS 4.3.7. Instrucciones de bifurcación Una bifurcación se puede ver como un salto incondicional, es decir, la instrucción obliga a la máquina a seguir siempre el salto. Para distinguir entre saltos condicionales e incondicionales, el nombre MIPS para este tipo de instrucción es jump. j L1 L1 2 jr $8 0 8 0 0 0 8 Figura 4.14: Estructura de las instrucciones jump y jump register en el MIPS La instrucción de bifurcación jump (j) es de tipo-J y su modo de direccionamiento es pseudodirecto. El efecto de la instrucción j es saltar a la dirección de salto especificada por la instrucción. La dirección de salto son los 26 bits de la instrucción desplazados 2 posiciones a la izquierda (es decir, se multiplica por 4) y concatenados con los 4 bits de mayor peso del contador de programa (P C ← (P C + 4)31−28 IR25−0 00). Al igual que en las instrucciones de salto condicional, el ensamblador permite el uso de etiquetas. La instrucción de bifurcación jump register (jr) es de tipo-R y utiliza modo de direccionamiento indirecto con registro. El efecto de la instrucción es saltar a la dirección de memoria almacenada en el registro. En la figura 4.14 se muestran estas instrucciones y su formato. 4.3.8. Modos de direccionamiento del MIPS Resumimos aquı́ los modos de direccionamiento del MIPS: Modo de direccionamiento registro, donde el operando es un registro. 4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 19 Modo de direccionamiento base más desplazamiento, donde el operando está en una localización de memoria cuya dirección es la suma de un registro y una constante presente en la propia instrucción. Modo de direccionamiento inmediato, donde el operando es una constante que aparece en la misma instrucción. Modo de direccionamiento relativo al PC, donde la dirección es la suma del contador de programa (PC) y la constante de la instrucción multiplicada por 4. Como se verá más adelante, es conveniente incrementar el PC pronto para apuntar a la siguiente dirección. De aquı́ que la dirección MIPS es realmente relativa a la dirección de la siguiente instrucción (PC+4) en lugar de a la instrucción actual (PC). Modo de direccionamiento pseudodirecto, donde la dirección de salto son los 26 bits de la instrucción desplazados 2 posiciones a la izquierda y concatenados con los 4 bits de mayor peso del contador de programa. Esto limita los saltos a 256MB, si necesitaramos saltar más allá tendrı́amos que sustituir la instrucción jump por jump register precedida por otra instrucción para cargar la dirección de 32 bits completa en el registro. Una operación simple puede usar más de un modo de direccionamiento. La operación de sumar, por ejemplo, usa tanto el direccionamiento inmediado (si usamos la instrucción addi), como el direccionamiento registro (si usamos la instrucción add). La figura 4.15 muestra, para cada modo de direccionamiento, cómo se localiza el operando correspondiente. 4.3.9. Llamadas a subrutinas Un procedimiento o subrutina es una herramienta que los programadores usan para estructurar programas con el fin de hacerlos fácilmente comprensibles y permitir que el código sea reutilizado. Los parámetros de las subrutinas permiten pasar valores a la subrutina y que esta retorne resultados. En la ejecución de una subrutina el programa debe seguir los siguientes pasos: 1. Situar los parámetros en un lugar donde la subrutina pueda acceder a ellos. 2. Transferir el control a la subrutina. 3. Adquirir los recursos de almacenamiento necesarios para el procedimiento. 4. Realizar la tarea deseada. 5. Situar el valor del resultado en un lugar donde el programa que lo ha llamado pueda acceder a él. 6. Retornar el control al punto de origen. 20 TEMA 4. EL PROCESADOR x4 x4 4 bits Figura 4.15: Modos de direccionamiento del MIPS. 4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 21 En la figura 4.16 se muestra gráficamente la distribución de la memoria para programas y datos. El espacio de memoria de un programa de usuario se organiza en varios segmentos: Segmento de texto: Es un segmento de tamaño fijo que contiene las instrucciones del programa ejecutable. Segmento de datos: Es un segmento de tamaño variable dividido en varias secciones para los distintos tipos de datos. Montı́culo (heap): Contiene los datos reservados dinámicamente y crece de direcciones menores a mayores. Segmento de pila (stack): Avanza de direcciones mayores a menores. Se utilizará en las llamadas a procedimientos. $sp 7 f f f f f f f hex Stack Dynamic data $gp 1000 8000 h e x Static data 1000 0000 h e x Text pc 0040 0000 h e x Reserved 0 Figura 4.16: Distribución de la memoria para programas y datos en el MIPS En general, en la mayorı́a de los procesadores la comunicación entre un segmento de código que llama a una subrutina (invocador) y la subrutina se realiza mediante la pila. El invocador sitúa los parámetros en la pila. Posteriormente la subrutina coloca también en la pila la información que debe guardar temporalmente y al finalizar libera dicho espacio y deja en la pila el resultado de la subrutina. Finalmente el invocador recupera de la pila el resultado. La pila es un espacio de memoria con estructura tipo LIFO (Last In First Out), en la que el último que entra es el primero en salir. Esta estructura necesita un puntero que apunte a la dirección más recientemente utilizada, para guardar dónde deberı́a de situar el 22 TEMA 4. EL PROCESADOR siguiente elemento a volcar, o para saber dónde se pueden encontrar los valores guardados. Por razones históricas, la pila crece de direcciones de memoria superiores a inferiores. Por tanto, para poner valores en la pila tendremos que restar al puntero de pila y para quitar valores tendremos que sumar al puntero de pila. Los programas del MIPS reservan un registro solo para la pila, stack pointer ($sp) o puntero de pila. Veamos un par de ejemplos de como introducir datos en la pila y como transferirlos desde ella. Para realizar la operación de push (guardar) salvando dos registros en la pila: addi $sp,$sp,-8 sw $v0,0($sp) sw $v1,4($sp) # ajusto la pila para a~ nadir dos elementos # salvo el registro $2 # salvo el registro $3 Para realizar la operación de pop (recuperar) transfiriendo los datos de la pila a dos registros: lw $v0,0($sp) lw $v1,4($sp) addi $sp,$sp,8 # # # # restaura el registro $2 restaura el registro $3 ajusta el puntero de la pila para eliminar dos elementos Sin embargo, es más rápido acceder a registros que a memoria, de aquı́ que el convenio de llamadas MIPS se apoya en el banco de registros para evitar accesos a pila y acelerar ası́ la ejecución de los programas. Los programas MIPS asignan por convenio los siguientes registros de los 32 disponibles en cada llamada de procedimiento: $a0-$a3: cuatro registros de argumentos en los cuales se pasan parámetros. Si se necesitan más parámetros se pasan a través de la pila. $v0-$v1: dos registros de valores en los cuales se retornan valores. $ra: un registro de retorno de dirección para volver al punto de origen. Además de esta asignación de registros, el lenguaje ensamblador del MIPS incluye una instrucción solo para procedimientos (jal): salta a una dirección y simultáneamente salva la dirección de retorno (dirección de la siguiente instrucción) en el registro $ra. La instrucción jal (jump-and-link ) se muestra en la figura 4.17. Utiliza direccionamiento pseudodirecto al igual que jump para el cálculo de la dirección de salto. El ensamblador permite el uso de etiquetas para especificar la dirección de salto. La dirección de retorno es necesaria porque el mismo procedimiento se puede llamar desde diferentes puntos del programa. La instrucción jal guarda P C + 4 en el registro $ra para encadenar la siguiente instrucción con el retorno del procedimiento. 4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 23 jal direccion_subrutina 3 direccion_subrutina Figura 4.17: Estructura de la instrucción jump-and-link en MIPS. Para realizar el salto de retorno disponemos de la instrucción jump register comentada anteriormente: jr $ra salta a la dirección almacenada en el registro $ra, que es justamente lo que se requiere. Resumiendo, el programa que llama al procedimiento (invocador) pone los valores de los parámetros en $a0-$a3 y usa la instrucción jal para saltar al procedimiento. El procedimiento (también conocido por invocado) realiza los cálculos, pone los resultados en $v0-$v1 y devuelve el control al invocador usando jr $ra. Salvaguarda de registros Si un procedimiento modifica los registros utilizados por la rutina invocadora los valores de los registros deben ser guardados y restaurados utilizando para ello la pila. Los dos convenios estándares para guardar y restaurar registros son: Guardar invocador (caller save): el procedimiento invocador es el responsable de guardar y restaurar los registros que necesite conservar. Guardar invocado (callee save): el invocado es el responsable de guardar y restaurar cualquier registro que vaya a utilizar. Para evitar salvar y restaurar un registro cuyo valor nunca se usa, los programas MIPS ofrecen dos clases de registros (ver cuadro 4.1): Registros temporales ($t0-$t9): Se utilizan para guardar datos temporales que no necesitan ser preservados entre llamadas. No son preservados por el invocado (procedimiento llamado) en una llamada de procedimiento. Estos registros deben ser guardados por el invocador en caso de que necesite conservar sus valores. Registros salvados ($s0-$s7): Se utilizan para almacenar valores de vida más larga que se deben preservar durante las llamadas. Si el invocado los usa salva previamente su valor. Esta simple convención reduce el volcado de registros. 24 TEMA 4. EL PROCESADOR 4.4. Diseño de la Unidad Central de Proceso La unidad central de proceso es la encargada de la ejecución de las instrucciones especificadas por el programa. Este módulo esta formado por dos bloques, el Camino de Datos y la Unidad de Control. Camino de Datos: se encarga de realizar todas las operaciones requeridas por las instrucciones del nivel de lenguaje máquina. Contiene los siguientes elementos (ver Figura 4.18): • Unidad Aritmético-Lógica (ALU): está formada por los circuitos digitales necesarios para realizar las operaciones aritméticas y lógicas requeridas por las instrucciones. • Banco de Registros: contiene los registros que almacenan temporalmente los datos y resultados con los que opera la ALU. • Registros Especiales: contienen información necesaria para la correcta ejecución de las instrucciones y del programa. Por ejemplo, la instrucción en ejecución (registro de instrucciones, IR), la dirección de la siguiente instrucción a ejecutar (contador de programa, PC), etc. • Buses internos: son los caminos de conexión entre los distintos elementos que forman la Unidad de Proceso. Figura 4.18: Estructura del Camino de Datos 4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 25 Unidad de Control: se encarga de gestionar el secuenciamiento de las operaciones que se realizan en el Camino de Datos para que las instrucciones se ejecuten adecuadamente. Este secuenciamiento se realiza generando en el orden correcto las señales de control necesarias para coordinar el funcionamiento del resto de unidades del computador. La unidad de control es un sistema secuencial y su complejidad depende básicamente de la complejidad del Camino de Datos y del número y tipo de instrucciones a ejecutar. En general, la ejecución de una instrucción se puede entender como un proceso dividido en 5 pasos: Captar la instrucción: El procesador debe leer la instrucción de la memoria. Interpretar las instrucción: La instrucción debe decodificarse para determinar qué acción es necesaria. Captar datos: La ejecución puede exigir leer datos de la memoria o de un módulo de E/S. Procesar datos: La ejecución de una instrucción puede exigir llevar a cabo alguna operación aritmética o lógica. Escribir datos: Los resultados de una ejecución pueden tener que ser escritos en la memoria o en un módulo de E/S. En las siguientes secciones estudiaremos como llevar a cabo el diseño de una Unidad Central de Proceso (Camino de Datos y Unidad de Control). Para ello tomaremos como ejemplo el procesador MIPS. En concreto, diseñaremos una Unidad Central de Proceso para ejecutar el siguiente subconjunto del repertorio de instrucciones del MIPS: Las instrucciones de acceso a memoria lw y sw Las instrucciones aritmético-lógicas add, sub, and, or y slt La instrucción de salto condicional beq La instrucción de salto incondicional j 4.5. Construcción del Camino de Datos Una forma razonable de empezar el diseño de una Unidad Central de Proceso es la construcción del Camino de Datos. Examinaremos para ello los componentes que serán necesarios para la ejecución de cada una de las instrucciones. Utilizaremos tanto sistemas combinacionales como secuenciales. Para los sistemas secuenciales asumiremos sincronización por flancos. 26 4.5.1. TEMA 4. EL PROCESADOR Carga de la instrucción Para ejecutar cualquier instrucción se debe empezar por cargar la instrucción desde memoria. La dirección de memoria nos la indica el registro de 32 bits contador de programa (PC). Para ejecutar la siguiente instrucción el contador de programa ha de incrementarse para que apunte 4 bytes más adelante. El Camino de Datos para este paso se muestra en la figura 4.19. Sumador 4 PC Dirección Instrucción Memoria de instrucciones Figura 4.19: Parte del Camino de Datos correspondiente a la búsqueda de la instrucción e incremento del contador de programa 4.5.2. Instrucciones aritmético-lógicas Las instrucciones aritmético-lógicas son instrucciones tipo R que leen dos registros, operan con la ALU los contenidos de estos registros y escriben el resultado. El ejemplo tı́pico de este tipo de instrucciones es add $t1, $t2, $t3, que suma los contenidos de $t2 y $t3 y escribe el resultado en $t1. En la figura 4.20 se muestra el Camino de Datos para estas instrucciones suponiendo que ya se ha obtenido la instrucción. Los registros de 32 bits del procesador se agrupan en un banco de registros. Se puede acceder a cada uno de los registros especificando su número. El banco de registros tiene dos puertos de lectura y uno de escritura. Para escribir hay que activar explı́citamente la señal de control de escritura. Las entradas que indican el número de registro a leer o escribir son todas de 5 bits, mientras que las salidas (lı́neas de datos) son de 32 bits. Necesitaremos una ALU que pueda realizar las operaciones sumar, restar, AND, OR y realizar la comparación set on less than (slt). El cuadro 4.2 muestra las lı́neas de control de la ALU con las correspondientes operaciones. La ALU admitirá como entrada dos operandos de 32 bits (a y b) y una lı́nea de control de tres bits para seleccionar la operación a realizar. Ofrecerá como salida el resultado de la operación, también de 32 bits, un bit de acarreo, una salida de detección de desbordamiento y una salida de detección de cero como se ilustra en la figura 4.21. La salida Cero de la ALU se utilizará en la realización de los saltos condicionales como veremos más adelante. La salida de Desbordamiento se usará para la detección de excepciones. 4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS Reg. de lectura 2 Reg. de escritura Dato a escribir 3 REGISTROS Instrucción Reg. de lectura 1 27 Dato leído 1 Dato leído 2 Operación de la ALU ALU Cero Resultado de la ALU EscribirReg Figura 4.20: Parte del Camino de Datos correspondiente a las instrucciones aritméticológicas (tipo R) lı́neas de control de la ALU 000 001 010 110 111 función and or suma resta slt Cuadro 4.2: Valores de las tres lı́neas de control de la ALU y las operaciones correspondientes. 4.5.3. Instrucciones de transferencia de datos Las instrucciones de carga y almacenamiento son instrucciones tipo I con el siguiente formato: lw $t1, desp1($t2) o sw $t1, desp1($t2). Estas instrucciones leen o escriben un dato en memoria. La dirección de memoria se calcula añadiendo al registro base ($t2) el campo de desplazamiento (positivo o negativo) de 16 bits contenido en la instrucción. El desplazamiento se extiende a 32 bits antes de realizar la suma en la ALU. Si la instrucción es la sw, el dato a almacenar ha de leerse del registro $t1 del banco de registros. En caso de lw, el valor leı́do de memoria debe escribirse en el registro $t1. La figura 4.22 muestra el Camino de Datos para este tipo de instrucciones. Los identificadores de registros para el banco están en los campos de la instrucción, ası́ como el valor del desplazamiento, el cual tras extender el signo se convierte en el segundo operando de la ALU. La memoria de datos tiene señales de control de lectura y escritura, una entrada de dirección, una entrada de datos para la escritura y una salida de datos para la lectura. La señal de control de lectura de la memoria es necesaria para evitar el acceso a posiciones no válidas. 28 TEMA 4. EL PROCESADOR Figura 4.21: Sı́mbolo de la ALU Reg. de lectura 2 Reg. de escritura Dato a escribir 3 REGISTROS Instrucción Reg. de lectura 1 Dato leído 1 Operación de la ALU EscribirMem ALU Cero Resultado de la ALU Dato leído 2 Dato leído Memoria de Datos Dato a escribir EscribirReg 16 Dirección Extensión de signo 32 LeerMem Figura 4.22: Parte del Camino de Datos correspondiente a las instrucciones de acceso a memoria 4.5.4. Instrucción de salto condicional La instrucción beq es una instrucción tipo I con 3 operandos, dos registros y un desplazamiento de 16 bits utilizado para calcular la dirección destino del salto. Su formato es beq $t1, $t2, despl. Evalúa si el contenido de los registros $t1 y $t2 son iguales, si la condición se cumple aplica un salto relativo a la dirección de la instrucción con signo. Es la dirección PC+4 la que se utilizará como base para el cálculo de la dirección destino. Para realizar esta instrucción se ha de calcular la dirección destino del salto: (PC+4)+4*despl. Los 16 bits del campo desplazamiento se extienden a 32 y se desplazan a la izquierda 2 posiciones para multiplicar por 4. Además de calcular la dirección de salto, se tiene que determinar si se realiza el salto o no. Si la condición se cumple, es decir, los dos operandos son iguales, la dirección de salto calculada pasa a ser el nuevo PC. Si los operandos son diferentes, el PC+4 deberı́a reemplazar al actual. La figura 4.23 muestra el Camino de Datos para esta instrucción. Para calcular la dirección de salto se 4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 29 incluye una unidad de extensión de signo y un sumador. Para la comparación se necesita utilizar el banco de registros y la ALU. A la ALU entran los dos datos a comparar, la señal de control de la ALU se configura para hacer una resta, de esta forma si son iguales se activará la salida Cero de la ALU. PC +4 del camino de datos de instrucciones Resultado Desp. 2 bits a la izq. Reg. de lectura 2 Reg. de escritura Dato a escribir Sumador 3 REGISTROS Instrucción Reg. de lectura 1 Destino salto Operación de la ALU Dato leído 1 Cero Dato leído 2 Decidir si se hace el salto ALU EscribirReg 16 Extensión de signo 32 Figura 4.23: Parte del Camino de Datos correspondiente a la instrucción de salto condicional (beq) 4.5.5. Instrucción de salto incondicional La instrucción de salto incondicional (j) es una instrucción tipo J con un modo de direccionamiento pseudodirecto. Esta instrucción reemplaza los 28 bits de menor peso del PC con los 26 bits de menor peso de la instrucción desplazados 2 bits hacia la izquierda. No se necesita hardware adicional para llevar a cabo esta instrucción. 4.5.6. Camino de Datos completo El Camino de Datos necesario para la ejecución del subconjunto de instrucciones elegido estará formado por la combinación de los elementos explicados en las subsecciones anteriores. Como hemos visto en la sección 4.4, la ejecución de una instrucción la podemos dividir en 5 pasos, correspondiendo cada uno de ellos a diferentes operaciones de las unidades funcionales requeridas. Cada paso lo vamos a ejecutar en un ciclo de reloj diferente, de esta forma podremos utilizar una determinada unidad funcional más de una vez en una instrucción siempre y cuando se haga en ciclos diferentes, reduciendo ası́ la 30 TEMA 4. EL PROCESADOR cantidad de hardware empleado. Ası́ por ejemplo, las sumas realizadas para calcular la siguiente instrucción a ejecutar (ver figuras 4.19 y 4.23) se pueden realizar con la ALU y no se necesitan sumadores independientes para esa operación. La ALU llevará a cabo diferentes operaciones dependiendo de la instrucción que se ejecute y del ciclo de ejecución en el que nos encontremos: Cuando se realice la carga de la instrucción, sumará el PC+4 para incrementar el contador del programa y que este apunte a la siguiente instrucción a ejecutar. En el caso de instrucción de carga/almacenamiento, calculará la dirección de memoria sobre la que leer o escribir sumando a un operando almacenado en registro el campo desplazamiento con el signo extendido. En el caso de instrucción tipo R, realizará una operación aritmética o lógica (and, or, add, sub y slt) con 2 operandos almacenados en los registros. En el caso de salto condicional, evaluará la condición de salto restando 2 operandos almacenados en los registros. También calculará la dirección de salto sumando al PC incrementado los 16 bits menos significativos de la instrucción con el signo extendido y desplazados dos bits a la izquierda. Del mismo modo, no se necesita una memoria para instrucciones y otra para datos, ya que el acceso a la memoria de instrucciones y a la de datos se realiza en ciclos diferentes de la ejecución. P C Memoria Registro de instrucciones Reg. de lectura 2 Dirección Instrucciones o datos Dato Reg. de lectura 1 Reg. de escritura Registro de datos de memoria Dato a escribir REGISTROS Al finalizar cada ciclo todos los datos que vayan a utilizarse en el siguiente ciclo se deben almacenar en un elemento de almacenamiento (memoria o registro). Los datos a utilizar por las siguientes instrucciones en ciclos posteriores se almacenarán en elementos de almacenamiento visibles al programador (el banco de registros, el PC o la memoria). En cambio, los datos que va utilizar la misma instrucción en ciclos posteriores deben guardarse en registros temporales. Dato leído 1 A ALU Dato leído 2 Salida ALU B Figura 4.24: Visión de alto nivel del Camino de Datos del MIPS La figura 4.24 muestra una visión de alto nivel del Camino de Datos completo. En este diseño se utiliza una única ALU en vez de una ALU y dos sumadores, una memoria 4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 31 única para instrucciones y datos, y se han añadido registros temporales tras cada unidad funcional para almacenar la salida de dicha unidad hasta que este valor vaya a utilizarse en el siguiente ciclo. En concreto, se han añadido los siguientes registros temporales: El registro de instrucción (IR) y el registro de datos de memoria (MDR) se añaden para almacenar la salida de la memoria tras la lectura de una instrucción o un dato, respectivamente. Se utilizan dos registros separados, ya que, como se verá más tarde, ambos valores se necesitarán en un mismo ciclo. Los registros A y B se utilizan para guardar los valores de los registros operandos leı́dos del banco de registros. El registro SalidaALU almacena la salida de la ALU. Todos los registros, excepto el IR, guardan datos entre dos ciclos de reloj consecutivos y por tanto no necesitarán señal de escritura. El IR sı́ necesita conservar la instrucción hasta el final de su ejecución y por lo tanto sı́ requiere de esa señal de control. Debido a que se utilizarán varias unidades funcionales para diferentes propósitos, será necesario introducir multiplexores para poder escoger entre diferentes entradas. Se necesita un MUX para seleccionar: el origen de la dirección de acceso a memoria (el PC para acceder a instrucciones, el registro SalidaALU para acceder a datos). el registro de destino, que estará indicado por los bits 16-20 (rt) en los casos de instrucciones de carga y por los bits 11-15 (rd) en los casos de instrucciones aritméticológicas. el dato a escribir, que será un dato de la memoria en el caso de instrucciones de carga y la salida de la ALU en el caso de instrucciones aritmético-lógicas. la primera entrada de la ALU, que podrá ser el registro A o el PC. la segunda entrada de la ALU, que podrá ser el registro B (en el caso de instrucción aritmética lógica o instrucción de salto condicional), el número 4 (utilizado para incrementar el PC), el campo desplazamiento con el signo extendido (en el caso de instrucciones de transferencia de datos) o el campo desplazamiento con el signo extendido y desplazado 2 bits a la izquierda (para el cálculo de la dirección destino en los saltos condicionales). la dirección de la siguiente instrucción a ejecutar, que se almacenará en PC y que podrá ser PC+4, la dirección de salto calculada por la ALU en caso de salto condicional o la dirección de salto indicada en la propia instrucción en caso de salto incondicional. En este último caso, la dirección destino se obtiene mediante el desplazamiento de los 26 bits de menor peso de la instrucción 2 bits a la izquierda (añadiendo 00 como bits de menor peso) y concatenando los 4 bits de mayor peso de PC+4 como bits de mayor peso. 32 TEMA 4. EL PROCESADOR La figura 4.25 muestra el Camino de Datos completo para ejecutar las instrucciones básicas del MIPS. 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 0 M u 1x 16 M u 1x A M 1 u 2 x ALU Cero Resultado ALU Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.25: Camino de Datos para ejecutar las instrucciones básicas del MIPS El primer paso en la ejecución de una instrucción es común a todas las instrucciones y consiste en el almacenamiento de la instrucción a ejecutar en el registro de instrucción. Se envı́a el PC a memoria como dirección, se efectúa la lectura de la instrucción y se escribe en el registro de instrucciones (IR).También se incrementa el PC en cuatro para apuntar a la siguiente instrucción a ejecutar. La figura 4.26 muestra la parte del Camino de Datos que se utiliza. Debido a que nuestro diseño utiliza sincronización por flanco, se puede leer el contenido de un registro que se vaya a escribir ya que el nuevo valor no será accesible hasta el siguiente ciclo de reloj. En este caso, el incremento del PC y la búsqueda de la instrucción puede realizarse en paralelo ya que el nuevo valor del PC no será visible hasta el siguiente ciclo. A continuación describiremos como se utiliza este Camino de Datos para cada una de las instrucciones consideradas. Instrucciones aritmético-lógicas Si la instrucción a ejecutar es una instrucción aritmético lógica, el siguiente paso será la búsqueda de los registros con los operandos, la ejecución de la operación aritmético-lógica sobre los operandos y la escritura del resultado en el registro destino. La figura 4.27 muestra la parte del Camino de Datos que se utiliza para la búsqueda de los registros. En esta etapa se leen los dos registros indicados por rs y rt y se almacenan en los registros temporales A y B. 4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 33 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 M u 1x A Dato leído 2 B Cero Resultado ALU 0 4 0 M u 1x 16 ALU M 1 u 2 x Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.26: Camino de Datos: etapa de carga de la instrucción 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 Instr. [15-11] M u 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 0 M u 1x 16 M u 1x A M 1 u 2 x ALU Cero Resultado ALU Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.27: Camino de Datos: búsqueda de registros (instrucción tipo R e instrucción sw) 34 TEMA 4. EL PROCESADOR La figura 4.28 muestra en rojo la parte del Camino de Datos que se utiliza para la ejecución de la operación y en rosa lo que se utiliza de ciclos anteriores. En esta etapa la ALU lleva a cabo la operación especificada en el código de función sobre los datos almacenados en A y B en el ciclo anterior y almacena el resultado en el registro SalidaALU. 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 M u 1x A Dato leído 2 B Cero Resultado ALU 0 4 0 M u 1x 16 ALU M 1 u 2 x Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.28: Camino de Datos: instrucción tipo R, ejecución La figura 4.29 muestra en rojo la parte del Camino de Datos que se utiliza para escribir el resultado (almacenado en el ciclo anterior en el registro SalidaALU) en el registro destino especificado por el campo rd de la instrucción (bits 15-11). 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 0 M u 1x 16 M u 1x A M 1 u 2 x ALU Cero Resultado ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.29: Camino de Datos: instrucción tipo R, escritura de resultado En total, este tipo de instrucciones necesitarán 4 ciclos de reloj para ejecutarse. Salida ALU 4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 35 Instrucción lw Si la instrucción a ejecutar es un load (lw $t1, desp1($t2)) el siguiente paso a la carga de la instrucción será el cálculo de la dirección de memoria a leer, la lectura del dato y el almacenamiento del mismo en el registro destino. La dirección de memoria se calcula sumando al registro base ($t2) el campo desplazamiento. Por tanto, antes de calcular la dirección de memoria tendremos que leer el registro base y almacenarlo en el registro temporal A para poder operar con él. La figura 4.30 muestra el Camino de Datos utilizado para esta operación. 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Instrucción [25-21] Reg. de lectura 1 Instrucción [20-16] Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria REGISTROS P C Reg. de lectura 2 0 Instr. [15-11] M u 1x Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 0 M u 1x 16 M u 1x A M 1 u 2 x ALU Cero Resultado ALU Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.30: Camino de Datos: instrucción lw, búsqueda de registro La figura 4.31 muestra la parte del Camino de Datos que se utiliza para calcular la dirección de memoria utilizando el dato almacenado en el registro A en el ciclo anterior. A continuación se accede a memoria y se carga una palabra en el registro MDR. La dirección de memoria que se utiliza se ha calculado en el ciclo anterior y se encuentra almacenada en SalidaALU. La figura 4.32 muestra en rojo la parte del Camino de Datos que se utiliza y en rosa lo que se utiliza de ciclos anteriores. Las instrucción se completa escribiendo el valor leı́do de memoria, almacenado en el ciclo anterior en el registro MDR, en el banco de registros. La figura 4.33 muestra en rojo la parte del Camino de Datos que se utiliza en esta etapa y en rosa lo que se utiliza de ciclos anteriores. Esta instrucción necesita un total de 5 ciclos de reloj para completarse. 36 TEMA 4. EL PROCESADOR 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 M u 1x A Dato leído 2 B Cero Resultado ALU 0 4 0 M u 1x 16 ALU M 1 u 2 x Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.31: Camino de Datos: instrucción lw, cálculo de la dirección de memoria 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Instrucción [25-21] Reg. de lectura 1 Instrucción [20-16] Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria REGISTROS P C Reg. de lectura 2 0 Instr. [15-11] M u 1x Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 A B 0 4 0 M u 1x 16 M u 1x M 1 u 2 x ALU Cero Resultado ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.32: Camino de Datos: instrucción lw, lectura de memoria Salida ALU 4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 37 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 M u 1x A B 0 4 0 M u 1x 16 M 1 u 2 x ALU Cero Resultado ALU Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.33: Camino de Datos: instrucción lw, almacenamiento de dato en registro Instrucción sw Si la instrucción a ejecutar es un store, los siguientes pasos después de la carga de la instrucción serán la búsqueda del registro a almacenar, el cálculo de la dirección de memoria en la que escribir el dato y la escritura del mismo. Como en la instrucción lw, la dirección de memoria se calcula sumando al registro base el campo desplazamiento. Por tanto, antes de calcular la dirección de memoria tendremos que leer el registro base y almacenarlo en el registro temporal A para poder operar con él. Esta operación se puede hacer en paralelo a la carga del registro a almacenar. La figura 4.27 muestra el Camino de Datos que se utiliza para estas operaciones. La figura 4.34 muestra en rojo la parte del Camino de Datos que se utiliza para calcular la dirección de memoria utilizando el dato almacenado en el registro A en el ciclo anterior. A continuación se accede a memoria y se escribe el dato almacenado en el registro B. La dirección de memoria que se utiliza se ha calculado en el ciclo anterior y se encuentra almacenada en SalidaALU. La figura 4.35 muestra en rojo la parte del Camino de Datos que se utiliza y en rosa lo que se utiliza de ciclos anteriores. Esta instrucción necesita un total de 4 ciclos para ejecutarse. Instrucción beq Si la instrucción a ejecutar es una beq, una vez cargada la instrucción se almacenarán los operandos en los registros A y B, se calculará la dirección de salto y se compararán los valores de los operandos utilizando la ALU para determinar si el salto se toma o no. 38 TEMA 4. EL PROCESADOR 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 M u 1x A Dato leído 2 B Cero Resultado ALU 0 4 0 M u 1x 16 ALU M 1 u 2 x Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.34: Camino de Datos: instrucción sw, cálculo de la dirección de memoria 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Instrucción [25-21] Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 Instr. [15-11] M u 1x REGISTROS P C Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 1 2 0 M u 1x 16 M u 1x A M u x ALU Cero Resultado ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.35: Camino de Datos: instrucción sw, escritura en memoria Salida ALU 4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 39 En caso de que los operandos sean iguales, el salto será efectivo y se escribirá el PC con el valor de salto calculado previamente. La carga de los operandos y el cálculo de la dirección de salto se puede hacer en paralelo. La figura 4.36 muestra la parte del Camino de Datos que se utiliza para llevar a cabo estas acciones. 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 0 M u 1x 16 M u 1x A M 1 u 2 x ALU Cero Resultado ALU Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.36: Camino de Datos: instrucción beq, búsqueda de los registros y cálculo de la dirección de salto A continuación se utiliza la ALU para restar los dos operandos leı́dos en el paso anterior y comprobar de esta forma si son iguales. La señal de Cero de la ALU se utiliza para determinar si el salto se toma o no. Si se toma el salto se escribe el PC con el nuevo valor (la figura 4.37 muestra en rojo la parte del Camino de Datos que se utiliza y en rosa lo que se utiliza de ciclos anteriores), si no se cumple la condición de igualdad el PC no se modifica (la figura 4.38 muestra la parte del Camino de Datos que se usa en este caso). Esta instrucción necesita 3 ciclos para ejecutarse. Instrucción j Si lo que tenemos es una instrucción de salto incondicional lo único que tendremos que hacer es escribir el PC con la dirección de salto. La figura 4.39 muestra en rojo la parte del Camino de Datos que se utiliza. Esta instrucción necesitarı́a solamente 2 ciclos para ejecutarse, pero como veremos más adelante, se ejecutará en tres para simplificar el diseño de la Unidad de Control. 40 TEMA 4. EL PROCESADOR 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 M u 1x A Dato leído 2 B 0 4 M u 1x 16 1 2 0 ALU Cero Resultado ALU M u x Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.37: Camino de Datos: instrucción beq, ejecución cuando se cumple la condición de salto 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 0 M u 1x 16 M u 1x A M 1 u 2 x ALU Cero Resultado ALU Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.38: Camino de Datos: instrucción beq, ejecución cuando no se cumple la condición de salto 4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 41 0 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 0 M u 1x 16 M u 1x A M 1 u 2 x ALU Cero Resultado ALU Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.39: Camino de Datos: ejecución de una instrucción de salto incondicional 4.5.7. Señales de control Se van a necesitar un conjunto de señales de control para utilizar el Camino de Datos de la forma descrita en la sección anterior. Los elementos de estado visibles por el programador (el PC, la memoria y los registros), ası́ como el IR, necesitan señales de control de escritura. Además, la memoria necesita una señal para lectura. Los multiplexos de 2 entradas requieren una lı́nea de control, mientras que los de 4 entradas necesita dos señales. En cuanto a la ALU, mediante una pequeña unidad de control que tiene como entradas el código de función de la instrucción y 2 bits de control adicionales que reciben el nombre de ALUop, se pueden generar los 3 bits que conforman las señales de control de la ALU. Los dos bits de ALUop indican si la operación a realizar es una suma para accesos a memoria o cálculo de la dirección de salto (00), una resta para saltos condicionales (01), o si la operación está codificada en el código de función (10) para instrucciones tipo R. La salida de la unidad de control de la ALU es una señal de 3 bits que le indica a la ALU la operación a realizar codificando una de las 5 combinaciones vistas en el cuadro 4.2. La figura 4.3 muestra la relación entre los bits de control de la ALU, los bits ALUop y los diferentes códigos de función de las instrucciones tipo R. Si ALUop tiene como valor 00 la ALU realizará una suma (instrucción sw, lw o beq para el cálculo de la dirección de salto), si su valor es 01 la ALU realizará una resta (instrucción beq para el chequeo de la condición de igualdad). Si tenemos una instrucción tipo R, ALUop tomará el valor 10 y la operación a realizar por la ALU dependerá del código de función. La figura 4.40 muestra el Camino de Datos con la señales de control ya añadidas. La señales ALUop, SelALUB y FuentePC son de 2 bits, mientras que el resto son solo de 1 bit. Los registros A, B, Salida ALU y MDR no requieren ninguna señal de escritura ya que sus contenidos solamente se leen en el ciclo inmediatamente posterior a su escritura. La figura 4.41 muestra la unidad de control con todas las lı́neas de control conectadas 42 TEMA 4. EL PROCESADOR ALUOp Campo de función Acción Lı́neas de control de la ALU 00 XXXXXX suma 010 01 XXXXXX resta 110 10 100000 suma 010 10 100010 resta 110 10 100100 AND 000 10 100101 OR 001 10 101010 slt 111 Cuadro 4.3: Cálculo de los bits de control de la ALU en función de ALUop y el código de función de las instrucciones tipo R Escribir PC LeerMem EscrMem EscrIR RegDest EscrReg SelALUA FuentePC SelALUB 0 IoD Mem2Reg 1 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 0 M u 1x 16 M u 1x A M 1 u 2 x ALU Cero Resultado ALU Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Control ALU ALUop Figura 4.40: El Camino de Datos de la figura 4.25 mostrando las señales de control 4.6. DISEÑO DE LA UNIDAD DE CONTROL 43 a ella. La principal diferencia con la figura 4.40 es la incorporación de las señales EscrPC y EscrPCCond. El PC deberı́a escribirse en caso de salto incondicional (EscrPC=1) o en caso de salto condicional si se cumple la condición de igualdad (EscrPCCond=1 y Cero ALU=1). EscrPC Cond EscrPC FuentePC ALUop IoD LeerMem SelALUB EscrMem Control SelALUA Mem2Reg EscrReg OP EscrIR RegDest [31-26] Instrucción [25-0] 0 1 Desp. 28 2 bits a la izq. 26 Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Instrucción [25-21] Reg. de lectura 1 Instrucción [20-16] Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria REGISTROS P C Reg. de lectura 2 0 Instr. [15-11] M u 1x Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 M u 1x A B 0 4 0 M u 1x 16 M 1 u 2 x ALU Cero Resultado ALU Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Control ALU Figura 4.41: El Camino de Datos con la Unidad de Control Las figuras 4.42 y 4.43 muestran qué hace cada señal de control cuando está activa e inactiva. 4.6. Diseño de la Unidad de Control La unidad de control debe especificar qué señales se van a activar en cada paso y cuál es el siguiente paso de la secuencia. Se construye como un sistema secuencial o autómata que va pasando por diferentes estados, indicando cada estado qué puntos de control se activan (salidas del autómata) y, en función de las condiciones (entradas del autómata), cual es el estado siguiente. Las condiciones de la unidad de control serán los bits de la instrucción y los indicadores internos (por ejemplo, la salida Cero de la ALU). Cada estado del autómata representará una etapa de la ejecución de la instrucción y tardará un ciclo de reloj. Como hemos visto en la sección anterior, cada instrucción necesita de tres a cinco etapas para ejecutarse. Gran parte de lo necesario para la ejecución de estas instrucciones será común a todas ellas, de hecho, para cada instrucción los dos primeros pasos serán idénticos. A partir de aquı́, las acciones necesarias para completar la 44 1 El TEMA 4. EL PROCESADOR nombre de esta señal proviene de la disyuntiva entre Instrucciones o Datos Figura 4.42: Acciones de las señales de control de 1 bit Figura 4.43: Acciones de las señales de control de 2 bits 4.6. DISEÑO DE LA UNIDAD DE CONTROL 45 instrucción dependerán de la instrucción concreta. Después de la última etapa el autómata debe volver al estado inicial para procesar la siguiente instrucción. En las siguientes subsecciones se muestra lo que ocurre en cada una de las etapas dependiendo de la instrucción. 4.6.1. Etapa 1. Carga de una instrucción El primer paso en la ejecución (estado 0) es el almacenamiento de la instrucción a ejecutar en el registro de instrucción. Se envı́a el PC a memoria como dirección, se efectúa la lectura de la instrucción y se escribe en el registro de instrucciones (IR).También se incrementa el PC en cuatro. La figura 4.26 muestra la parte del Camino de Datos que se utiliza. Para la realización de este primer paso, se han de activar las señales LeerMem y EscrIR. La señal IoD tiene que estar a 0 para seleccionar el PC como dirección a buscar en memoria. Para incrementar el PC se ha de poner la señal SelALUA a 0 (para enviar el PC a la ALU), SelALUB a 01 (para seleccionar el 4 como segundo operando) y ALUop a 00 (para sumar). Finalmente, para almacenar el nuevo valor del PC se debe activar la señal EscrPC. La figura 4.44 muestra gráficamente la activación de estas señales sobre el Camino de Datos. EscrPC Cond EscrPC FuentePC ALUop IoD LeerMem SelALUB EscrMem Control SelALUA Mem2Reg EscrReg OP EscrIR RegDest [31-26] Instrucción [25-0] 0 1 Desp. 28 2 bits a la izq. 26 Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Estado 0 Inicio LeerMem SelALUA = 0 selALUB = 01 ALUOp = 00 IoD = 0 EscrIR EscrPC FuentePC = 00 Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro A deEstado datos de1 memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 M u 1x A B 0 4 0 M u 1x 16 M 1 u 2 x ALU Cero Resultado ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Figura 4.44: Estado 0. Cargar instrucción Control ALU Salida ALU 46 TEMA 4. EL PROCESADOR 4.6.2. Etapa 2. Decodificación de la instrucción y búsqueda de los registros En esta etapa (estado 1) se decodifica la instrucción, es decir, todavı́a no se conoce que instrucción se va a ejecutar. Para aprovechar el ciclo se adelantan acciones que puedan ser útiles a posteriori. Por ejemplo, se leen los dos registros indicados por rs y rt y se almacenan en los registros temporales A y B. También se puede calcular la dirección destino del salto con la ALU. Dicha dirección de salto potencial se almacena en SalidaALU para su posterior utilización si fuera necesario. El acceso al banco de registros y el cálculo de la dirección de salto se realizan en paralelo. La figura 4.36 muestra la parte del Camino de Datos que se utiliza. Para llevar a cabo estas acciones se requiere que la señal SelALUA esté a 0 (para enviar el PC a la ALU), SelALUB a 11 (para tomar el campo desplazamiento de la instrucción desplazado 2 bits y con el signo extendido) y ALUOp a 00 (para calcular una suma). La figura 4.45 muestra gráficamente la activación de estas señales sobre el Camino de Datos. EscrPC Cond EscrPC FuentePC ALUop IoD LeerMem SelALUB EscrMem Control SelALUA Mem2Reg EscrReg OP EscrIR RegDest [31-26] Instrucción [25-0] 0 1 Desp. 28 2 bits a la izq. 26 Salto incond. [31-0] M u x 2 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Estado 1 De Estado 0 SelALUA = 0 selALUB = 11 ALUOp = 00 Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos?de Estado memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 1 2 0 M u 1x 16 M u 1x A M u x ALU Cero Resultado ALU Salida ALU 3 Exten. signo 32 Desp. 2 bits a la izq. Control ALU Figura 4.45: Estado 1. Decodificación, búsqueda de los registros y cálculo de la dirección de salto potencial A partir de aquı́ las operaciones del Camino de Datos vienen determinadas por el tipo de instrucción. Las siguientes subsecciones describen las diferentes etapas por las que pasan cada una de las instrucciones consideradas. 4.6. DISEÑO DE LA UNIDAD DE CONTROL 4.6.3. 47 Instrucciones de acceso a memoria (sw o lw) La figura 4.46 muestra los diferentes estados por los que se pasa en la ejecución de una instrucción de acceso a memoria, ası́ como las señales de control que se activan en cada paso. En los siguientes apartados se explican con más detalle cada una de las etapas. De Estado 1 (Op = “LW”) o (Op = “SW”) Estado 2 SelALUA = 1 selALUB = 10 ALUOp = 00 Cálculo dirección de memoria (Op = “SW”) (Op = “LW”) Estado 5 Estado 3 EscrMem I0D = 1 LeerMem IoD = 1 Acceso a memoria Acceso a memoria Estado 4 EscrReg Mem2Reg = 1 RegDest = 0 Etapa de escritura Vuelta al Estado 0 Figura 4.46: Control de instrucciones de acceso a memoria Etapa 3. Cálculo de la dirección de memoria Esta etapa se corresponde con el estado 2 de la figura 4.46. La ALU debe efectuar una suma para calcular la dirección de memoria (ver figuras 4.31 y 4.34). Para efectuar la operación la señal de control SelALUA debe estar a 1 (el primer operando de la ALU es el registro A) y SelALUB a 10 (el segundo operando de la ALU son los 16 bits de menor peso de la instrucción con el signo extendido). La señal de ALUop vale 00 para hacer una suma. Etapa 4. Acceso a memoria Si la instrucción es un load, se carga una palabra de memoria y se escribe en el MDR. La dirección de memoria que se utiliza se ha calculado en el ciclo anterior y se encuentra almacenada en SalidaALU (ver figura 4.32). Se debe activar la señal de control LeerMem y 48 TEMA 4. EL PROCESADOR poner a 1 IoD para forzar que la dirección con la que se va a acceder a la memoria provenga de la ALU. El registro MDR se escribe en cada ciclo de reloj, no necesita ninguna señal de control de escritura explı́cita. Esta etapa se corresponde con el estado 3 en la figura 4.46. Si es un store, el operando fuente almacenado en B se escribe en la memoria en la dirección que se encuentra almacenada en SalidaALU y que ha sido calculada en el ciclo anterior (ver figura 4.35). Se ha de activar la señal de control EscrMem y poner IoD a 1 para coger la dirección de memoria almacenada en SalidaALU. Esta etapa se corresponde con el estado 5 en la figura 4.46. La instrucción sw finaliza aquı́, con lo cual en el siguiente ciclo se volverı́a al estado 0. Etapa 5. Etapa de escritura En esta etapa la instrucción lw se completa escribiendo el valor leı́do de memoria (almacenado en el ciclo anterior en el registro MDR) en el banco de registros (ver figura 4.33). Para hacer esto Mem2Reg debe ponerse a 1 para escribir el resultado procedente de la memoria, EscrReg debe activarse para escribir y RegDest debe ponerse a 0 para elegir rt (bits 16-20) como identificador de registro destino. Al finalizar se volverı́a el estado 0 para procesar una nueva instrucción. 4.6.4. Instrucciones aritmético-lógicas (tipo R) La figura 4.47 muestra los diferentes estados por los que se pasa en la ejecución de una instrucción aritmético-lógica, ası́ como las señales de control que se activan en cada paso. Las siguientes subsecciones explican en más detalle cada una de las etapas. Etapa 3. Ejecución de la operación La ALU debe realizar la operación aritmético-lógica especificada en el código de función sobre los datos leı́dos del banco de registros en la etapa anterior (ver figura 4.28). Para llevar a cabo la operación la señal de control SelALUA se tiene que poner a 1 y SelALUB debe tomar el valor 00 (para que las entradas de la ALU sean los registros A y B respectivamente). La señal ALUop ha de estar a 10 para que la operación a realizar por la ALU venga determinada por el código de función. Esta etapa se corresponde con el estado 6 en la figura 4.47. Etapa 4. Finalización de la operación El resultado de la operación aritmético-lógica realizada en el ciclo anterior y guardada en el registro SalidaALU se almacena en el registro destino (ver figura 4.29). La señal RegDest debe estar a 1 para forzar que el campo rd (bits 15-11) se use para seleccionar el registro donde se va a escribir; EscrReg también debe estar activa y Mem2Reg debe 4.6. DISEÑO DE LA UNIDAD DE CONTROL 49 De Estado 1 (Op = Aritmético-lógica) Estado 6 SelALUA = 1 selALUB = 00 ALUOp = 10 Ejecución de la operación Estado 7 RegDest = 1 EscrReg Mem2Reg=0 Finalización de la operación Vuelta al Estado 0 Figura 4.47: Control de instrucciones aritmético-lógicas estar a 0 para que se escriba la salida de la ALU en lugar del dato obtenido de memoria. Esta etapa se corresponde con el estado 7 en la figura 4.47. 4.6.5. Instrucciones de salto condicional (beq) Esta instrucción necesita solamente una etapa más, etapa 3. En esta etapa, la ALU se utiliza para efectuar la comparación de igualdad entre los dos registros leı́dos en el paso anterior. La señal de Cero de la ALU se utiliza para determinar si el salto se toma o no (ver figuras 4.37 y 4.38). La señal SelALUA está a 1 y SelALUB a 00 para tomar las salidas del banco de registros como entradas de la ALU. La señal ALUop está a 01 para realizar la resta y efectuar ası́ la comprobación de igualdad. La señal EscrPCCond está activa para ası́ modificar el PC en caso de que la señal de Cero de la ALU también lo esté. La señal FuentePC está a 01 indicando que el valor a escribir en el registro de PC es almacenado en SalidaALU, el cual guarda la dirección de destino de salto que se calculó en la etapa previa. La figura 4.48 muestra el estado correspondiente a esta etapa, estado 8. Una vez finalizado se vuelve al estado 0 para procesar la siguiente instrucción. 4.6.6. Instrucción de salto incondicional (jump) Si lo que tenemos es una instrucción de salto incondicional, en la tercera etapa el PC se sustituye por la dirección de salto incondicional (ver figura 4.39). FuentePC se pone a 50 TEMA 4. EL PROCESADOR De Estado 1 (Op = “beq”) Estado 8 SelALUA = 1 selALUB = 00 ALUOp = 01 EscrPCCond FuentePC = 01 Finalización de salto condicional Vuelta al Estado 0 Figura 4.48: Control de instrucciones de salto condicional (beq) 10 y EscrPC se activa para escribir dicha dirección de salto en el PC. La instrucción jump requiere un único estado adicional, el estado 9 (ver figura 4.49). De Estado 1 (Op = “j”) Estado 9 EscrPC FuentePC = 10 Finalización de jump Vuelta al Estado 0 Figura 4.49: Control de instrucciones de salto incondicional (j) 4.6.7. Autómata de control completo La figura 4.50 muestra el autómata de control completo. A partir de la definición de este autómata, existen dos formas de abordar el diseño de la unidad de control: unidad de control cableada y unidad de control microprogramada. La unidad de control cableada se construye utilizando alguno de los métodos clásicos de diseño de circuitos secuenciales como el que hemos visto en el tema 3. En la unidad de control microprogramada se utiliza una memoria de control para almacenar el estado de las diferentes señales de control durante cada uno de los ciclos de ejecución de una instrucción. La implementacion es sencilla y estándar, el hardware es prácticamente independiente de la implementación. La Unidad de Control microprogramada es fácil de depurar, modificar y ampliar, por lo que es la mejor opción para sistemas grandes y/o complejos. Como ya hemos visto el método de diseño cableado, a continuación estudiaremos la unidad de control microprogramada. 4.7. CONTROL MICROPROGRAMADO Estado 0 Estado 1 LeerMem SelALUA = 0 selALUB = 01 ALUOp = 00 IoD = 0 EscrIR EscrPC FuentePC = 00 SelALUA = 0 selALUB = 11 ALUOp = 00 SelALUA = 1 selALUB = 10 ALUOp = 00 -L p= (O Estado 6 Cálculo dirección de memoria Ejecución de la SelALUA = 1 operación selALUB = 00 ALUOp = 10 = “j ”) q”) = “LW (Op “be Estado 2 Ar itm “SW Op = ”) o ( (Op p= ”) (O óg ica s) Inicio 51 Estado 8 SelALUA = 1 selALUB = 00 ALUOp = 01 EscrPCCond FuentePC = 01 Estado 9 Finalización de salto condicional Finalización de jump EscrPC FuentePC = 10 (Op = “SW”) (Op = “LW”) Estado 5 Estado 3 RegDest = 1 EscrReg Mem2Reg=0 EscrMem I0D = 1 LeerMem IoD = 1 Acceso a memoria Estado 7 Finalización de la operación Acceso a memoria Estado 4 EscrReg Mem2Reg = 1 RegDest = 0 Etapa de escritura Figura 4.50: Autómata de control completo para el Camino de Datos de la figura 4.41 4.7. Control microprogramado El autómata se transforma en un programa de control formado por instrucciones de control llamadas microinstrucciones. Cada microinstrucción define el conjunto de señales de control del Camino de Datos que deben estar activas en un estado determinado. La ejecución de una microinstrucción tiene como efecto la activación de las señales de control especificadas por dicha microinstrucción. Además de definir qué señales deben estar activas, también se debe especificar la secuencia, es decir, cuál es la siguiente microinstrucción a ejecutar. El conjunto de las microinstrucciones se denomina microprograma y se almacenará en una memoria de solo lectura, como por ejemplo una ROM. Cada microinstrucción tendrá asignada una dirección en dicha memoria. La figura 4.51 muestra una implementación tı́pica de una sección de control microprogramada. Además de la memoria de control para almacenar las microinstrucciones, se necesita un secuenciador encargado de ir generando las direcciones de las siguientes microinstrucciones a ejecutar y que veremos más adelante como implementar. La siguiente microinstrucción a ejecutar dependerá de la instrucción máquina que se esté ejecutando en el Camino de Datos y de la condiciones generadas por el Camino de Datos. Existen dos forma de realizar el secuenciamiento de la memoria de control: 52 TEMA 4. EL PROCESADOR Secuenciador Codigo operacion Condiciones camino datos Reloj Memoria de Control (ROM) Registro de Microinstruccion ....... Señales de control Figura 4.51: Esquema de una unidad de control microprogramada Secuenciamiento explı́cito: cada microinstrucción incluye la dirección de la microinstrucción siguiente. Secuenciamiento implı́cito: existen dos tipos de microinstrucciones, de control y de salto. Dentro de cada microinstrucción se reserva un campo para especificar el tipo de microinstrucción. Por defecto la siguiente microinstrucción a ejecutar es la siguiente, es decir, la que ocupa la posición de memoria consecutiva. Para ejecutar otra microinstrucción necesitaremos incluir una instrucción de salto. Nosotros vamos a ver como construir una unidad de control con secuenciamiento explı́cito para el conjunto básico de instrucciones MIPS consideradas. Cada estado del autómata de control de la figura 4.50 se va a corresponder con una microinstrucción. Para llevar a cabo el secuenciamiento tenemos que tener en cuenta el diagrama de estados del automáta de control. En general: Tras terminar una instrucción se ha de retornar al estado 0. Las instrucciones solamente tienen algunos estados en común, después divergen. Esta divergencia puede ocurrir en varios lugares en el diagrama de estados. Existen, por tanto, tres métodos posibles para la elección de la siguiente microinstrucción a ejecutar: 4.7. CONTROL MICROPROGRAMADO 53 1. Incrementar la dirección de la microinstrucción actual para obtener la de la siguiente. 2. Saltar a la microinstrucción que inicia la ejecución de la siguiente instrucción. 3. Elegir la siguiente microinstrucción en función del estado en el que nos encontremos. Esta elección en base al estado recibe el nombre de dispatch. Las operaciones de dispatch suelen realizarse mediante una tabla que contenga las direcciones de las microinstrucciones destino. Esta tabla se suele realizar en una ROM denominada ROM de envı́o. En el caso general, crearemos una tabla para cada estado con múltiples estados destino. Para la implementación de las instrucciones básicas del MIPS que hemos considerado en este capı́tulo se necesitan dos tablas, una para elegir la siguiente microinstrucción después del estado 1 y otra para elegir la siguiente microinstrucción después del estado 2 (ver figura 4.50). Por lo tanto, para el conjunto básico de instrucciones MIPS consideradas necesitamos 2 bits (CtrlDir) para especificar cómo elegir la siguiente microinstrucción a ejecutar. Las opciones posibles son: CtrlDir=00: Va a la primera microinstrucción para comenzar una nueva instrucción. CtrlDir=01: Selecciona la siguiente microinstrucción utilizando la tabla de envı́o 1. CtrlDir=10: Selecciona la siguiente microinstrucción utilizando la tabla de envı́o 2. CtrlDir=11: Selecciona la siguiente microinstrucción (secuencia normal). Vamos a suponer la implementación más sencilla, cada punto de control del Camino de Datos se corresponde con un bit de las microinstrucciones, es decir, cada una de las microinstrucciones constan de 18 bits (1 bit por cada punto de control del Camino de Datos y 2 bits para especificar la siguiente microinstrucción)1 . La implementación de la Unidad de Control microprogramada completa puede verse en la figura 4.52. El microprograma se almacena en una memoria de solo lectura (ROM). El registro de estado almacena la dirección de la microinstrucción a acceder. La función de secuenciación se realiza aparte en función de CtrlDir y el código de operación de la instrucción. La figura 4.53 muestra una posible implementación de la lógica de selección de dirección. Un mux selecciona en función de CtrlDir si aumentar la dirección actual (se utiliza un sumador para realizar el incremento), utilizar las tablas de envı́o 1 o 2, o saltar a la microinstrucción 0 para empezar el procesamiento de una nueva instrucción. La selección de la entrada en las tablas de envı́o se hace en función del código de operación de la instrucción. Finalmente, la figura 4.54 muestra el contenido de la memoria de control, es decir, el microprograma completo correspondiente al autómata de control de la figura 4.50. Cada microinstrucción representa un estado del autómata de control y define las señales de 1 Los puntos de control podrı́an estar codificados para ahorrar bits en las microinstrucciones. En contrapartida se necesitarı́a incluir un decodificador. 54 TEMA 4. EL PROCESADOR FuentePC (2) ALUop (2) SelALUA SelALUB (2) EscrReg RegDest EscrPC cond EscrPC IoD LeerMem EscrMem Mem2Reg EscrIR Salidas Lógica de Control (ROM) CtrlDir (2) Entradas 1 2 4 Sumador Registro de estado Selección dirección siguiente Código de operación Bits [31-26] del registro de instrucción Figura 4.52: Unidad de control microprogramada ROM CtrlDir Entradas 1 2 4 Sumador Registro de estado 3 Tabla de envío 2 2 MUX 1 0 Tabla de envío 1 Selección dirección siguiente Código de operación Bits [31-26] del registro de instrucción Figura 4.53: Lógica de selección de dirección para la unidad de control de la figura 4.52 4.7. CONTROL MICROPROGRAMADO 55 1 0 3 estado 0 0 3 0 1 estado 1 0 2 1 2 estado 2 3 estado 3 0 estado 4 0 estado 5 3 estado 6 0 estado 7 0 estado 8 0 estado 9 Mem1 Lw2 1 1 1 Sw2 1 1 1 Rformat1 2 0 1 0 Beq1 Jump1 1 1 0 1 1 2 1 0 1 1 CtrlDir (2) SelALUA 0 RegDest SelALUB (2) 0 EscrReg ALUOp (2) 1 FuentePC (2) Mem2Reg 1 EscrIR 0 EscrMem LeerMem 1 IoD EscrPCCond EscrPC control activas en ese estado, ası́ como la siguiente microinstrucción a ejecutar. Las instrucciones del microprograma se etiquetan simbólicamente. Estas etiquetas serán utilizadas para especificar los contenidos de las tablas de envı́o. Un campo en blanco correspondiente a una señal que afecta al control de una unidad de estado significa que la señal de control asociada no debe activarse. Un campo en blanco correspondiente a una señal de control de un MUX o al control de operación de la ALU significa que la salida no se usa, por lo que las señales asociadas pueden considerarse indiferentes. Figura 4.54: Microprograma para las instrucciones básicas del MIPS En la figura 4.55 se pueden ver las dos tablas de envı́o mostrando el contenido en forma simbólica utilizando las etiquetas del microprograma. Dependiendo de la instrucción que se esté ejecutando en el Camino de Datos se saltará a una u otra microinstrucción de la memoria de control. 56 TEMA 4. EL PROCESADOR Figura 4.55: Tablas de envı́o para el microprograma de la figura 4.54 4.8. Temporización En el diseño propuesto cada instrucción se divide en una serie de etapas, correspondiéndose cada una de ellas con un estado de la unidad de control, es decir, cada etapa necesitará un ciclo de reloj para ejecutarse. La figura 4.56 resume las etapas realizadas para ejecutar cualquier tipo de instrucción y el cuadro 4.4 el número de ciclos consumido por cada instrucción o CPI (Clock Cycles per Instruction). Figura 4.56: Resumen de las etapas realizadas para ejecutar cualquier tipo de instrucción El ciclo de reloj debe acomodarse al tiempo de las operaciones del Camino de Datos que se realizan en las diferentes etapas: acceso a memoria, acceso al banco de registros o una operación de la ALU. El ciclo de reloj deberı́a ser al menos tan largo como la más larga de las operaciones anteriores. Si suponemos, por ejemplo, que se necesitan 2.5 ns para la lectura de memoria, 3 ns para la escritura en memoria, 2 ns para que la ALU lleve a cabo una operación y 1 ns para el acceso a los registros (lectura y escritura), el ciclo de reloj deberı́a ser al menos de 3 ns. En este caso, tardarı́amos 12 ns (4 × 3 ns) en ejecutar una instrucción aritmética. 4.9. PROCESAMIENTO DE EXCEPCIONES 57 Tipo de instrucción Ciclos Aritmética 4 lw 5 sw 4 salto condicional 3 jump 3 Cuadro 4.4: Resumen del número de ciclos por instrucción 4.9. Procesamiento de excepciones Una excepción es un suceso inesperado que se produce en el procesador, por ejemplo el desbordamiento aritmético. Una interrupción es un suceso que provoca un cambio inesperado, pero se produce externamente al procesador. Las interrupciones son utilizadas por los dispositivos de Entrada/Salida para comunicarse con el procesador, como se verá en el siguiente capı́tulo. En la implementación básica de las instrucciones del MIPS que hemos considerado pueden ocurrir dos tipos de excepciones: la ejecución de una instrucción no definida y un desbordamiento aritmético. Las acciones que se han de llevar a cabo cuando ocurre una excepción son: Guardar la dirección de la instrucción causante en el registro contador de programa de la excepción (EPC). Transferir el control al sistema operativo en alguna dirección especı́fica. El sistema operativo ejecuta una rutina especı́fica. Finalizar el programa o continuar con su ejecución, usando EPC para saber dónde retomar la ejecución. Para que el sistema operativo pueda tratar la excepción, debe conocer las razones por las que se ha producido, además de la instrucción que la ha causado. El método empleado en la arquitectura MIPS para comunicar la causa es incluir un registro de estado denominado Registro de Causa o Cause Register, que contiene un campo que indica la razón de la excepción. Se puede incluir el procesamiento de excepciones a la unidad central de proceso previamente diseñada añadiendo algunos registros extra y algunas señales de control. En concreto, se tendrán que añadir 2 registros adicionales al Camino de Datos: EPC: Registro de 32 bits para guardar la dirección de la instrucción afectada. 58 TEMA 4. EL PROCESADOR Causa: Registro de 1 bit para almacenar la causa (instrucción no definida=0, desbordamiento aritmético=1). En cuanto a las señales de control, necesitaremos dos señales de control para que se escriban el EPC y el Registro de Causa llamadas EscrEPC y EscrCausa respectivamente. Además, también se necesita una señal de control de 1 bit para fijar el valor del Registro de Causa, es decir, para fijar el tipo de excepción. Esta señal recibe el nombre de CausaInt. Finalmente, se tiene que poder escribir la dirección del punto de entrada del sistema operativo para el tratamiento de la excepción en el PC. Supondremos en nuestra implementación que esta dirección es la C0000000hex . Actualmente, el PC está conectado a la salida de un multiplexor de cuatro entradas controlado por la señal FuentePC (ver figura 4.41). De las cuatro entradas solamente se utilizan tres. Podemos por tanto añadir una entrada adicional con el valor constante C0000000hex . La figura 4.57 muestra el Camino de Datos con los elementos necesarios para el procesamiento de excepciones. EscrPC Cond EscrPC IoD LeerMem EscrMem Mem2Reg EscrIR EscrCausa CausaInt EscrEPC FuentePC ALUop SelALUB Control SelALUA EscrReg OP RegDest [31-26] 0 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] 1 2 M u x 3 C0000000 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Reg. de lectura 2 Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria 0 M Instr. u [15-11] 1x REGISTROS P C Instrucción [25-21] Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 0 M u 1x 16 M u 1x A M 1 u 2 x ALU Cero Salida ALU Resultado ALU EPC 3 0 Exten. signo 32 Desp. 2 bits a la izq. Control ALU 1 0 M u 1x Causa Figura 4.57: Camino de Datos con los componentes adicionales necesarios para realizar las excepciones Las acciones a tomar durante el procesamiento de una excepción serán escribir en el Registro Causa un 0 o un 1 para indicar el tipo de excepción y guardar la dirección de la instrucción causante de la excepción en el registro EPC. Debido a que el PC se incrementa durante el primer ciclo de cada instrucción, para guardar la dirección de la instrucción causante de la excepción en el registro EPC tenemos que utilizar la ALU para restarle 4 al PC. La figura 4.58 muestra como se utiliza el Camino de Datos anterior para el procesamiento de una excepción. Por tanto, para tratar los dos tipos de excepciones que se están considerando, solo se han de añadir los dos estados mostrados en la figura 4.59. Cada estado proporciona 4.9. PROCESAMIENTO DE EXCEPCIONES EscrPC Cond EscrPC IoD LeerMem EscrMem Mem2Reg EscrIR EscrCausa CausaInt EscrEPC FuentePC ALUop SelALUB Control SelALUA EscrReg OP RegDest [31-26] 59 0 Desp. 28 2 bits a la izq. 26 Instrucción [25-0] Salto incond. [31-0] 1 2 M u x 3 C0000000 PC [31-28] 0 M u 1x Memoria Dirección Instrucciones o datos Datos Reg. de lectura 1 Instrucción [20-16] Instrucción [15-0] Registro de instrucción Instr. [15-0] Registro de datos de memoria REGISTROS P C Instrucción [25-21] Reg. de lectura 2 0 M Instr. u [15-11] 1x Reg. de escritura Dato a escribir 0 Dato leído 1 Dato leído 2 B 0 4 0 M u 1x 16 M u 1x A M 1 u 2 x ALU Cero Salida ALU Resultado ALU EPC 3 0 Exten. signo 32 Desp. 2 bits a la izq. Control ALU 1 0 M u 1x Causa Figura 4.58: Camino de Datos: procesamiento de excepciones el control para tres acciones: activar el Registro de Causa, obtener la dirección de la instrucción que ha provocado la excepción y guardarla en el EPC, poner en el PC la dirección para el procesamiento de la excepción por parte del sistema operativo. El control se transfiere a uno de estos estados cuando sucede una excepción. Cuando estos estados finalizan, el control se transfiere al estado 0 y se carga una nueva instrucción. Estado 10 Estado 11 CausaInt=0 EscrCausa SelALUA = 0 selALUB = 01 ALUOp = 01 EscrEPC EscrPC FuentePC = 11 CausaInt=1 EscrCausa SelALUA = 0 selALUB = 01 ALUOp = 01 EscrEPC EscrPC FuentePC = 11 Al Estado 0 Inicio de una nueva instrucción Figura 4.59: Par de estados que muestran las acciones necesarias para las dos excepciones consideradas Ahora falta detectar estas excepciones y transferir el control al estado apropiado. Cada una de las dos excepciones posibles se detecta de forma diferente: Instrucción no definida: Se detecta cuando no está definido el estado siguiente al estado 1 para ese código de operación. Esta excepción se trata definiendo como siguiente estado el estado 11 de la figura 4.59 para todos los códigos de operación no definidos. 60 TEMA 4. EL PROCESADOR Desbordamiento aritmético: La ALU tiene una señal de salida de desbordamiento. Esta señal se utiliza para pasar del estado 6 al estado 10 de la figura 4.59. La figura 4.60 muestra la máquina de estados finita con los estados adicionales para tratar la detección de excepciones. SelALUA = 1 SelALUB = 10 ALUop = 00 Cálculo dirección de memoria Ejecución de la operación eq Estado 6 Estado 2 Estado 8 SelALUA = 1 SelALUB = 00 ALUop = 01 EscrPCCond FuentePC=01 SelALUA = 1 SelALUB = 00 ALUop = 10 D Op = lw Estado 3 LeerMem IoD = 1 Acceso a memoria Acceso a memoria = =j ot ro s Estado 9 Finalización de salto condicional Finalización de jump EscrPC FuentePC=10 es b am ie Estado 7 nt RegDest = 1 EscrReg Mem2Reg = 0 EscrMem IoD = 1 Op or d Op = sw Estado 5 Op =b rit. sw Op Op = -Ló gic a SelALUA = 0 SelALUB = 11 ALUop = 00 =A Inicio Estado 1 LeerMem SelALUA = 0 SelALUB = 01 ALUop = 00 IoD = 0 EscrIR EscrPC FuentePC = 00 Op Estado 0 Finalización de la operación o Estado 10 CausaInt = 0 EscrCausa SelALUA = 0 SelALUB = 01 ALUop = 01 EscrEPC EscrPC FuentePC = 11 Estado 11 CausaInt = 1 EscrCausa SelALUA = 0 SelALUB = 01 ALUop = 01 EscrEPC EscrPC FuentePC = 11 Estado 4 EscrReg Mem2Reg = 1 RegDest = 0 Etapa de escritura Figura 4.60: Máquina de estados finitos completa Tendremos que hacer algunas modificaciones en la sección de control microprogramada para incorporar los dos nuevos estados. Además de añadir las 2 nuevas microinstrucciones, una correspondiente al estado 10 y otra al 11, tendremos que modificar la tabla de envı́o 1 para considerar otros códigos de operación (ver cuadro 4.5) y añadir una tercera tabla para tener en cuenta la bifurcación en el estado 6 (ver cuadro 4.6). Ahora CtrlDir puede tomar 5 valores diferentes, por lo que necesitamos ampliar esta señal a 3 bits. CrtlDir = 4 se corresponderá con la selección de la siguiente microinstrucción utilizando la tabla de envı́o 3. También tendremos que añadir las señales de control CausaInt, EscrCausa y EscrEPC. Pasarı́amos, por tanto, a tener microinstrucciones de tamaño 22 bits. La figura 4.61 muestra el contenido de la memoria de control completa. 4.9. PROCESAMIENTO DE EXCEPCIONES Código de operación 000000 000010 000100 100011 101011 otro 61 instrucción Tipo R jmp beq lw sw otra Valor Rformat1 JUMP1 BEQ1 Mem1 Mem 1 Nodef1 Cuadro 4.5: Tabla de envı́o 1 para el autómata de la figura 4.60 señal de desbordamiento valor 0 Arit3 1 Ov3 estado 0 0 3 0 1 estado 1 0 2 1 2 estado 2 3 estado 3 0 estado 4 0 estado 5 4 estado 6 0 estado 7 0 estado 8 0 estado 9 Mem1 Lw2 1 1 1 Sw2 1 1 1 Rformat1 2 Arit3 0 1 0 Beq1 1 0 1 1 1 0 1 1 EscrEPC 3 EScrCausa 0 CausaInt 1 CtrlDir (3) SelALUA 0 RegDest SelALUB (2) 0 EscrReg ALUOp (2) 1 FuentePC (2) Mem2Reg 1 EscrIR 0 EscrMem LeerMem 1 IoD EscrPCCond EscrPC Cuadro 4.6: Tabla de envı́o 3 para el autómata de la figura 4.60 Jump1 1 2 Ov3 1 3 1 1 0 0 0 1 1 estado 10 Nodef1 1 3 1 1 0 0 1 1 1 estado 11 Figura 4.61: Microprograma correspondiente al autómata de la figura 4.61