Datapath de Instrucciones Tipo R e I
Datapath de Instrucciones Tipo R e I
Datapath de Instrucciones Tipo R e I
1
Contenido
Introducción ........................................................................................................................................ 3
Tipos de instrucciones de la arquitectura MIPS .............................................................................. 3
SMIPS............................................................................................................................................... 4
Datapath instrucciones tipo R e I .................................................................................................... 8
Objetivo de actividad ........................................................................................................................ 12
Diagrama de diseño....................................................................................................................... 13
Desarrollo de la actividad .................................................................................................................. 13
Parte 1: Modificaciones................................................................................................................. 13
Modificación 1 ........................................................................................................................... 13
Modificación 2: .......................................................................................................................... 15
Parte 2: Nuevos módulos .............................................................................................................. 17
Modulo nuevo 1: Extensión de signo ........................................................................................ 17
Modulo nuevo 2: MUX de instrucción ...................................................................................... 18
Parte 3: Módulos que no cambian ................................................................................................ 19
Módulo 1: Banco de registros ................................................................................................... 19
Módulo 2: MUX_32 ................................................................................................................... 19
Módulo 3: ALU........................................................................................................................... 20
Módulo 4: Memoria .................................................................................................................. 21
Parte 4: Integración de Top Level ................................................................................................. 22
Parte 5: Testbench ........................................................................................................................ 24
Parte 1 ....................................................................................................................................... 24
Parte 2 ....................................................................................................................................... 25
Parte 3 ....................................................................................................................................... 26
Parte 4 ....................................................................................................................................... 27
Parte 5 ....................................................................................................................................... 28
Parte 6 ....................................................................................................................................... 29
Parte 7 ....................................................................................................................................... 29
Parte 8 ....................................................................................................................................... 29
Conclusión ......................................................................................................................................... 30
Referencias Biblíograficas ................................................................................................................. 30
2
Introducción:
3
SMIPS
Los SMIPS es una versión del conjunto de instrucciones de MIPS, su nombre viene
de MIPS simples, y no es más que un subconjunto del conjunto tipo ISA de MIPS.
El CPU de SMIPS implementa un subcircuito del conjunto de MIPS serie 2, el cual
incluye (todas las operaciones con enteros, excepto instrucciones
multiprocesadores, e instrucciones de carga desalineadas, así como las
instrucciones de retención). Cuenta con 3 registros especiales los cuales 2 de estos
registros son HI y LO que se usan para almacenar los resultados de multiplicaciones
y divisiones de enteros, y el otro registro es para el contador de programa el cual
nos dice cuál será la siguiente instrucción a realizar.
Cuenta con una sola rama la cual es posible humanamente si hay un retraso, y las
cargas no se puede obtener acceso, por lo tanto no es visible un retraso en estas.
Los CPU SMIPS tienen 2 modos operativos, el modo de usuario y el modo de kernel.
El modo operativo el cual se encuentra es almacenado en un KUC bit en el sistema
del coprocesador (COPO) el cual es el status register. EL CPU normalmente trabaja
en modo de usuario hasta que suceda una excepción y se forcé a cambiar a modo
kernel. El CPU en modo kernel normalmente maneja las excepciones, para
proceder a ejecutar el modo de usuario.
Como utilizan en parte las mismas instrucciones solo que uno de forma más
reducida que el otro, se puede realizar un manejador de instrucciones no válidas
para que puedan ser válidas.
4
Ilustración 1: Tabla de registros de control del coprocesador
5
Los registros de estado, tienen la función de ir siguiendo el funcionamiento del
procesador, sobre qué estado actual se encuentra y a cual cambia, dicho registro
tiene habilitado el modo de lectura o escritura y tiene un formato especial.
Los SMIPS cuentan con un contador de programa para las excepciones, el cual su
labor es que su ocurre alguna este registro almacena la dirección del registro que la
causo.
Como bien se sabe los SMIPS conserva el mismo conjunto de instrucciones, por lo
tanto, estas no cambian, dentro las instrucciones que pueden utilizar, esta es una
tabla de las instrucciones de tipo SMIPS.
6
Ilustración 6: Lista de instrucciones de SMIPS
7
Ilustración 7: Lista de instrucciones tipo SMIPS
8
Ilustración 9: Datapath instrucciones tipo R e I
Como solo logra apreciar el datapath de instrucciones tipo I No cambia a gran escala
solo con la integración de circuitos que su función es analizar el tipo de instrucción
se va a ejecuta, si es de clase R o de tipo I.
9
11. BC2EQZ: Hacer un llamado si el coprocesador 2 en un registro es igual a
cero; Opcode: “010 010”
12. BC2NEZ: Hacer un llamado si el coprocesador 2 en un registro no es igual a
cero; Opcode: “010 010”
13. BEQ: Hacer un llamado con el PC si el condicional de un registro es igual;
Opcode: “000 100”
14. BEQL: Comparar con el PC si el condicional es igual, creando un retraso en
la instrucción; Opcode: “010 100”
15. REGIMM: Probar con el PC si una instrucción es mayor o igual a cero;
Opcode: “000 001”
16. BGEZAL: Probar en el PC para hacer un llamado procedural; Opcode: “000
001”
17. BGEZALL: Probar en el PC para hacer un llamado procedural, ejecutando un
retraso; Opcode: “000 001”
18. LB: Cargar un byte de la memoria; Opcode: “100 000”
19. LBU: Cargar un byte de la memoria a un valor sin signo; Opcode: “100 100”
20. LDC1: Cargar una doble palabra de la memoria; Opcode: “110 101”
21. LH: Cargar la mitad de una palabra de la memoria; Opcode: “100 001”
22. LHU: Cargar la mitad de una palabra sin signo; Opcode: “100 101”
23. LUI: Cargar un constante en mitad de una palabra; Oppcode: “001 111”
24. LW: Cargar una palabra de la memoria; Opcode: “100 011”
25. LWC1: Cargar una palabra de valor decimal de la memoria; Opcode: “110
001”
26. LWC2: Cargar una palabra de valor decimal de la memoria a un
coprocesador; Opcode: “010 010”
27. LWL: Cargar la parte más significativa de una palabra a una dirección vacía;
Opcode: “100 010”
28. LWR: Cargar la parte menos significativa de una palabra a una dirección
vacía; Opcode: “100 110”
29. MTC2: Mover una palabra al segundo coprocesador; Opcode: “010 010”
10
30. MTHC2: Mover una palabra a la parte superior de un registro del segundo
coprocesador; Opcode: “010 010”
31. NAL: No operación en una instrucción con retraso; Opcode:”000 001”
32. ORI: OR lógico inmediato; Opcode: “001 101”
33. SB: Almacenar byte en la memoria; opcode: “101 000”
34. SDC1: Guardar una palabra con doble ancho de palabra a la memoria;
Opcode: “111 101”
35. SH: Guardar media palabra; Opcode: “101 001”
36. SLTI: Menor que de forma inmediata; Opcode: “001 010”
37. SLTUI: Menor que sin signa de forma inmediata; Opcode: “001 011”
38. SW: Guardar palabra en la memoria; Opcode: “101 011”
39. SWC1: Guardar palabra con punto decimal en la memoria; Opcode: “111
001”
40. SWL: Guardar la parte más significante de la palabra en una parte de la
memoria; Opcode: “101 010”
41. SWR: Guardar la parte menos significativa de la palabra en una parte de la
memoria; Opcode: “101 110”
42. SYNCI: Sincroniza la memoria cache para que una instrucción de escritura
se haga de forma correcta; Opcode: “000 001”
43. TEQI: Compara si un valor del registro es igual al valor ingresado y checa un
condicional; Opcode: “000 001”
44. TGEIU: Compara una dirección es mayor o igual a un valor de forma
inmediato; Opcode: “000 001”
45. TLTI: Compara si un registro es menor que; Opcode: “000 001”
46. TLTIU: Compara si un registro es menor que, sin signo; Opcode: “000 001”
47. TNEI: Compara si un valor de un registro, no es igual; Opcode: “000 001”
48. XORI: OR exclusivo lógico de forma inmediata; Opcode: “001 110”
49. Como ya se sabe algunas instrucciones pueden tener el mismo Opcode, pero
estas depende de la dirección de la memoria, para que se le interprete un
significado.
11
Objetivo de actividad:
Estas son las instrucciones de tipo I que usaremos, además de las instrucciones
tipo R que usamos anteriormente:
12
Diagrama de diseño:
Desarrollo de la actividad:
Parte 1: Modificaciones
Como bien se sabe ahora necesitamos realizar más operaciones para poder
desarrollar la actividad, así que algunas de estas operaciones solo hacen que
modifiquemos el tipo de instrucción
Modificación 1:
13
Ilustración 11: Código Unidad de control
14
Ilustración 12: Continuación de código
Modificación 2:
Una vez modificada la unidad de control, procedemos a modificar el módulo de que
controla la ALU.
15
Ilustración 14: Código de ALU control
16
Ilustración 15: Código de ALU control
Esto serian todas la modificaciones que son necesarias, si se pregunta porque solo
agregamos solo 3 casos más y tenemos que hacer 5 cosas nuevas diferentes, esto
es debido a que de las nuevas instrucciones necesitan realizar la operación de la
suma ya sea para agregar un valor o acceder a una dirección
17
Ilustración 16: Código de Extensión de signo
En teoría el default nuca debería acceder ya que cubrimos todos los posibles casos,
pero por si las dudas…
18
Parte 3: Módulos que no cambian
Una vez explicado los cambios, y los nuevos módulos, procederíamos a la
integración de todos, pero antes los modulo que no sufrieron ninguna alteración y
necesitaremos
Módulo 2: MUX_32
19
Módulo 3: ALU
20
Ilustración 22: Final de la modificación de la ALU
Módulo 4: Memoria
Estos son todos los módulos necesarios, para la integración de todo el diseño
21
Parte 4: Integración de Top Level
22
Ilustración 25: Código de TopLevel
Una vez finalizado, compilamos, corregimos los posibles error que se lleguen a
presentar de sintaxis, procedemos a la visualización de nuestro modulo, solo para
conceptualizar que cumple con el diseño pedido.
23
Ilustración 27: Visualización de diseño
Entonces ya nos queda más que proceder a realizar el testbench para corroborar
sus correcto funcionamiento, en el caso de que no sea así, nos permitirá también el
localizar que conexión o componente no está haciendo lo que debe hacer
Parte 5: Testbench
En esta parte evaluaremos nuestro modulo.
Aquí irían capturas de el testbench, el código, si es que hubiera un test bench jajaja
Parte 1:
Primero tenemos que llenar el banco de registros con sumas inmediatas y un valor
cargado en el banco, en este caso un 1.Con esto rellenaremos 5 posiciones del
banco.
24
Ilustración 28: Testbench de banco de registro
Parte 2:
Ahora guardaremos estos resultados en la memoria con la instrucción SW, y utilizando un Base
Pointer en la dirección 11.
25
Ilustración 30: Testbench de memoria
Y su código es:
Parte 3:
Hacemos unas sumas
26
Ilustración 32: Testbech haciendo sumas en el banco
Su codigo:
Parte 4:
Guardamos los resultados
27
Ilustración 34: Testbench de memoria
NOTA:A partir de este punto ya no se demuestran pruebas debido a que le pique a algo que no y
no me alcanza el tiempo, se puede considerar como fallo en ese punto. Para que lo considere a la
hora de revisión.
Parte 5:
Hacemos ANDI
Código:
28
Ilustración 36: Código de ANDI
Parte 6:
Hacemos ORI, código:
Parte 7:
Cargamos el banco con lo que está en la memoria, código:
Parte 8:
Hacemos unas restas y eso es tocho morocho, código:
29
Ilustración 39: Código Restas
Conclusión:
Referencias Biblíograficas
-. (2005). SMIPS Processor Specification. -: -.
30
31