Introducción
En esta sección se encuentra publicado el código fuente del microprocesador MIPS64 para números enteros, implementado en mi Proyecto de Fin de Carrera: Implementación VHDL del microprocesador MIPS64: Un enfoque docente. Puedes acceder a la memoria de dicho proyecto haciendo click aquí.
El código está escrito en VHDL (acrónimo que representa la combinación de VHSIC y HDL, donde VHSIC es el acrónimo de Very High Speed Integrated Circuit y HDL es a su vez el acrónimo de Hardware Description Language), un lenguaje de descripción y modelado diseñado para describir la funcionalidad y la organización de sistemas hardware digitales, placas de circuitos, y componentes.
Implementaciones MIPS64 completas
Aquí puedes ver y descargar las implementaciones completas realizadas en el proyecto, comprimidas en formato zip:
- MIPS64 secuencial, versión estructural
- » Acceder
- MIPS64 secuencial, versión funcional
- » Acceder
- MIPS64 segmentado, versión funcional
- » Acceder
VHDL funcional vs. VHDL estructural
VHDL puede ser usado para la descripción algorítmica o funcional de un circuito. Sin necesidad de conocer la estructura interna de un circuito es posible describirlo explicando su funcionalidad: esto es especialmente útil en simulación, ya que se permite simular un sistema sin conocer su estructura interna y sus detalles de implementación a bajo nivel.
Otra manera de usar VHDL es el enfoque estructural en el que primero se diseña una biblioteca de componentes de bajo nivel y posteioromente se describen sistemas más complejos mediante la interconexión de estos componentes.
Para la versión secuencial del MIPS se han utilizado los dos enfoques, y como se ha decidido que el funcional es mucho más sencillo y didáctico para los fines de este proyecto, se ha partido de esta descripción funcional para implementar la versión segmentada.
Descripción MIPS64 secuencial
Esta es la lista de componentes escritos en VHDL que forman parte de la implementación secuencial del microprocesador MIPS64. Haz click en cualquier de estos componentes para ver su código fuente.
- Instruction Fetch
- Instruction Decode
- Execution
- Memory
- WriteBack
- Unidad de Control
- Microprocesador MIPS64 (secuencial)
- » Versión funcional
- » Versión estructural
- » TestBench del microprocesador MIPS64 secuencial
- » Conjunto de Instrucciones para la simulación del microprocesador
- Para poder compilar correctamente el código perteneciente al MIPS64 estructural
, es necesario tener los archivos VHDL pertenecientes al resto de componentes que forman las etapas
indicadas anteriormente. Es el caso de multiplexores, sumadores, registros, etc.
SE RECOMIENDA DESCARGAR EL PAQUETE MIPS64 SECUENCIAL / ESTRUCTURAL ENTERO!
» Descargar MIPS64 versión secuencial / estructural
Esta etapa busca en memoria la instrucción que le indica el Program Counter (PC), además de
sumar 4 al PC (las instrucciones son siempre de 32 bits).
Compuesta por un multiplexor, un registro de 32 bits (PC), la memoria de instrucciones, y un sumador.
Descargas proporcionadas (Instruction Fetch):
La etapa Instruction Decode ha de decodificar la instrucción en curso. También lee los operandos fuente de los
registros especificados por la instrucción que se ha decodificado. Además, en esta etapa se extiende
el signo del operando inmediato, en caso de ser necesario.
Esta etapa es la más compleja de todo el diseño. Está compuesta por 4 multiplexores, 2 registros de 64 bits, 1 extensor de signo, 1 sumador, 1 comparador, y por último, un banco de registros compuesto por 32 registros de 64 bits cada uno.
Descargas proporcionadas (Instruction Decode):
El paso de la etapa ID a la etapa EX se suele denominar "emisión" de la instrucción. En esta etapa, la ALU
realiza la operación requerida con los operandos a su disposición.
A partir de esta etapa, el número de elementos que componen las etapas decrece bastante: la etapa Execution está compuesta por 1 multiplexor y una ALU.
Descargas proporcionadas (Execution):
Se realizan los accesos a memoria para las instrucciones LOAD / STORE. También se hacen efectivas
las instrucciones de salto.
El único componente de esta etapa es una memoria de datos, capaz de almacenar 16 KB, o lo que es lo mismo, una caché de nivel 1 (L1) de 16 KB.
Descargas proporcionadas (Memory):
La función de esta etapa es realizar la escritura del resultado obtenido en un registro.
La etapa WriteBack está compuesta por un único multiplexor, cuya función consiste en decidir que dato se guardará en el banco de registros: el resultado de la ALU o bien el resultado de acceder a memoria.
Descargas proporcionadas (WriteBack):
La Unidad de Control se encarga de sincronizar las acciones que realiza cada una de estas etapas, generando las señales de control que gobiernan el funcionamiento de la ruta de datos.
Descargas proporcionadas (Unidad de Control):
El microprocesador MIPS64 se obtiene como resultado de interconectar las etapas descritas anteriormente, junto con la unidad de control.
Descargas proporcionadas (MIPS64):
NOTA IMPORTANTE
Descrpción MIPS64 segmentado
En el diseño segmentado, la arquitectura variará muy poco con respecto a la arquitectura secuencial mostrada con anterioridad. Básicamente, el elemento principal que diferencia a la arquitectura segmentada respecto de la secuencial es el registro de segmentación. Por supuesto, la otra modificación importante aparece en la unidad de control. A continuación se presenta la lista de componentes que forman parte de la implementación MIPS64 segmentada / funcional:
- Instruction Fetch
- Instruction Decode
- Execution
- Memory
- WriteBack
- Unidad de Control
- Microprocesador MIPS64 (segmentado)
- » Versión funcional
- » TestBench del microprocesador MIPS64 segmentado
- » Conjunto de Instrucciones para la simulación del microprocesador
- En la implementación proporcionada no están resueltos los riesgos que aparecen como resultado de la segmentación del procesador.
Esta etapa busca en memoria la instrucción que le indica el Program Counter (PC), además de
sumar 4 al PC (las instrucciones son siempre de 32 bits).
Esta etapa no cambia con respecto a la versión secuencial.
Descargas proporcionadas (Instruction Fetch):
La etapa Instruction Decode ha de decodificar la instrucción en curso. También extrae los datos de los
registros especificados por la instrucción que está decodificando. Además, en esta etapa se extiende
el signo de los operandos, en caso de ser necesario.
El cambio más notable respecto a la versión anterior es la disposición de un multiplexor (el que selecciona la dirección de escritura en el banco de registros). Esto es debido a que la dirección de escritura debe propagarse a las siguientes etapas, hasta llegar a la etapa WB, donde realmente es válida dicha dirección. Si realizáramos la escritura directamente en la etapa ID, muy probablemente obtengamos resultados inválidos.
Descargas proporcionadas (Instruction Decode):
El paso de la etapa ID a la etapa EX se suele denominar "emisión" de la instrucción. En esta etapa, la ALU
realiza la operación requerida con los operandos; cabe destacar que en el caso de accesos a memoria, se calcula
la dirección de acceso.
Esta etapa no cambia con respecto a la versión secuencial.
Descargas proporcionadas (Execution):
En MEMORY se realizan los accesos a memoria para las instrucciones LOAD / STORE. También se hacen efectivas
las direcciones de salto.
Esta etapa no cambia con respecto a la versión secuencial.
Descargas proporcionadas (Memory):
La función de esta etapa es realizar la escritura en registros de los datos obtenidos.
Esta etapa tampoco cambia con respecto a la versión secuencial.
Descargas proporcionadas (WriteBack):
La Unidad de Control se encarga de generar las señales de control que se irán propagando a través de los registros de segmentación junto con cada instrucción.
Descargas proporcionadas (Unidad de Control):
El microprocesador MIPS64 se obtiene como resultado de interconectar las etapas descritas anteriormente, junto con la unidad de control.
Descargas proporcionadas (MIPS64):
NOTA IMPORTANTE
