Está en la página 1de 9

Un microprocesador RISC hecho en casa

Nicols Majorel Padilla y Ernesto Jos Sale

Resumen
El siguiente trabajo tiene un perfil doble: por un lado, es el diseo de un
microprocesador RISC de 32 bits; por el otro, es una investigacin sobre el uso de Verilog HDL
para la descripcin y simulacin del diseo.
La finalidad del trabajo tambin es doble: sienta una base para otros proyectos sobre
microprocesadores; y adems sirve para tener una idea de la utilidad de Verilog HDL as como
del tiempo necesario para aprender a manejarlo, con vistas a la inclusin de un mdulo
dedicado a este lenguaje en una asignatura, Arquitectura de Computadoras.
Este artculo presenta las principales fases de un trabajo mayor realizado por los
autores, en las que se destaca principalmente el procedimiento seguido y los resultados ms
importantes.
Palabras clave: Microprocesador, RISC, Arquitectura de Computadoras, Diseo digital,
Pipelining, Verilog, HDL, Simulacin.

Abstract
The present paper features a double profile: on one hand, it is the design of a 32-bit
RISC microprocessor; on the other hand, its a research about the advantages of using a
Hardware Description Language (HDL) such as Verilog for describing and simulating the
design, as well as about the time that should be employed in order to learn how to use the
language, heading towards the addition of a Verilog module in the Computer Architecture
subjects curriculum.
On the following pages, it will be found only a fraction of the whole work done by the
authors, in which the main purpose is to highlight the procedures followed and the results
obtained instead of the details and implementation.
After the tests it remained clear that Verilog HDL is a very powerful tool which use imply
enormous improvement in the productivity of the hardware designers, for it greatly reduces the
time needed for description and simulation. Finally its stated that it would be very useful for the
Computer Architecture students to learn how to use this tools in order to be better trained to
face the competitive world beyond the University.
Keywords: Microprocessor, RISC, Computer Architecture, Digital Design, Pipelining, Verilog,
HDL, Simulation.

Introduccin
Este artculo presenta tanto un trabajo de diseo realizado por los autores, como as
tambin una investigacin sobre la utilizacin de un lenguaje de descripcin de hardware
(Verilog HDL) y sobre una herramienta de simulacin en el diseo digital, concretamente, de
microprocesadores. La herramienta utilizada para la simulacin ser SynaptiCAD Verilogger
Pro 7.5, en una versin de evaluacin.
Esta investigacin tiene dos finalidades principales. En primer lugar, servir para tener
una idea precisa del tiempo necesario para aprender a usar tanto el lenguaje como la
herramienta, la practicidad de stos y su valor didctico. Esto influir posiblemente en la
estructura de la asignatura Arquitectura de Computadoras (asignatura obligatoria de la carrera
de Ingeniera en Computacin de la Facultad de Ciencias Exactas y Tecnologa de la
Universidad Nacional de Tucumn), insertndose un mdulo dedicado a Verilog, como muchas
de las universidades del mundo de hecho lo tienen. En segundo lugar, podra constituir la base
de diversos proyectos de investigacin multidisciplinarios de mayor escala, como as tambin
de trabajos de graduacin.
El trabajo se realiz en 3 etapas, a saber: 1) Diseo del Set de Instrucciones a utilizar;
2) Diseo de un microprocesador uniciclo; y 3) Diseo de un microprocesador segmentado. El
motivo para realizar 2 diseos de microprocesadores consiste en tener una idea ms concreta
sobre cmo influye la complejidad del hardware sobre la descripcin y la evaluacin de
resultados.

Antes de comenzar con el desarrollo del trabajo en s, consideramos oportuno realizar


una muy breve introduccin a los principios de diseo RISC, en los cuales est basado el resto
del trabajo.
Introduccin a RISC
RISC es el acrnimo de Reduced Instruction Set Computer, esto es, una computadora
con un conjunto de instrucciones reducido si lo comparamos con las mquinas CISC (Complex
Instruction Set Computer), que son computadoras con un conjunto de instrucciones complejo.
Cada uno de estos tipos responden a una filosofa diferente de Arquitectura de Computadoras.
La filosofa RISC trata de concentrar los recursos en la ejecucin de las instrucciones ms
usadas. Podemos resumir los principios de diseo de las mquinas RISC en:
1. Analizar las aplicaciones para encontrar las operaciones clave.
2. Disear una trayectoria de datos que sea ptima para las operaciones clave.
3. Disear instrucciones que realicen las operaciones clave utilizando la trayectoria de
datos.
4. Agregar nuevas instrucciones slo si no hacen ms lenta a la mquina.
5. Repetir este proceso para otros recursos.
Seguiremos la filosofa de diseo RISC porque su simplicidad derivada de la filosofa
de diseo hace que se consiga muy buen rendimiento con pocos recursos, y por lo tanto, con
eficiencia.
Arquitectura del Set de Instrucciones (ISA)
Las instrucciones de un microprocesador constituyen el lenguaje por medio del cual el
programador le indica qu hacer. Adems, puesto que en definitiva definen lo que el
procesador es capaz de hacer en un ciclo de instruccin, constituyen el primer paso de diseo.
Por ello es fundamental tener mucho cuidado en esta etapa. Un error en el diseo del set de
instrucciones puede complicar extremadamente el diseo del hardware.
Basndonos en diversas investigaciones realizadas [1], definimos el ISA de la
siguiente manera:

Todas las instrucciones tendrn la misma longitud, 32 bits.

Ser del tipo Load/Store, indicando con esto que slo dos instrucciones podrn
acceder a memoria.

Contar con slo tres modos de direccionamiento: indexado (con desplazamiento


constante de 16 bits con signo), de registros y relativo al PC (usado en las
instrucciones de salto). Adicionalmente, se pueden obtener el modo de
direccionamiento directo y el indirecto por registros como casos particulares del
modo indexado.

Utilizar tres formatos de instruccin diferentes (los cuales pueden observarse en


la Figura 1), con pequeas variaciones en casos particulares.

Se contar con cinco tipos o clases de instrucciones: instrucciones de


transferencia desde o hacia memoria (Load y Store), instrucciones aritmticas y
lgicas (ADD, OR, MUL, etc), instrucciones de desplazamiento (Shift Left, etc.),
instrucciones de saltos (JP y JPC) e instrucciones de control y de propsito
general (NOP, HALT, etc). La cantidad total de instrucciones es 31.
Formato 1:

OPCODE
6

rd

ro

desp

R1

R2

R3

16

Formato 2:
OPCODE
6
Formato 3:

Reservado
11

OPCODE

Desp

24

Figura 1. Formatos de Instruccin.

Los dos tipos de salto, tanto los condicionales (JPC) como los incondicionales (JP),
sern relativos al PC (Program Counter), utilizando un desplazamiento de 24 bits con signo.
Los saltos condicionales utilizan cdigos de condicin, siendo las condiciones evaluadas: cero,
negativo, carry y una bandera adicional. Estas instrucciones utilizan el Formato 3 de la Figura
1, donde pueden observarse dos bits a continuacin del OPCODE destinados a los cdigos de
condicin, y luego el desplazamiento.
Se tomaron 6 bits para el cdigo de operacin (OPCODE) de las instrucciones por dos
motivos principales: 1) Para facilitar una posterior ampliacin del set de instrucciones; y 2) Para
establecer (ms adelante) dos modos de operacin del microprocesador, un modo protegido y
un modo usuario, diferenciando las instrucciones pertenecientes a cada modo por su cdigo de
operacin.
El microprocesador Uniciclo
Llamamos uniciclo a un microprocesador en el que todas las instrucciones se ejecutan
en un nico ciclo de reloj. El motivo para comenzar el diseo de hardware con este procesador
es similar al motivo por el cual elegimos RISC: porque es simple, y esa simplicidad nos
permitir ir de menor a mayor, de una manera modular y ms ordenada, sirviendo de base para
el diseo de un microprocesador segmentado que se presenta ms adelante.
Para el diseo de un camino de datos se decidi, para simplificar, tomar un
subconjunto del set de instrucciones, centrando la atencin en los aspectos principales del
mismo. El subconjunto de instrucciones est formado por las instrucciones LDIN (Load
Indexado), STIN (Store Indexado), ADIL (Suma Inmediata), ADD (Suma), SLA (Desplazamiento
Aritmtico hacia la Izquierda) y JPC (Salto Condicional). El microprocesador posee una
arquitectura tipo Harvard, o sea que posee una memoria de datos y otra de programa,
independientes entre s, que posibilita un incremento en la performance y es apropiado para el
diseo segmentado posterior. Veamos un poco de la estructura interna de nuestro
microprocesador.
El microprocesador presenta un banco de registros compuesto por 32 registros de
propsito general de 32 bits cada uno, que posee dos puertos de lectura y un puerto de
escritura. Este banco de registros permite leer y escribir el mismo registro en el mismo ciclo de
reloj. Adems tiene la caracterstica de que el valor del registro 0 es siempre cero. El
microprocesador tambin cuenta con cuatro registros de propsito especfico, todos de 32 bits:
el registro PC (Program Counter, un puntero a la memoria de programa que indica la
instruccin que est siendo cargada actualmente), el Registro de Instruccin (IR, recibe la
instruccin de la memoria de programa para su decodificacin), y dos registros ms para
acceder a la Memoria de Datos el MAR (para indicar la direccin) y el MDR (para leer o escribir
los datos). Tambin posee una ALU (Arithmetic and Logical Unit) de dos entradas de datos y
una salida, todas de 32 bits, que es capaz de realizar (para este subconjunto de instrucciones)
las operaciones de suma, desplazamiento a la izquierda y que permite la opcin de mantener el
resultado sin modificar los flags por ms que varen sus entradas.
Adicionalmente, el microprocesador presenta tres bloques adicionales. El bloque
SumPC (Sumador del PC), que tiene por funcin actualizar el PC con la suma del PC ms 1 o
ms el valor del salto, segn corresponda. La Unidad de saltos compara los cdigos de
condicin y emite una seal de control hacia el Sumador del PC, indicando si un salto debe
realizarse o no. El bloque denominado SUAT (Sistema nico de Aritmtica Translatoria) se
encarga de conformar el dato correspondiente al campo inmediato de las instrucciones de
Formato 1 (ver Figura 1) que ingresar en la ALU. Por ltimo, se cuenta con diversos
multiplexores necesarios para el correcto funcionamiento de todas las instrucciones. Para
mayores detalles, consultar [2].
En nuestro diseo estamos considerando que la velocidad de la memoria es del orden
de la velocidad del microprocesador porque el objetivo del proyecto nos lo permite. Sin
embargo, hay que tener en mente que esto est muy alejado de la realidad. Los accesos a
memoria son muy costosos en tiempo, y degradan notablemente la performance de un
microprocesador. Lo que nosotros vemos como memoria en este diseo sera en realidad un
cach en un diseo ms avanzado.
Introduccin a Verilog HDL
Verilog es un lenguaje de descripcin de hardware (HDL) usado como estndar en la
industria para caracterizar el comportamiento de sistemas digitales. Tales sistemas pueden ser
descritos a un nivel estructural, empleando elementos previamente creados (compuertas o
transistores) y realizando la interconexin de los mismos, o a un nivel de comportamiento (nivel
RTL), describiendo la transferencia de informacin entre registros. Estos dos niveles de
descripcin pueden mezclarse dando lugar a diseos mixtos. En nuestro trabajo usaremos

descripciones a nivel de comportamiento, debido a que lleva a un diseo ms claro y de


comprensin ms sencilla. Un cdigo claro y simple siempre es ms fcil de depurar, mantener
y actualizar.
Verilog es usado principalmente en dos funciones: para la simulacin de sistemas (con
el fin de verificar su correcto funcionamiento, detectar posibles cuellos de botella, etc.) y para la
descripcin de sistemas para su posterior sntesis. Con este nivel de automatizacin, es claro
que Verilog incrementa drsticamente la velocidad del diseo. Su gran uso en la industria se
debe a la simplicidad de su aprendizaje para gente con conocimientos del lenguaje de
programacin C.
Como caractersticas relevantes del lenguaje mencionaremos slo los tipos de
variables ms usados, los tipos de asignaciones, cmo son los procesos y cmo es la
estructura general de un mdulo en Verilog.
En Verilog, un sistema digital est compuesto por la interconexin de un conjunto de
mdulos, cuya estructura genrica es la siguiente:
module <nombre del mdulo> (<seales>);
<declaraciones de seales>
<funcionalidad del mdulo>
endmodule
Cada mdulo dispone de una serie de entradas y salidas a travs de las que se
interconecta con otros mdulos, aunque puede no tener entradas ni salidas. No existen las
variables globales, y fuera de los mdulos slo puede haber directivas del compilador. Los
argumentos del mdulo (las seales) pueden ser de tres tipos: a) input, entradas; b) output,
salidas; y c) inout, bidireccionales. En Verilog los mdulos son tratados de manera diferente a
las subrutinas de otros lenguajes, ya que permanecen ejecutndose (concurrentemente) hasta
que el programa finalice.
Usualmente, al disear, se suele tener un nico mdulo superior que emplea mdulos
previamente definidos. Esto otorga una estructura jerrquica al diseo y es acorde a las
metodologas Top-Down y Divide & Conquer.
Para poder comprobar el correcto funcionamiento de los mdulos creados es necesario
crear otro mdulo de prueba, que consistir en la creacin de un conjunto completo de vectores
de prueba que sern asignados a los puertos de entrada del mdulo, y en la especificacin de
los vectores de salida que se espera encontrar.
Verilog posee numerosos tipos de variables, de los cuales slo mencionaremos los dos
ms utilizados: las variables tipo reg y las variables tipo wire. Las variables tipo wire se utilizan
para interconectar componentes, mientras que las variables tipo reg almacenan valores.
Existen dos maneras de asignar valores: la asignacin continua (assign var=expresin;) y la
asignacin procedural (var=expresin;). En las asignaciones continuas, la variable var debe ser
tipo wire, y las asignaciones continuas deben realizarse fuera de un mdulo. En las
asignaciones procedurales, la variable var debe ser tipo reg, y tales asignaciones deben estar
dentro de un mdulo. Por este motivo suele decirse que las variables tipo wire son variables
dependientes, ya que dependen continuamente de la expresin asignada. Las asignaciones
continuas son tpicamente usadas para modelar circuitos combinacionales, ya que modifican el
valor de la salida cada vez que cambia el valor de las entradas.
Una asignacin procedural puede ser controlada por el cambio de una variable,
denominndose control por evento. Para ello se emplea el caracter @ seguido del evento que
permite la ejecucin de la asignacin procedural. Se distinguen dos tipos de eventos: los
eventos de nivel (por el cambio de valor de una variable) o los eventos de flanco, ya sea
positivo o negativo. Es posible tener condiciones de activacin que dependan de ms de una
variable. Se denomina lista de sensibilidad al conjunto de condiciones que forman el evento.
Por otra parte, se distinguen dos tipos de procesos: los initial, que cuando ejecutan la
ltima lnea dejan de ejecutarse, y los always, que cuando ejecutan la ltima lnea comienzan
de nuevo a ejecutar la primera. Es destacable que ambos tipos de procesos permiten su
ejecucin concurrente.
El control de temporizacin de los procesos en Verilog est basada en unidades de
simulacin discretas. Para cada proceso se calcula el instante en el que debe ejecutarse y se lo
coloca en una cola donde los primeros procesos son los que se deben ejecutar primero. El
simulador saca de una cola todos los procesos que se deban ejecutar en la unidad de tiempo
actual y los ejecuta. Si durante el procesamiento se crean nuevos procesos, stos son
ubicados en la cola en su lugar correspondiente.
Cuando todos los procesos de la unidad de tiempo actual han sido ejecutados, el
simulador avanza una unidad de tiempo y ejecuta los procesos correspondientes. El orden de

ejecucin de los procesos correspondientes a la misma unidad de tiempo es impredecible, por


lo que la depuracin de cdigo no es sencilla.
Adems de los procesos mencionados, Verilog permite un tipo de construcciones
adicional: fork join. De esta manera es posible que, dentro de un mismo proceso, varios subprocesos (threads) se ejecuten concurrentemente. Cuando todos los threads son finalizados, se
ejecuta la sentencia siguiente al join.
Codificacin del Microprocesador Uniciclo
Para una introduccin ms sencilla a la codificacin en Verilog HDL, comenzaremos
describiendo los mdulos que representan circuitos combinacionales, que son ms simples. El
siguiente mdulo representa un multiplexor de 32 bits. Este mdulo posee dos entradas de 32
bits (A y B), una salida de 32 bits (F) y una entrada de seleccin de un bit (Sel).
//// Multiplexor
module Mux(A, B, F, Sel);
input [31:0] A, B;
output [31:0] F;
input Sel;
reg [31:0] Temp;
always @(A or B or Sel)
case (Sel)
0: Temp = A;
1: Temp = B;
endcase
assign F = Temp;
endmodule
//// Fin Multiplexor
El proceso always indica que, cada vez que cambie el valor de alguna de las entradas,
se actualizar el valor del registro temporal dependiendo del valor (en ese instante) de la
entrada de seleccin. A su vez, el proceso assign asigna a la salida el valor del registro
temporal cada vez que cambie ste ltimo.
En el mdulo anterior podemos apreciar algunas de las ventajas de trabajar a nivel
funcional (RTL). Por ejemplo, si necesitamos otro multiplexor, pero con entradas de 5 bits; o si
necesitamos un multiplexor que seleccione una de cuatro entradas; o si quisiramos un
multiplexor que seleccione una de tres entradas y que muestre por defecto un valor
predeterminado, los cambios a realizar son mnimos. En algunos casos, se utiliza
adicionalmente un proceso initial que se encarga de inicializar algunos valores para su
correcto funcionamiento.
La codificacin de los mdulos que representan circuitos secuenciales es un poco ms
compleja que la de los anteriores debido a que presentan una caracterstica que los distingue:
necesitan un reloj que sincronice su funcionamiento. En stos mdulos no podemos permitir
que las salidas se modifiquen cada vez que cambie el valor de alguna entrada, porque
perderamos el valor que se est tratando de almacenar. Por ello se vuelve necesaria la
intervencin de un reloj que sincronice el funcionamiento de los mdulos, haciendo que las
salidas se actualicen en un determinado flanco del reloj.
Posteriormente hay que disear el mdulo superior mencionado anteriormente. En l
se declaran todas las variables utilizadas para la interconexin de componentes, y se
encuentran las instanciaciones a todos los mdulos contenidos dentro del microprocesador.
Nos damos cuenta que, por ltimo, es necesario otro mdulo a un nivel jerrquico an
ms elevado que se encargue de la conexin de los mdulos principales (microprocesador y
memorias), de generar la seal de reloj y de mostrar los resultados de la simulacin.
Introduccin a la segmentacin
La segmentacin (pipelining) es una tcnica que permite solapar la ejecucin de
instrucciones. Esta tcnica se basa en dividir una tarea en pasos o tareas ms simples, llamada
etapas de la segmentacin. Para poder segmentar una tarea es necesario que los recursos que
se utilizan en cada etapa sean independientes. La segmentacin produce que, a partir de un
determinado momento, todas las etapas estn funcionando en paralelo, por lo que no reduce el
tiempo total del proceso sino que aumenta la productividad (throughput). De manera ideal, la
mejora de la segmentacin con respecto a un procesador secuencial es igual al nmero de
etapas en las que se divide el procesador.

En nuestro caso, y basndonos en el diseo del microprocesador uniciclo, podemos


segmentar este microprocesador en cinco etapas, de manera tal que todas tengan la misma
duracin, y que se corresponden con:
1. F (Bsqueda de la Instruccin): en esta etapa se realiza la bsqueda de la
instruccin que se ejecutar. Encontramos en ella la Memoria de Programa, el PC
y el sistema encargado de manejar el PC.
2. D (Decodificacin de la Instruccin): en esta etapa se decodifica la instruccin, y
se realiza la lectura del banco de registros. En ella se encuentra principalmente la
Unidad de Control y el Banco de Registros, adems del bloque SUAT y de un par
de multiplexores.
3. A (Aritmtica): en esta etapa se encuentra la ALU y realiza la ejecucin de las
instrucciones aritmticas o de desplazamiento o se realiza el clculo de la direccin
en el caso de instrucciones que accedan a memoria.
4. M (Acceso a Memoria): en esta etapa se produce el acceso a memoria. Su
componente principal es la Memoria de Datos, y un multiplexor.
5. W (Escritura de Registros): en esta etapa se escribe en el banco de registros si
fuese necesario.
No todas las instrucciones usan las cinco etapas. Por ejemplo, la instruccin LDIN s
usa las cinco etapas, pero la instruccin ADD no usa la etapa cuatro. Esto podra llevar a un
funcionamiento errneo del microprocesador, ya que en algn momento dos instrucciones
intentaran utilizar la misma etapa al mismo tiempo. Por ende, se establece una regla para la
segmentacin: que todas las instrucciones pasen por todas las etapas, aun cuando no utilicen
algunas de ellas.
Es importante destacar que el diseo del ISA es apropiado para un microprocesador
segmentado debido a diversos motivos. En primer lugar, todas las instrucciones poseen la
misma longitud, lo que hace que sea mucho ms fcil su bsqueda y su decodificacin. En
segundo lugar, contamos con pocos formatos de instruccin, con campos situados en idnticas
posiciones para todos los formatos, lo que permite que la etapa de decodificacin sea simple.
En tercer lugar, los operandos de memoria slo aparecen en dos instrucciones, lo que facilita la
separacin entre la etapa aritmtica (donde se calcula la direccin) y la de memoria. Por ltimo,
la transferencia a memoria de un dato se realiza en una sola etapa, lo que tambin facilita su
separacin. Si no contramos con estas caractersticas, seran necesarias etapas adicionales.
Realizacin de la segmentacin
El microprocesador segmentado est basado en nuestro anterior diseo uniciclo. Para
realizar el pasaje de informacin entre las cinco etapas, dispusimos cuatro registros que las
separan. Todos los datos necesarios en la etapa siguiente deben pasar a travs de estos
registros as como las seales de control, puesto que la decodificacin de la instruccin se
hace en una etapa y sus consecuencias deben acompaar a los datos durante todo el ciclo de
la instruccin. En la figura 2 podemos observar un primer esquema completo del procesador.

CONTROL

P
C

Memoria
de
Programa

U
N
O

M
u
x
3

Banco
de
Registros

SUAT

M
D
R

M
u
x
1

D
O
S

ALU
B

T
R
E
S

Memoria
de
Datos

SuPC

Figura 2. Primer esquema del microprocesador segmentado.

M
D
R
M
u
x
2

C
U
A
T
R
O

Riesgos de la Segmentacin
Hay momentos en la segmentacin en los que la siguiente instruccin no se puede
ejecutar en el siguiente ciclo. Estos sucesos se denominan comnmente riesgos (hazards), y
los hay de tres tipos. A continuacin explicaremos los tres tipos de riesgos y la manera en la
que fueron solucionados.
Riesgos Estructurales
Estos riesgos se producen cuando el camino de datos no puede soportar la ejecucin
de una determinada secuencia de instrucciones que se quiere ejecutar durante un mismo ciclo.
En otras palabras, se produce un riesgo estructural cuando dos instrucciones quieren usar la
misma etapa durante el mismo ciclo.
Gracias a un diseo simple desde el primer momento (arquitectura Harvard) y a una
simple regla de segmentacin (que todas las instrucciones usen todas las etapas), no
contamos con este tipo de riesgos en nuestro microprocesador segmentado.
Riesgos de Datos
Estos riesgos se producen cuando una instruccin depende del resultado de una
instruccin previa que todava se encuentra dentro del pipeline. Veamos una situacin
hipottica sencilla para comprender mejor este tipo de riesgo. Supongamos tener 3 lneas de
cdigo como las siguientes:
ADD r1, r2, r3
ADD r4, r1, r2
STIN r4, r1, 10
Estas lneas indican hacer una suma de los valores contenidos en los registros 2 y 3 y
guardarla en el registro 1; posteriormente, sumar en el registro 4 los valores del 1 y del 2, y
finalmente guardar este valor (del registro 4) en la posicin de memoria indicada por la suma
del contenido del registro 1 ms 10.
Si seguimos la ejecucin de estas instrucciones, notamos que al momento de decodificar
la segunda suma, el resultado de la suma anterior (r1) todava no se grab en el banco de
registros, y lo mismo ocurrira con la operacin de escritura en memoria, por lo que con el
hardware disponible hasta el momento, el resultado de esta secuencia de instrucciones sera
desastroso. Por ello fue necesario incluir una Unidad de Adelantamiento en la etapa de
Decodificacin, que contemple todos los casos en los que un dato producido por alguna etapa
sea necesitado antes de estar disponible en el banco de registros. En caso de detectar la
ocurrencia de un riesgo de este tipo, entrega las seales indicadas para que efectivamente se
adelante el valor correcto. El adelantamiento se produce agregando dos multiplexores en las
entradas de la ALU, cuyas entradas provienen de las etapas D (normalmente), A y M.
An as, hay casos en los que resulta imposible adelantar los valores en el pipe, por
ejemplo, consideremos el siguiente ejemplo:
LDIN r1, r2, 10
ADD r3, r1, r2
Aqu estamos indicando al procesador que traiga un dato desde la posicin de memoria
(r2+10) y lo guarde en el registro 1. Luego, la suma necesitar ese valor para realizarse
correctamente. La tcnica de adelantamiento no resuelve este riesgo.
La solucin es insertar un ciclo que haga nada entre ambas instrucciones, o sea
detener el pipeline durante un ciclo llamado burbuja. Esto podra hacerse por software (en
tiempo de compilacin) o por hardware, deteniendo el PC y manejando las seales de control
correspondientes. Esta ltima es la opcin por la cual nos inclinamos, principalmente para
independizar al microprocesador del compilador. Ser necesaria una nueva unidad, a la que
llamaremos Unidad de Insercin de Burbuja, que debe detectar cuando ocurra el riesgo del
ejemplo antes mencionado y detener el pipeline cargando seales de control en el registro Dos
que no realicen escrituras, y evitando que el registro Uno y el PC actualicen sus valores. De
esta manera se consigue una efectiva parada en el pipeline.
Riesgos de Control
Llamaremos salto a toda modificacin del valor del PC en cualquier valor que no sea
adicionar 1. Esto significa que luego de la ejecucin de un salto, el programa debe continuar
ejecutando en una lnea que no es la prxima. Podemos clasificar los saltos en 2 tipos
elementales:
1. Saltos incondicionales, en los que el procesador simplemente salta.

2.

Saltos condicionales, en los que la ocurrencia del salto est subordinada a alguna
condicin, en nuestro caso de la etapa aritmtica exclusivamente. Pueden ser hacia
delante o hacia atrs.

Ambos tipos de saltos generan complicaciones, pero nos concentraremos slo en


solucionar los saltos condicionales ya que, de lograrlo, implcitamente estarn solucionados los
saltos incondicionales. Consideremos como ejemplo el caso de una suma seguida de un salto
de 10 bytes hacia delante si el resultado de la suma es cero:
ADD r1, r2, r3
JPC Z, 10
En el diseo actual se conoce si el salto debe ser tomado o no en la etapa de
Decodificacin del salto (lo que es bastante bueno) y se realiza la bsqueda de la instruccin a
continuacin. En el caso que el salto no sea tomado, nada sucede, pero si el salto debe ser
realizado, la instruccin resultante de la etapa F es intil y es necesaria la insercin de una
burbuja similar a la vista anteriormente aunque no igual porque no debemos parar el PC.
La prediccin de saltos consiste en tratar de saber si el salto ser tomado o no, y es un
tema crtico muy estudiado actualmente, ya que puede evitar paradas en el pipeline. Por
ejemplo, una prediccin incorrecta en el Alpha 21264 resulta en por lo menos 7 ciclos
desperdiciados, y en el Pentium 4, 17 ciclos de prdida mnima.
Considerando los resultados de varios estudios al respecto, decidimos utilizar un
sistema esttico de prediccin llamado BTFN (Backward Taken, Forward Not), en el cual
cuando un salto condicional es hacia atrs, supondremos que se toma siempre, y cuando un
salto condicional es hacia delante, supondremos que no se lo toma nunca.
Este sistema est compuesto por la Unidad de Prediccin de Saltos (UPS), el Sumador
del Program Counter (SuPC, que se encarga de cargar el PC con el valor indicado por la UPS),
la Unidad de Comparacin de Resultados (UCR) que se dedica a comparar las condiciones de
salto con el resultado de la etapa aritmtica y finalmente por un multiplexor encargado de
ejecutar la insercin de la burbuja. Finalmente, la Figura 3 muestra el microprocesador
segmentado completo, mostrando la unidad de Adelantamiento, la unidad de Insercin de
Burbuja y todo el sistema de prediccin de saltos (en rojo):

CONTROL

M
u
x
P

'0'

P
C

Memoria
de
Programa
'0'

M
u
x
F

U
N
O

M
u
x
3

M
u
x
A

Banco
de
Registros

SUAT

M
u
x
1

D
O
S

M
u
x
A

M
D
R

A
ALU

M
u
x
B

T
R
E
S

Memoria
de
Datos

M
D
R
M
u
x
2

C
U
A
T
R
O

UCR

SuPC

UPS
UA

UIB

Figura 3. Esquema completo del microprocesador segmentado.


Luego de realizar diversas pruebas de simulacin, verificamos que el funcionamiento del
microprocesador es correcto, tal como se esperaba del diseo. Comprobamos que las
unidades agregadas para reducir los riesgos de la segmentacin realmente implican una
mejora significativa en cuanto a performance se refiere, pero para contar con datos
cuantitativos ms exactos es necesario realizar simulaciones ms reales con otros mtodos,
sobre los cuales estamos investigando actualmente.

Conclusiones
Una vez finalizado el trabajo, pudimos comprobar que Verilog HDL constituye una
herramienta muy poderosa que potencia enormemente la productividad de los diseadores de
hardware. Tambin podemos agregar que no es muy costoso familiarizarse con el lenguaje, ya
que su sintaxis es bastante similar a la del lenguaje C, siendo este ltimo muy popular tanto en
ambientes profesionales como acadmicos. Sin embargo, presenta conceptos que no son
simples de comprender y manejar mentalmente (como la concurrencia de procesos) que
pueden resultar en fuentes de error de difcil identificacin si no son manejados con el cuidado
que merecen. Adems, de por s, la depuracin del cdigo es dificultosa y encontrar la causa
de los errores requiere conocer plenamente y tener presente el diseo del microprocesador.
Con respecto a su posible implementacin como parte de la asignatura mencionada,
pensamos que es muy til, importante y ms an, necesaria, porque proporcionara a los
estudiantes conocimientos bsicos sobre el manejo de una herramienta muy utilizada en el
ambiente de la industria. Adicionalmente, el uso de Verilog HDL no queda restringido al mbito
de Arquitectura de Computadoras, sino que puede extenderse a otras asignaturas de la
carrera, en lo que podra llegar a constituirse como un Laboratorio de Microprocesadores.
Estamos seguros de que se cumpli ampliamente la expectativa de que el trabajo sirva
como base para otros proyectos que lo amplen (agregndole mdulos ms complejos, como el
manejo de interrupciones y excepciones, por ejemplo), que lo usen como plataforma (por
ejemplo, el desarrollo de un sistema operativo o de un compilador), o que lo plasmen en un
circuito integrado programable, todos ellos sustentados en el hecho de poder simular el
funcionamiento de un microprocesador RISC. De hecho, actualmente los autores estn
trabajando en el diseo de una jerarqua de memoria para el microprocesador, y en la
formacin de un equipo de trabajo.
Finalmente, no queramos perder la oportunidad de expresar nuestro agradecimiento a
la ctedra de Arquitectura de Computadoras de la FACET por el apoyo que nos brindaron.
Bibliografa
[1] Patterson, David y Hennessy. Computer Organization & Design. The
Hardware/Software Interface
[2] Majorel Padilla, Nicols y Sale, Ernesto Jos. Diseo, Codificacin en Verilog HDL
y Simulacin de un microprocesador RISC de 32 bits
[3] Tannenbaum, Andrew S. Organizacin de Computadoras Un Enfoque
Estructurado
[4] Hyde, Daniel C. Handbook On Verilog HDL, Bucknell University.
[5] Lindsay, Donald. Static Methods in Branch Prediction, 1971.
[6] Mark W. Goudreau. Advanced Computer Architecture II, University of Central
Florida
[7] Extreme Tech, Dom. 16 de diciembre de 2001, A closer look at Branch Prediction
Autores
Nicols Majorel Padilla

nickmpad@arnet.com.ar

Se recibi de Ingeniero en Computacin en la Universidad Nacional de Tucumn (UNT) en


Diciembre de 2001. Fue integrante del Cuadro de Honor de la Facultad de Ciencias Exactas y
Tecnologa (FACET) de la UNT durante el ao 2000. Es colaborador de las ctedras de
Arquitectura de Computadoras y de Diseo con Microprocesadores, ambas pertenecientes a la
FACET. Por otra parte, est actualmente est dedicado a trabajos de investigacin como parte
de un proyecto de diseo e implementacin de un microprocesador.
Ernesto Jos Sale

ernesto_j_s@yahoo.com

Obtuvo el ttulo de Ingeniero en Computacin de la Universidad Nacional de Tucumn (UNT) en


Marzo de 2002. Miembro del Cuadro de Honor y escolta de la Bandera Nacional de la Facultad
de Ciencias Exactas y Tecnologa de la UNT. Colaborador de la ctedra de Arquitectura de
Computadoras de la FACET, actualmente realizando una investigacin sobre diseo e
implementacin de microprocesadores. Colaborador de la ctedra de Sistemas Operativos de
la misma Facultad, administra la red del Laboratorio de Redes de Computadoras y colabora en
las clases prcticas (laboratorio) de dicha asignatura.

También podría gustarte