DLX-MIPS
25 de Julio, 2023  

Documento Universidad Nacional de Córdoba
Facultad de Ciencias Exactas Físicas y Naturales

 
TÍTULO:
 Proyecto MIPS.
SUMARIO:
Descripción de instalación, configuración y uso del procesador MIPS.

FLUJO DE APROBACIÓN 

ESTADO

ROL RESPONSABLE

Acción ejecutada por:

FECHA COMPLETITUD

Creado

Equipo de Desarrollo

Julieta Abigail Prieto

20/07/2023

Creado

Equipo de Desarrollo

Mateo Merino

20/07/2023

Revisado

Profesor del práctico

Martin Pereyra

27/07/2023

Aprobado

Profesor del práctico

Martin Pereyra

27/07/2023

HISTORIAL DE CAMBIOS

VERSIÓN

FECHA

SECTOR

COMENTARIOS

1.0

24/07/2023

Todas

Primer versión del documento

1.1

25/07/2023

Timer y debugger

Vaciado de pipeline automático por hardware y se agrega requerimientos de timer.

TABLA DE CONTENIDOS

Propósito        2

Términos y Definiciones        2

ALU        2

PIPELINE        2

Riesgos        3

Riesgo Estructural        3

Riesgo de Control        3

Riesgo de Datos        3

DLX        3

MIPS        4

Métricas de Timming:        4

WNS (Worst Negative Slack):        4

TNS (Total Negative Slack):        4

Acrónimos y Abreviaturas        5

Descripción del Procesador        6

Propósito        6

Arquitectura del Procesador        6

Etapas        6

Set de Instrucciones        6

Modo de Operación        7

Etapas y módulos del pipeline        8

Debugger        9

UART        9

Etapa IF        10

Inputs:        11

Outputs:        11

Etapa ID        11

Inputs:        12

Outputs:        13

Unidad de Control        14

Inputs:        14

Outputs: Señales de Control        14

Detector de Riesgos        16

Inputs        16

Outputs        17

Etapa EX        17

Inputs:        18

Outputs:        19

Etapa MEM        21

Inputs        22

Outputs        22

Etapa Write Back        22

Inputs:        23

outputs:        23

TIMER:        23

Requerimientos        23

Ejecución Nominal        24

BIBLIOGRAFÍA        25

Información del documento

Propósito

El presente informe consta de una descripción de lo que fue la elaboración del trabajo final de la materia Arquitectura de Computadoras; la implementación del procesador MIPS en lenguaje de descripción de hardware Verilog, siendo éste puesto a funcionar en la placa FPGA Basys 3.

 

Términos y Definiciones

ALU

Es un circuito digital que realiza operaciones aritméticas (suma, resta) y operaciones lógicas (SI, Y, O, NO) entre los valores de los argumentos (uno o dos).

PIPELINE

La segmentación de cauce, también denominada pipeline, es una técnica empleada en el diseño de procesadores, basada en la división de la ejecución de las instrucciones en etapas, consiguiendo así que una instrucción empiece a ejecutarse antes de que hayan terminado las anteriores y, por tanto, que haya varias instrucciones procesando simultáneamente.

Riesgos

Riesgo Estructural

Sucede cuando dos instrucciones acceden al mismo recurso al mismo tiempo.

Riesgo de Control

 Sucede cuando se intenta tomar una decisión sobre una condición no evaluada. Por ejemplo las instrucciones BRANCH realizan un salto condicional, por lo que no se puede predecir en un principio cuál será la próxima instrucción sin antes ser evaluada la condición.

Riesgo de Datos

Sucede cuando se intenta utilizar un registro antes de que este esté preparado. Este riesgo se puede sub clasificar en los siguientes.

DLX

El DLX es básicamente un MIPS revisado y simplificado con una arquitectura simple de carga/almacenamiento de 32 bits. Pensado principalmente para propósitos educativos, se utiliza ampliamente en cursos de nivel universitario sobre arquitectura de computadores.

Las instrucciones DLX se pueden separar en, tipo R, tipo I y tipo J.

El DLX, como el MIPS, basa su rendimiento en el uso de la segmentación de cauce o pipeline. El diseño DLX es un ejemplo sencillo, un concepto clásico del RISC. La segmentación de cauce tiene cinco etapas:

MIPS

El procesador MIPS es una arquitectura de procesador reducido de instrucciones (RISC) que fue desarrollada por MIPS Computer Systems en 1985. El procesador MIPS se ha utilizado en una amplia variedad de dispositivos, incluyendo computadoras personales, consolas de juegos, y dispositivos integrados.

El procesador MIPS es un procesador de 32 bits que tiene una arquitectura de pipeline. Esto significa que el procesador puede ejecutar múltiples instrucciones al mismo tiempo.

Métricas de Timming:

WNS (Worst Negative Slack):

Es el valor más negativo entre todos los slack de tiempo en el diseño. El slack de tiempo se refiere al margen disponible en la ruta más larga para cumplir con las restricciones de temporización. Un WNS negativo indica que la ruta más lenta no cumple con los requisitos de temporización y representa cuánto tiempo falta para que la ruta alcance el objetivo de temporización.

TNS (Total Negative Slack):

Es la suma de todos los slacks de tiempo negativos en el diseño. Representa la cantidad total de tiempo por la que el diseño no cumple con los requisitos de temporalización.

 Acrónimos y Abreviaturas

Los siguientes acrónimos y abreviaturas son utilizados en el presente documento

ACRÓNIMO

DESCRIPCIÓN

IF

Instruction Fetch

ID

Instruction Decode

EX

Execute

MEM

Memory Access

WB

Write Back

MIPS

Microprocessor without Interlocked Pipeline Stages

ALU

Unidad Aritmética Lógica

RAW

Read After Write

WAR

Write After Read

WAW

Write After Write

RISC

Reduced Instruction Set Computing

GPR

Registro de Propósito General

WNS

Worst Negative Slack

TNS

Total Negative Slack

        

Descripción del Procesador

Este procesador está basado en la arquitectura DLX que es un conjunto de instrucciones RISC con registros de 32 bits de propósito general.

Entre sus principales funcionalidades se encuentran:

        

Propósito

Este procesador permite procesar múltiples instrucciones simultáneamente. Con un set de instrucciones reducido y control de riesgos.

Arquitectura del Procesador

Etapas

El procesador MIPS cuenta con un pipeline de 5 etapas, cuyas características se describen a continuación

Set de Instrucciones

Las instrucciones que el MIPS tiene implementadas son las siguientes:

        La descripción detallada del funcionamiento de cada instrucción se encuentra en el archivo “mips-iv-instruction-set.pdf”

A su vez, el MIPS es capaz de soportar y tomar acción sobre los siguientes tipos de riesgo:

        Para manejar los riesgos anteriormente mencionados, se implementó la Unidad de Cortocircuitos y la Unidad de Detección de Riesgos. Se detallarán más adelante.

Modo de Operación

        Para hacer uso del MIPS, se debe cargar el programa a ejecutar en la memoria de programa mediante un archivo ensamblado. Una vez que se tenga dicho programa listo para ser cargado, se transmite mediante la interfaz UART y se carga en la memoria de programa.

        El MIPS cuenta con dos modos de operación:

        La información se envía hacia y desde la PC mediante una unidad de Debug, que hace uso del módulo UART para la transmisión y recepción de datos.

Etapas y módulos del pipeline

        A continuación, se muestran gráficamente las etapas y módulos implementados en el MIPS, detallando cada parte de cada uno y explicando sus características, así como su funcionamiento y comunicación con el resto de las etapas.

Imágen 0: Diagrama de arquitectura MIPS

Debugger

        En primer lugar, comencemos con la Unidad de Debug. Es la encargada de recibir las instrucciones desde la computadora y cargarlas en la memoria de programa, así como indicarle al MIPS si debe ejecutarse en Modo Continuo o Modo Paso a Paso.

                                Imágen 1: Unidad de Debug

        Como se ve en la Imagen 1, la Unidad de Debug se comunica con la computadora por medio de la interfaz UART, que se encarga de recibir y enviar la información desde y hacia el MIPS.

UART

        El módulo UART recibe información de la PC y cuando termina de recibir un dato, notifica a la Unidad de Debug mediante el ‘flag_rx_done’ y la unidad de Debug procesa el ‘byte recibido’ y acciona en base a lo recibido. Los comandos a enviar desde la PC hacia el Debug son los siguientes:

Etapa IF

La etapa IF (Instruction Fetch) es la encargada de ‘sacar’ con cada ciclo de Clock las instrucciones a ejecutar en su output para que avancen hacia la siguiente etapa.

Imagen 2: Etapa IF

A continuación, una descripción de sus inputs y outputs:

        Inputs:

        Outputs:

Etapa ID

        En la etapa ID entran en juego varios módulos encargados de realizar distintas cosas. Estos módulos, en síntesis, son la etapa ID propiamente dicha, la Unidad de Control y la Unidad de Detección de Riesgos. Cada Unidad realiza su tarea específica y se comunica con el resto, se comentarán con detalle una por una.

Imágen 3: Etapa ID

        La etapa ID es la encargada de decodificar la instrucción proveniente de la etapa IF y ‘descomponerla’ en sus distintos componentes según la instrucción de la que se trate. La información que recibe este módulo es la siguiente

        

        Inputs:

        Outputs:

        Siguiendo con los módulos pertenecientes a la etapa ID, se procede a detallar el módulo ‘Control Main’ o Unidad de Control de nuestro MIPS

Unidad de Control

Imagen 4: Unidad de Control

        La Unidad de Control es la encargada de enviar las señales de información hacia todo el resto del Pipeline, indicando qué hacer y qué decisión tomar en cada etapa en base a las características de la instrucción. Sus inputs y outputs se describen a continuación

        Inputs:

        Outputs: Señales de Control

        Para finalizar con los módulos pertenecientes a la etapa ID, a continuación se muestra el Detector de Riesgos y su detallada explicación.

Detector de Riesgos

Imagen 5: Detector de Riesgos

        El Detector de Riesgos se encarga de detectar los posibles riesgos de datos y estructurales que se puedan presentar en la ejecución del programa. En síntesis, está comparando constantemente las instrucciones que van a ingresar en la etapa EX y en la etapa ID, y de esta manera dispara flags que advierten al resto de los módulos para accionar de determinada manera. Sus inputs y outputs son:

        Inputs

        Comparando estas dos inputs, el Detector de Riesgos notifica si hay un riesgo por el cual tomar cierta decisión. De esta manera, tiene como salidas:

        Outputs

        

Etapa EX

En el MIPS, las operaciones aritméticas se llevan a cabo en la etapa EX. En la implementación, dicha etapa está constituida principalmente por la ALU, y varios multiplexores controlados por la Unidad de Control.

Además, en esta etapa se implementó la Unidad de Cortocircuito, capaz de realizar tres tipos de cortocircuitos:

        Primero, se muestra la siguiente imagen correspondiente a la etapa EX y se desarrollará la explicación de cómo se ejecutan las instrucciones. Luego, mostraremos la Unidad de Cortocircuito ‘anexada’ en esta etapa y cómo se comunican entre sí

Imagen 6: Etapa EX

        Procedemos a detallar cada input y output de la etapa EX y detallar sus funcionalidades:

        Inputs:

        Outputs:

        Ahora, continuemos con la Unidad de Corto Circuito, que también se encuentra en la etapa EX y se comunica con los módulos internos de dicha etapa.

Imagen 7: Unidad de Corto Circuito

        La unidad de Corto Circuito se encarga de ‘cortocircuitar’ ciertos datos en caso de que se necesite para evitar ciertos riesgos. En síntesis, evalúa los riesgos de las instrucciones presentes en las etapas EX y MEM, junto con ciertas flags que recibe de la Unidad de Control, para poder decidir cuáles son los datos que ingresan al multiplexor de la ALU en base a la situación que se encuentre en el MIPS.

        A continuación, la descripción de sus componentes para mejor explicabilidad del módulo:

        Inputs:

        Outputs:

        Con estos datos a su entrada, la Unidad de Cortocircuito es capaz de comparar sus inputs y en base a eso identificar si hay necesidad de realizar un cortocircuito, y pone a su salida el valor que corresponda.

Etapa MEM

Imagen 8: Etapa MEM

        La etapa MEM o Memory, es la encargada de realizar las operaciones vinculadas a la Memoria de Datos. Ya sea almacenar un dato desde la memoria de registros hacia la memoria de datos (STORE), o cargar un dato en la memoria de registros desde la memoria de datos (LOAD)

        La Unidad de Control le notifica por medio de sus flags lo que debe hacer. Ya sea escribir o leer en memoria si la instrucción lo requiere. A continuación, describimos sus características para mayor entendimiento del módulo



        
Inputs

        Outputs

Etapa Write Back

        Finalmente, llegamos a la última etapa del Pipeline; la de Write Back. Esta etapa es la encargada simplemente de enviar el dato que se desea escribir en el banco de registros; en caso de que la instrucción lo requiera. Mediante un multiplexor y con la ayuda de la Unidad de Control, envía el dato correspondiente hacia la etapa ID. Describimos sus características:

Imagen 9: Etapa Write Back

        Inputs:

        

        outputs:

TIMER:

La frecuencia más alta que se alcanzó sin que genere errores es a 90,909 MHz.

Por arriba de la misma existen violaciones de TNS y WNS en el reporte de timing.

Cuando WNS y TNS se marcan en rojo con valores negativos indica que el diseño no ha logrado cumplir con los requisitos de temporización establecidos, lo que significa que hay violaciones de temporización. Una violación de temporización ocurre cuando la ruta más lenta en el diseño no cumple con los requisitos de temporización impuestos, lo que podría resultar en un funcionamiento incorrecto o inestable del hardware.

Requerimientos

Hardware: FPGA BASYS 3.

Frecuencia del TIMER: 90.909 MHz (máxima).

Sistema Operativo: Windows 11.

Software Sintetizador: Xilinx Vivado 2022.2.

Repositorio: GITHUB

Ejecución Nominal

        Para cargar un programa en el Pipeline y ejecutarlo, se diseñó un compilador en Python. Este compilador lo que hace es recibir un programa en lenguaje ensamblador y devolver las instrucciones en lenguaje máquina (hexadecimal) listas para ser cargadas en la memoria de programa mediante la Unidad de Debug

        

        El procedimiento para utilizar el compilador es el siguiente:

        Cabe aclarar que es importante que el archivo ‘program.py’ esté bien configurado en la línea 32 con el correcto puerto ‘COM’ donde se encuentra conectada la placa. También, debe establecerse correctamente el ‘baud rate’ de la transmisión en 9600.

Para que los registros y estados del procesador se encuentren inicializados correctamente se debe seleccionar el botón reset, luego de haber conectado la placa y antes de ejecutar el programa ‘program.py’.

BIBLIOGRAFÍA