Escolar Documentos
Profissional Documentos
Cultura Documentos
1. Introduccin
El objetivo de este tema es fijar todos los conceptos adquiridos por el alumno mediante una
descripcin ms detallada de la parte del computador encargada de coordinar y ejecutar las
operaciones que envuelve un ciclo de instruccin: la CPU. En este tema la estudiaremos en
cuatro pasos: primero veremos sus componentes, despus el ciclo de instruccin, en tercer
lugar analizaremos la coordinacin del ciclo de instruccin mediante la Unidad de Control, y
finalmente la secuenciacin de los distintos ciclos de instruccin. Un aspecto importante en
este tema es el problema de la temporizacin, en el que aprenderemos los mecanismos que
permiten que las operaciones internes de cada instruccin (microoperaciones) se ejecuten de
forma correcta y en el orden previsto por el programador. El tema concluye con una
descripcin de las propiedades que caracterizan un computador y un par de ejemplos de
procesadores.
Un conjunto de cables transporta una secuencia de bits. Cuando dichos bits conforman una
entidad (un nico dato, una instruccin, etc.), al conjunto de cables se denomina bus. Como
ejemplo, en los computadores hay uno o dos buses de direcciones que, obviamente,
transportan punteros (nmeros naturales, direcciones de memoria) y cuyo nmero de hilos
(32, 64) est relacionado con el tamao de la memoria. El nmero de hilos de un bus se
representa con un numerito situado junto al bus, y una raya oblicua que lo cruza:
6
Para el arquitecto de computadores, los cables y buses tienen dos extremos diferenciados: el
origen de la informacin y el destino. Muchos de ellos se bifurcan en algn punto y tienen
varios destinos, pero nunca, nunca, tienen dos fuentes de informacin, ya que en caso de que
fueran diferentes, provocaran un cortocircuito. En algunos casos los buses se abren,
separando los bits que transportan (por ejemplo, un bus de 32 bits se abre en dos buses de 16
bits, con las partes ms y menos significativas). En otros casos, buses y cables se unen,
formando buses de mayor capacidad.
Es preciso conocer el funcionamiento de las puertas AND, OR, NOT, NAND, NOR y XOR.
Operaciones lgicas en buses (bit a bit)
A veces se representan puertas lgicas que operan con buses de entrada y salida. Como los
buses de entrada y salida son del mismo tamao (n), en realidad estas puertas de buses son n
puertas que operan sobre los bits que ocupan la misma posicin relativa en los distintos buses:
4
4
4
Multiplexor
Con varias puertas lgicas podemos construir un circuito que seleccione para la salida una de
sus posibles entradas. Cul de las posibles entradas se muestra en la salida lo determina la
seal o seales de seleccin (control). La seal selectora tambin es una entrada al circuito. En
el multiplexor 2 a 1 (dos entradas y una salida), la seleccin es un solo bit. Hay multiplexores 4
a 1, 8 a 1, etc., con selectores de 2 bits, 3 bits, etc.
Otros dispositivos muy utilizados en el computador y que conviene conocer son los
demultiplexores y los descodificadores en lnea. En el demultiplexor con m bits de seleccin,
hay una entrada (seal o bus) y 2m salidas. Los m bits de seleccin determina en cul de las
salida se vuelca la informacin de entrada, estando el resto de salidas a cero. El descodificador
en lnea tiene m entradas y 2m salidas de 1 bit. Todas las salidas estn a cero excepto aquella
cuyo nmero de orden determina la codificacin en binario natural de las m entradas:
0
0
0 0
1 011 (3) 1
1 0
0
0
0
Sumadores y unidades aritmtico-lgicas (ALU)
Estos dispositivos trabajan con los datos de entrada que llegan a travs de buses en los que la
informacin es de carcter numrico (entero o flotante). En la salida, en un bus, se muestra el
dato numrico resultante tras realizar una operacin aritmtica (o lgica). No es objetivo de
este tema saber cmo se realiza. Hay un tema especfico para ello.
En las unidades aritmticas ms complejas es posible elegir la operacin entre una gama (p.e.
SUMA, RESTA, AND, OR, MUL, DIV, OPUESTO, INVERSO). Seales de control (selectores)
posibilitan la eleccin de la operacin. Y como siempre, con m bits de control podemos elegir
hasta 2m operaciones.
Circuitos combinacionales
Las puertas lgicas, multiplexores, descodificadores y unidades aritmticas que hemos
visto anteriormente pertenecen a una clase de circuitos lgicos conocidos como
circuitos combinacionales. Su funcionamiento viene determinado por una tabla de
verdad en la que, para cada combinacin de valores de entrada se conoce el valor de
las salidas.
Circuitos secuenciales
Los circuitos como el biestable son secuenciales. El valor de la salida no slo depende
de la combinacin de valores de entrada, sino tambin de la secuencia histrica de
valores anteriores en las entradas. De alguna forma (la organizacin interna de los
transistores no es objeto de estudio en esta asignatura) es capaz de recordar la
informacin que pas previamente por sus entradas. Gracias a ellos podremos
implementar estructuras ms complejas capaces de almacenar un elevadsimo nmero
de bits. Son los registros y las memorias
Comparado con los registros, estas estructuras necesitan un bus adicional de direccin en el
que se indica, con un nmero en binario natural,
Observe que, una vez fijada la direccin, el dispositivo se comporta como un simple registro. Y
un detalle. La seal load de los registros, se denomina write en estas dos superestructuras. En
muchos casos se aade una seal read para indicar que la intencin es consultar el almacn.
Los bancos de registros y la memoria son diferentes en muchos aspectos:
En la memoria del computador, el bus de entrada y salida se suele dibujar como un nico bus
bidireccional. En los bancos de registros, en cambio, se dibujan por separados y se les asigna el
nombre de puerto de entrada y puerto de salida. Ms adelante veremos que es posible que
haya varios puertos de salida.
Buses. Es el cableado que interconecta los cuatro elementos anteriores. Los buses ms
importantes son:
Los registros
El registro de estado
Uno de los registros ms importantes de la CPU, por el papel que juega en la toma de
decisiones de un cdigo (bifurcaciones) es el registro de estado.
A diferencia del resto de registros del procesador, el registro de estado est constituido por
bits que en conjunto no tienen una semntica comn, sino que la informacin que guarda cada
uno de ellos (o cada pequeo grupo de bits) tiene un significado especfico. Por ello, los bits
del registro de estado tienen tambin un nombre propio: flags (indicadores).
Cada flag guarda informacin de un aspecto particular del estado de un computador. Para
entender mejor qu funcin realizan los flags, veamos dos ejemplos.
Boot flag (MIPS). Durante el arranque del computador, dicho vale 1. El resto del
tiempo vale 0.
Zero flag (ZF en el i8086). Tras la ejecucin de una instruccin aritmtica, el flag vale 1
si el resultado de la operacin es 0. En caso contrario, el flag vale 0. Dicho flag tambin
afecta a las instrucciones de movimiento de datos, identificando si el dato copiado es
nulo o no.
Flags y saltos
Los flags se utilizan a menudo para propagar informacin relevante de un ciclo
de instruccin al siguiente, y precisamente en muchos computadores se utiliza
el valor de un flag para tomar decisiones en base a una instruccin ejecutada
previamente. Veamos un ejemplo:
Los computadores modernos ya no utilizan los flags para los saltos. Lo normal
que las condiciones se evalen en la propia instruccin, evitando las
dependencias entre instrucciones y facilitando la ejecucin de instrucciones en
paralelo o fuera de orden*. Veamos dos ejemplos de instrucciones de salto
que no precisan de flags:
Dos criterios muy importantes se deben tener en cuenta para entender el puntero de pila:
Dichos criterios son muy importantes para entender cmo funciona SP tras una operacin de
Pila.
Imaginemos que SP tiene el valor 18, y deseamos almacenar un dato de 2 bytes.
De la pila tambin se pueden extraer datos para llevarlo a otro lugar del computador. En
dicho caso, el puntero de pila se modifica en el sentido contrario, y el dato se copia al registro.
Evidentemente, no es necesario eliminar el dato de la Pila, aunque lo normal es que dichos
datos (normalmente innecesarios) queden expuestos, ya que sern sobreescritos por cualquier
nuevo valor que se guarde en pila. Veamos el comportamiento de la instruccin POP R5 segn
los 4 criterios de diseo para la Pila en la que SP=18:
Ampliacin: Como curiosidad, el registro de propsito general de 32 bits EAX de los modernos
procesadores de Intel recibe el nombre del registro RPG de 16 bits AX del i8086, y este a su vez
del registro A de 8 bits de los procesadores i8080 e i8008, que a su vez provienen del registro
Acumulador de 4 bits del procesador i4004.
En el ejemplo, el registro TMP existe realmente dentro de la CPU, pero sin embargo, el juego
de instrucciones no permite usar dicho registro ni como operando fuente o destino, aunque
sea implcitamente.
Aunque el registro PC tampoco es accesible explcitamente por el nivel ISA, eso no lo convierte
en registro temporal por su propsito especfico.
Registros Arquitecturales y Fsicos
En los computadores ms modernos, los registros fsicos de la CPU no tienen
preasignado un identificador (como R8 o EAX) para que sean accedidos por
las instrucciones, sino que dicha asignacin se efecta dinmicamente durante
un programa, e incluso puede cambiar varias veces a lo largo del programa. As
podemos distinguir entre los registros arquitecturales y fsicos. Los
arquitecturales son aquellos que referencia el juego de instrucciones. Para
entendernos, son los registros que el programador cree que tiene la CPU. Los
registros fsicos son los que realmente tiene la CPU, y por supuesto, debe
haber ms registros fsicos que arquitecturales.
Banco de registros
As, sobre los bancos de registros se pueden realizar operaciones de lectura o escritura. En una
operacin de lectura, es necesario:
1 Seleccionar qu registro del banco se desea consultar. Para ello se utiliza un bus de
seleccin de registro cuyo tamao depende logartmicamente del nmero de
registros.
2 Obtener el contenido del registro seleccionado, a travs de un bus o puerto de
salida. El ancho del bus coincide con el ancho de los registros del banco.
Puertos
Los puertos son los buses a travs de los cuales entran y salen datos al banco
de registro. En los procesadores RISC ms avanzados, cada puerto tiene su
propio bus de direcciones, permitiendo por ejemplo hacer una lectura en el
banco y una escritura, en el mismo ciclo de reloj.
En la figura se muestra un banco de registros en el que se realiza una operacin de lectura del
registro 4 (se introduce el valor 100 en el bus de seleccin) para obtener su contenido (E).
En una operacin de escritura, el registro seleccionado por el bus ser modificado por el valor
que se suministra a travs del puerto de escritura. El tamao del puerto de escritura es el
mismo que el de los registros que contiene el banco.
Algunos aspectos se deben tener en cuenta cuando hay varios puertos de lectura o escritura.
La Unidad Aritmtico-Lgica
La ALU es la parte de la CPU encargada de ejecutar las operaciones aritmticas o lgicas que
sean requeridas durante la ejecucin de una instruccin.
LA ALU normalmente tiene dos buses de entrada A y B (permitiendo as tanto las operaciones
unarias como binarias) y un bus de salida ALU a travs del cual se obtiene el resultado. Al igual
que los registros, el bus de salida tiene el mismo nombre que el dispositivo en s. Adems,
podemos considerar que la ALU tiene algunas seales de control a travs de las cuales
podemos cambiar el modo de trabajo del dispositivo. Veamos algunos ejemplos:
La ALU del computador 1 tiene una seal de control s-r
o Si sr=1, la ALU suma A+B, y si sr=0, la ALU resta A-B
La ALU del computador 2 tiene dos seales de control c1 y c0
o Si c1,c0=0,0 la ALU calcula A+B
o Si c1,c0=0,1 la ALU calcula A-B
o Si c1,c0=1,0 la ALU calcula la operacin unaria ALU=1/B
o Si c1,c0=1,1 se calcula ALU= AB
La ALU del computador 3 tiene 3 seales de control A-L,c1,c0
o Si A-L=1, la ALU funciona como el computador aritmtico 2
o Si A-L=0, la ALU ejecuta 4 operaciones lgicas:
c1,c0=0,0, entonces ALU= A or B
c1,c0=0,1, entonces ALU= A and B
c1,c0=1,0, entonces ALU= not B
c1,c0=1,1, entonces se ejecuta A xor B
Nota 2: En algunos casos, los registros, como PC, no necesitan utilizar la ALU para realizar
operaciones de incremento o decremento, sino que pueden hacerlo de forma autnoma. Esto
es muy habitual en los registros contadores como PC y SP, ya que permite aumentar el grado
de paralelismo a nivel de instruccin. Otra opcin es utilizar sumadores especficos.
OP Nemo. Operacin
000 ADD ALU = A+B
001 SUB ALU = A-B
010 AND ALU = A AND B
011 OR ALU = A OR B
100 SLT IF (A < B) ALU = 1 else ALU = 0
101 SRL ALU = 0,A[31:1]
110 SLL ALU = A[30:0],0
111 SRA ALU = A[31],A[31:1]
Notacin: A[31]es el bit 31 del bus A. A[30:0] son los bits de 30 a 0 de un bus. Mayor ndice es
ms significativo. El operador coma indica unin de buses. As, A[30:0],0 es multiplicacin por
dos y A[31],A[31:1] es divisin mediante desplazamiento aritmtico a la derecha.
Temporizacin de la ALU
Fsicamente, los dispositivos combinacionales como la ALU no son tan perfectos como para
realizar la operacin instantneamente, sino que van a tardar un cierto tiempo en responder a
los estmulos de entrada, debido a que las ondas electromagnticas tardan su tiempo en
propagarse.
Aunque para la escala micromtrica de las ALUs estos tiempos de propagacin podran
considerarse ridculos (picosegundos), a frecuencias espectaculares (gigahercios) pueden
suponer un porcentaje elevado de la duracin del perodo (dcimas de nanosegundos), y sern
un aspecto importante en la temporizacin del ciclo de instruccin, como se ver en el
siguiente apartado.
En una primera parte, el computador se encarga de buscar una instruccin en memoria. Como
la unidad de control an desconoce los bits que forman el OpCode de la instruccin, tampoco
sabe qu pasos debe tomar para ejecutarla, por lo que todas las operaciones de esta fase son
idnticas, sea cual sea el tipo de instruccin. En esta etapa siempre se realizan dos tareas:
Aunque esta etapa cambia mucho de una instruccin a otra, y tambin dependen (en una
misma instruccin), del modo de direccionamiento de los operandos, se puede considerar que
en general, las tareas que se realizan son:
Bsqueda de operandos
Ejecucin
Almacenamiento de resultados
Microoperaciones
Se conocen as a todas estas operaciones atmicas en las que hemos dividido el ciclo de
instruccin en el apartado anterior. En el nivel que empleamos en estos apuntes para el
estudio del computador, el trmino atmico implica que sera necesario recurrir a la
microelectrnica para dividir temporalmente las operaciones descritas, o que debemos
considerar qu sucede con cada bit, o cada puerta lgica, dentro de cada microoperacin.
Con el nivel de detalle de estos apuntes, una microoperacin tpica puede ser una copia de un
registro a otro, un ciclo de memoria, una operacin de ALU, o el incremento de un registro
contador.
Temporizacin
Las dos operaciones son simultneas. Es decir, a lo largo de un ciclo de reloj, lo
que se encuentra en el lado derecho de ambas expresiones se va
elaborando. Al final del ciclo, simultneamente, se modifican los registros en
lado izquierdo. Al ser estrictamente simultnea la carga, es imposible que el
nuevo valor de PC afecte a la instruccin buscada.
Envo de los bits de opcode a la Unidad de Control. La Unidad de Control (un circuito
combinacional simple) genera las seales de control apropiadas.
En la primera parte del tema hemos presentado los ladrillos con los que se construye un
computador (seccin 1.1), y los hemos encajado en el interior del mismo (seccin 1.2) y hemos
descrito, de forma genrica el modo de trabajo (1.3). En esta segunda parte del tema
disearemos un procesador concreto, basado en la arquitectura MIPS.
Monociclo
Este trmino hace referencia a que el ciclo de Instruccin del computador
diseado se completa en un solo ciclo de reloj. Esto significa que todos los
elementos de almacenamiento del procesador (PC, flags, registros del banco y
memoria) slo se modifican una vez, al final del ciclo de instruccin. No son
necesarios almacenamientos intermedios, como el registro de instrucciones, o
registros temporales. Es ms simple y rpido que un procesador multiciclo,
aunque tiene inconvenientes que sern analizados ms adelante.
Arquitectura Harvard
El uso de dos memorias separadas, una para instrucciones y otra para datos, se
conoce como Arquitectura Harvard, diferencindola de la Arquitectura Von
Neumann, que utiliza una sola memoria. Este tipo de diseo hace que el
circuito tenga menos complejidad hacindolo por tanto ms comprensible.
Ambas arquitecturas son completamente compatibles:
El resto del diseo lo vamos a implementar partiendo de una propuesta para un tipo de
instruccin (OpALU), y mediante retoques, conseguiremos que sea capaz de ejecutar las
siete restantes:
Los bits de funcin estn descritos en el manual de referencia de los procesadores MIPS:
Para ejecutar la instruccin conectaremos los bits que contienen los nombres del bus de
instruccin IB (RF1, bits 25 a 21 y RF2, bits 20 a 16) con los buses de direccin del banco de
registro. Inmediatamente despus, aparecen en los puertos de lectura del banco (A y B) sus
contenidos.
Conectamos los puertos A y B con la entrada de una ALU, que ejecuta 8 operaciones, descritas
en la tabla de la seccin 1.2.
Por ahora, dejaremos que sea la Unidad de Control la que determine la operacin que se va a
realizar en la ALU (aunque, obviamente, vendr determinado por el campo funcin).
Finalmente, conectamos el nombre del registro destino en el bus IB (15 a 11) con la direccin
del puerto de escritura DC del banco de registros, y la salida de la ALU con el propio puerto de
escritura C.
Tambin tiene que decidir qu operacin realiza la ALU, utilizando los bits de funcin (Tema 4).
Hay tres aspectos importantes que la diferencian de la instruccin ALU en la seccin anterior:
Y adems hay que tener en cuenta otros aspectos adicionales que afectan al diseo:
La operacin que ejecuta la ALU es, forzosamente, una suma (antes podan ser otras
operaciones, como resta o AND)
El segundo operando de la ALU tiene 16 bits. Hay que convertirlo en un nmero de 32
bits. Antes de enviarlo a la ALU.
Para poder aceptar esta nueva instruccin, es necesario realizar ajustes en el hardware:
En primer lugar se sita un multiplexor delante de la entrada inferior de la ALU. De esa
forma podemos elegir el segundo operando, que puede ser el contenido del puerto B
del banco (control del MUX a cero), o el operando inmediato (MUX a 1). Este
multiplexor lo denominaremos FB (Fuente de B)
La direccin del puerto de escritura tambin es controlada por un segundo MUX en el
que decidimos qu campo de 5 bits contiene el nombre del registro destino. Sin la
instruccin es de tipo R, son los bits IB15 a IB10 (MUX a 1). Si la instruccin es de tipo I
(como ADDI), son los bits IB20 a IB16 (MUX a 0). Este multiplexor lo denominamos FDC
(Fuente para DC).
Modificamos la ALU. Ahora tiene tres bits de control (OpALU) en los que se puede
forzar una operacin:
o 000 fuerza suma en ALU
o 001 fuerza resta en ALU
o 011 fuerza OR en ALU
o 111 operacin en ALU determinada por IB[5:0]
Convertimos los 16 bits de desplazamiento IB16 a IB0, en 32 bits. Para ello creamos un
bus de 16 bits que replica 16 veces el bit IB15 y lo unimos al desplazamiento. De esa
forma, creamos un dispositivo de extensin del signo, que mantiene el mismo
desplazamiento, pero con ms bits.
La operacin de ALU es una OR, por lo que los bits de control que llegan a la ALU deben ser
diferentes. Ninguna modificacin a la va de datos es necesaria. Slo afecta a la Unidad de
Control.
Pero una vez hecha la suma, el resultado, la direccin efectiva, (en la salida de la ALU) se enva
a la memoria de datos, conectndola a su bus de direcciones.
En la instruccin LW, la memoria se utiliza en modo lectura (es decir, queremos traer un dato
de la memoria a un registro de la CPU) por lo que el bus de datos de la memoria debe
reconducirse al banco de registro.
Sin embargo, necesitamos aadir otro puerto de escritura al banco de registro, o lo que es ms
fcil, agregar un MUX al que ya existe. De esta forma, lo que se almacena en el banco de
registros se controla con el MUX:
Un detalle: el camino que realizan los datos en la instruccin LW es el ms largo de todas las
del juego de instrucciones. Por esta razn, en el procesador monociclo, el ciclo de reloj vendr
determinado por el tiempo mximo que puede tardar una instruccin LW. Si el ciclo de reloj
fuera ms corto, no todos los dispositivos haran su trabajo a tiempo y el resultado sera
errneo.
La principal diferencia respecto al circuito anterior afecta slo al control: Es necesario enviar la
seal write (escritura), a la memoria de datos.
La segunda diferencia es la necesidad de enviar un dato del banco de registro al bus de datos
de escritura de la memoria. Pero afortunadamente ese dato est presente en el puerto B
(desde el primer boceto del procesador, con las instrucciones ALU). Slo debemos bifurcar el
bus, como aparece (en rojo) en la figura:
Observe que esta es la nica instruccin (hasta el momento) que no modifica ningn registro
del banco. Los dos registros se utilizan en modo consulta. Como curiosidad, el registro cuyo
contenido se enva a memoria se denomina destino SW rd,desp.(rf) : MEM[rf+desp] rd, a
pesar de que es una fuente (origen de informacin). Esto se hace as por simple coherencia con
el resto de instrucciones con el formato I
Ejecucin de instrucciones LUI (opcode 101111)
Esta instruccin almacena una constante (que aparece como argumento inmediato, de 16 bits,
en la instruccin, en los 16 bits ms significativos del registro destino rd. Los menos
significativos se ponen a cero: rd constante,0..0
En primer lugar, el campo Rf (bits IB25 a IB21) deben ser cero (esta es una tarea del
compilador, o del programador en lenguaje mquina).
En segundo lugar, se fuerza una suma en la ALU con el operando inmediato (a
cualquier valor que se le sume el registro $0, presente en el puerto A del banco de
registro, quedara inalterado).
En tercer lugar, y esta es la nica modificacin del hardware, la extensin del signo se
realiza agregando 16 ceros en la parte menos significativa.
Gracias a esta instruccin, las estructuras de control en los lenguajes de alto nivel (if-then-else,
while, do-while, for) son posibles.
Si la instruccin est en PC=140h el destino del salto es 140h+4+9Ch =1D0 h (9Ch ==10011100 2)
El alumno debe observar que la condicin no es si el registro 1 es igual al registro 3 (es obvio
que no lo son), sino que el contenido de los registros 1 y 3 es diferentes. La misma instruccin
puede aparecer dos veces en un programa, y a veces salta y otras no. Depende de lo que
contengan los registros.
Es posible incluso que sea la misma instruccin la que se ejecuta (en el mismo lugar del cdigo,
con el mismo PC) (gracias a los saltos hacia atrs, esto es posible), siendo su comportamiento
diferente de una vez a otra, ya que los registros cambian.
1
Un camino de datos de mucha longitud obliga a reducir la frecuencia para que el ciclo de reloj sea
suficientemente extenso y que todas las seales atraviesen el circuito completamente. Aadir un
sumador tiene, por su parte, un coste en transistores que se amortiza con la mayor densidad de
integracin de los procesadores actuales.
MIPS propone dos soluciones. La primera es JR (del ingls jump register) (salto indirecto
mediante registro). Esta no la consideraremos por ahora (tal vez, en el examen?). Con ella
pondramos en el PC un valor absoluto cualquiera, de 32 bits, que permitira llegar hasta 4G
direcciones.
La segunda propuesta es J (del ingls jump) que no llegar tan lejos, pero s lo suficiente:
J dir : PC (PC+4)[31:28],dir,00
Observe que el destino del salto no es relativo al PC, pero si es relativo al segmento de
memoria de la instruccin. Se calcula:
Conservando los 4 bits ms significativos del PC. Esta tcnica permite que el salto sea
relativo al inicio segmento de 256MB en el que se encuentra la instruccin. (La
memoria de 4GB se divide en 16 segmentos iguales y contiguos)
El desplazamiento de 26 bits se multiplica por 4 (utiliza dos bits implcitos) y se
convierte en un nmero natural de 28bits que se suma al inicio del segmento.
En el circuito necesitamos agregar un nuevo candidato para futuro PC, ampliando el MUX FPC:
Observe cmo se construye el destino del salto, mediante la recuperacin del bit implcito en
el desplazamiento, y la concatenacin de dos buses, de 4 y 28 bits.
En esta seccin veremos con ms detalle cmo se prepara el PC antes de cada instruccin para
que un cdigo complejo se ejecute en el computador.
Secuenciamiento implcito
Como para un programador, la forma natural de escribir las instrucciones es en el mismo
orden de ejecucin, lo ms frecuente en los cdigos es que tras una determinada instruccin,
la que se ejecute a continuacin sea la que le sigue en memoria. Por esta razn, lo ms
frecuente en los computadores es que el Contador de Programa se actualice siempre de forma
automtica apuntando a la siguiente posicin de memoria: PC PC +1. En realidad, esto no es
estrictamente correcto, ya que es poco frecuente que una instruccin ocupe una sola palabra
de memoria, por lo que en general, la frmula es:
Rutinas
A veces, un mismo trozo de cdigo R conviene que sea ejecutado varias veces y en puntos
distintos de un mismo programa P (por ejemplo, el clculo de un factorial para averiguar un
nmero de permutaciones). Ingenuamente se puede pensar que es posible, simplemente,
saltar a ese trozo de cdigo R cada vez que sea necesario en distintos puntos de P, pero qu
hacemos tras finalizar R?, a qu lugar de P volvemos?
A estos trozos de cdigo se les llama rutinas, y el salto a rutina (tambin se usan los verbos
llamar o invocar) proporciona un modo de secuenciamiento adecuado a nuestras necesidades.
Consiste simplemente en guardar en lugar seguro el valor que debera tener PC al final de la
rutina B:
De esa forma, para retomar el programa P en el punto deseado, nos bastara con almacenar en
PC la copia de seguridad realizada. La ltima instruccin de la rutina (o retorno de rutina) debe
ser:
Interrupciones
Las interrupciones son en realidad llamadas a rutinas, con dos diferencias:
Ejercicio 1
El computador MIPS no dispone de instrucciones CALL y RET para llamar a una rutina y volver
al cdigo principal. En cambio, dispone de otras instrucciones como JR RG (salto a una direccin
almacenada en un registro), ADDI (Suma de registro con operando inmediato) , LW, SW, y
sobre todo JAL dest (Salto a una direccin relativa a PC, guardando PC+4 en el registro R31). Se
pide el cdigo necesario para llamar a una rutina en el MIPS, emulando, si es necesario, a las
instrucciones CALL y RET.
Si dentro de la rutina se llamara a una subrutina sin las precauciones adecuadas, perderamos
el contenido de R31, y la capacidad para retomar el cdigo principal. Para resolver este
inconveniente, podemos hacer una copia de seguridad del R31 en un registro adicional (p.e., el
registro R30), y restaurarla antes de abandona la rutina:
Siguiendo el procedimiento anterior, podramos utilizar el registro R29 para guardar copia de
seguridad de R30, y proceder as recursivamente mientras sea necesario, y mientras no
agotemos los registros disponibles. El alumno puede observar que estaramos usando el banco
de registros para almacenar una lista de direcciones de retorno anidadas, pero se da la
circunstancia de que dicha lista tendra una capacidad muy limitada (30, como mucho). Por
qu no usar la memoria, cuya capacidad es prcticamente ilimitada? Ahora, en lugar de usar el
R30 (y sucesivos) como almacn de copias de seguridad, se puede usar un registro (por
ejemplo R29) como puntero al almacn de copias de seguridad (pila).
Bsicamente, al iniciar cualquier rutina, copiamos el registro R31 a la memoria, y dejndolo
libre para una instruccin JAL. (El lugar de la memoria est establecido previamente (direccin
de inicio de la pila), y su valor se almacena en el registro R29). Tras la copia en memoria,
cambiamos el valor del puntero de pila R29, para que, en caso de que necesitemos guardar
otra direccin de retorno en la pila, no machaque al anterior. Cuando termine la rutina,
restablecemos el valor del puntero, y despus restablecemos el valor del R31, dejndolo listo
para volver al programa principal con JR R31. La nica limitacin es la zona de memoria que
reservemos para ir almacenando direcciones de retorno. Si no se tiene cuidado, tenemos el
riesgo de provocar un fallo en el cdigo de nombre muy conocido (y demasiado frecuente):
Stack Overflow.
4 Temporizacin de la instruccin
Veamos algunos aspectos temporales del procesador monociclo que hemos diseado. Es
bueno que recordemos en este momento que las seales no se propagan a velocidades
infinitas. El siguiente esquema describe el procesador monociclo. Consideremos el tiempo t=0
en el inicio del ciclo de instruccin. Los elementos de almacenamiento (PC, registros y
memorias) tienen un valor determinado por el ciclo de instruccin anterior. Se conoce como
estado del computador. Dicho estado es utilizado por los dispositivos combinacionales (que
no son infinitamente rpidos) para preparar un nuevo estado.
Slo al final del ciclo, en tiempo t=T, se modifica el estado, almacenando todos los datos que
sean necesarios. El tiempo T se debe calcular en funcin de los retrasos de la siguiente forma:
En t=tspc + tmemI+ tdec las seales de control estn disponibles. Los contenidos de dos
registros estn presentes en los puertos A y B, el desplazamiento se ha extendido, y en su caso,
se le han aadido los dos bits implcitos. tdec es el tiempo del ms lento de los circuitos
implicados, ya que trabajan en paralelo. Posiblemente sea el banco de registros.
En t=tspc + tmemI+ tdec+ talu las dos ALUs han realizado sus clculos, y estn disponibles los
posibles destinos de salto, el flag y la direccin efectiva de memoria. talu es el tiempo de la
ALU ms lenta (la ms compleja), al que se le aaden los retrasos que tiene el MUX en su
entrada.
En t=tspc + tmemI+ tdec+ talu +tmemD disponemos (en caso de la instruccin LW) de un dato
de la memoria, que queremos guardar en un registro.
Finalmente en t=tspc + tmemI+ tdec+ talu +tmemD +twrite podemos garantizar que los datos
que se encuentran en las entradas de los circuitos secuenciales (PC, el banco de registro y la
memoria de datos (en la instruccin SW)) podran ser almacenados correctamente, cuando
llegue el siguiente flanco de bajada del reloj que marca el final del ciclo.
Es obvio que si la llegada del flanco fuera antes de tiempo, en la ms lenta de las instrucciones,
es decir, en aquella que tiene un recorrido ms largo (LW), no podramos garantizar que la
informacin que se almacene sea correcta. De hecho, deberamos, adems, darle un margen
de seguridad al ciclo de reloj:
El procesador multiciclo
La primera alternativa que proponemos consiste en completar el ciclo de instruccin en varios
ciclos de reloj, aumentando la frecuencia del mismo. Evidentemente, para sacar verdadero
provecho, el nmero de ciclos de reloj debe ser variable. As, instrucciones ms cortas, como
NOP y J, podran completarse en un par de ciclos de reloj. Las ms largas podran requerir
cinco, seis, o incluso ms.
En el ejemplo, hemos dividido la va de datos en tres etapas. Imagine que en la primera etapa
hemos ledo y decodificado la instruccin. Podramos incluir registros intermedios para crear
un estado en el que se almacena la instruccin (IR) y el valor PC+4 (registro NPC). La memoria,
que habamos usado para buscar la instruccin, queda liberada, y podra utilizarse para buscar
un dato en la instruccin LW. Antes, esto no era posible, porque hubiramos perdido el
contenido del bus IB, que era necesario durante todo el ciclo del procesador monociclo.
En la figura, hemos aadido varios registros intermedios para poder convertir el MIPS en un
verdadero procesador multiciclo de cinco etapas:
Con este diseo, instrucciones como NOP y J se ejecutaran en dos ciclos, ADDI en tres ciclos,
SW en 4 ciclos, y LW en 5 ciclos.
Las etapas tienen que estar equilibradas. Si una etapa tiene demasiada carga de
trabajo, determinar una frecuencia baja que castigar a las etapas ms ligeras. El que
disea el procesador tiene en muchos casos la libertad de pasar un MUX o un sumador
de una etapa a otra para intentar equilibrarlas y mejorar la frecuencia.
Los registros intermedios suponen la inclusin de nuevos retrasos no considerados en
el clculo del perodo del procesador monociclo. Por esta razn las instrucciones ms
lentas, como LW, son ahora an ms lentas. No obstante, esta ligera penalizacin
queda sobradamente compensada con el beneficio en otras instrucciones.
Procesadores segmentados
Compare el ciclo de instruccin multiciclo con la cadena de montaje de un coche. Cada T horas,
el coche avanza a la siguiente etapa. En la primera se monta el chasis, en la segunda el motor,
en la tercera la carrocera, y as hasta las ltimas etapas de pintura, secado, montaje de
asientos, y elementos exteriores. Recuerde que el tiempo T viene determinado por la etapa
ms lenta (por ejemplo, la de secado de pintura).
Cuando un vehculo abandona la primera etapa para pasar a la segunda, la primera queda
liberada, por lo que normalmente se aprovecha para comenzar el montaje de otro vehculo. El
resultado final es que, con el montaje en cadena, se fabrica un vehculo en 20T horas
(considerando 20 etapas), y sin embargo cada T horas finaliza la fabricacin de un vehculo. En
definitiva, el montaje en cadena (o segmentado) es 20 veces ms rpido que un montaje
secuencial.
Por qu no hacer lo mismo con las instrucciones? Los procesadores modernos utilizan la
tcnica de la segmentacin en los procesadores multiciclo para finalizar una instruccin por
ciclo de reloj, permitiendo que nuevas instrucciones entren en la va de datos sin que las
instrucciones que ya estaban la hayan abandonado. Gracias a ello, podramos finalizar una
instruccin por ciclo de reloj y el procesador sera mucho ms rpido.
Para conseguir eso, es necesario hacer ligeras modificaciones tanto a la Va de Datos como a la
Unidad de Control. Adems, todas las instrucciones tendran que pasar por todas las etapas del
procesador multiciclo (aunque no realicen ninguna accin), ya que saltarse una etapa
supondra la colisin con instrucciones que se iniciaron antes.