He Choen Casa

9
Un microprocesador RISC “hecho en casa” Nicolás Majorel Padilla y Ernesto José Sale Resumen El siguiente trabajo tiene un perfil doble: por un lado, es el diseño de un microprocesador RISC de 32 bits; por el otro, es una investigación sobre el uso de Verilog HDL para la descripción y simulación del diseño. La finalidad del trabajo también es doble: sienta una base para otros proyectos sobre microprocesadores; y además sirve para tener una idea de la utilidad de Verilog HDL así como del tiempo necesario para aprender a manejarlo, con vistas a la inclusión de un módulo dedicado a este lenguaje en una asignatura, Arquitectura de Computadoras. Este artículo presenta las principales fases de un trabajo mayor realizado por los autores, en las que se destaca principalmente el procedimiento seguido y los resultados más importantes. Palabras clave: Microprocesador, RISC, Arquitectura de Computadoras, Diseño digital, Pipelining, Verilog, HDL, Simulación. 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, it’s 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 subject’s 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 it’s 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. Introducción Este artículo presenta tanto un trabajo de diseño realizado por los autores, como así también una investigación sobre la utilización de un lenguaje de descripción de hardware (Verilog HDL) y sobre una herramienta de simulación en el diseño digital, concretamente, de microprocesadores. La herramienta utilizada para la simulación será SynaptiCAD Verilogger Pro™ 7.5, en una versión de evaluación. Esta investigación 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 didáctico. Esto influirá posiblemente en la estructura de la asignatura Arquitectura de Computadoras (asignatura obligatoria de la carrera de Ingeniería en Computación de la Facultad de Ciencias Exactas y Tecnología de la Universidad Nacional de Tucumán), insertándose un módulo dedicado a Verilog, como muchas de las universidades del mundo de hecho lo tienen. En segundo lugar, podría constituir la base de diversos proyectos de investigación multidisciplinarios de mayor escala, como así también de trabajos de graduación. El trabajo se realizó en 3 etapas, a saber: 1) Diseño del Set de Instrucciones a utilizar; 2) Diseño de un microprocesador uniciclo; y 3) Diseño de un microprocesador segmentado. El motivo para realizar 2 diseños de microprocesadores consiste en tener una idea más concreta sobre cómo influye la complejidad del hardware sobre la descripción y la evaluación de resultados.

description

procesador risc

Transcript of He Choen Casa

  • 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.

    Figura 1. Formatos de Instruccin.

    16 556

    OPCODE rd desp ro Formato 1:

    OPCODE R1 R2 R3 Reservado Formato 2:

    6 11 5 5 5

    24

    OPCODE c Desp Formato 3:

    6 2

  • 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 (); 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 sub-procesos (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.

    UNO

    DOS

    CUATRO

    TRES

    PC

    SuPC

    Memoriade

    Programa

    Bancode

    Registros

    SUAT

    CONTROL

    Mux1

    Mux3

    ALU

    A

    B

    Memoriade

    Datos

    MDR

    Mux2

    MDR

    Figura 2. Primer esquema del microprocesador segmentado.

  • 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):

    '0'

    '0'

    UNO

    DOS

    CUATRO

    TRES

    PC

    SuPC

    Memoriade

    Programa

    Bancode

    Registros

    SUAT

    UCR

    CONTROL

    Mux1

    Mux3

    ALU

    A

    B

    Memoriade

    Datos

    MDR

    Mux2

    MDR

    UA

    MuxA

    MuxA

    MuxB

    UIB

    MuxP

    UPS

    MuxF

    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 [email protected] 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 [email protected] 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.