En esta práctica haremos uso del simulador Simula3MS, el cual, es parecido al de la práctica anterior, con lo que no será complicado hacerse al programa.
•Desarrollo de la práctica:
Empezamos la práctica siguiendo los
pasos del 1 al 5, en los cuales se pide cargar Programa1 (disponible
en el campus virtual), ensamblarlo, corregir cualquier fallo que
surja hasta conseguir que el programa se ensamble correctamente y,
acto seguido, ejecutar el programa.
Una vez ensamblado, comencé a
ejecutar el programa. En la ventana de ejecución que aparece,
utilizamos el botón “Ciclo Siguiente” hasta situarnos en la
primera instrucción lw. Se pide ahora en el paso 6 identificar los
elementos del camino de datos que utiliza la instrucción lw,
teniendo presente que la misma es de tipo I. Dichos elementos son,
por etapas, los siguientes:
Etapa IF: Utilizamos el contador de
programa (PC), que contiene la dirección de la instrucción que
vamos a ejecutar, la memoria de instrucciones, que contiene en la
dirección almacenada en el PC la instrucción que vamos a ejecutar y
por último el sumador, que en esta máquina suma 4 a la dirección
almacenada en el PC para que apunte a la siguiente instrucción.
Etapa ID: En esta etapa se utiliza el
banco de registros, al que le suministraremos el número del registro
fuente que contiene la dirección de la que cargaremos el dato, así
como la unidad de extensión de signo, que convierte el inmediato de
la instrucción de 16 bits a 32 bits por medio de la replicación de
signo. En esta etapa la unidad de control decodifica la instrucción
pero no forma parte del camino de datos.
Etapa EX: En esta etapa se utiliza la
ALU para sumar el inmediato a la dirección contenida en el registro
fuente, formando así la dirección en memoria del dato que queremos
cargar en el banco de registros.
Etapa MEM: En esta etapa se accede a la
dirección calculada en la etapa anterior para leer el dato que
queremos cargar en el banco de registros.
Etapa WB: Finalmente en esta etapa
volvemos a usar el banco de registros para escribir el dato leído en
la anterior etapa en la dirección contenida en el registro destino.
En el paso 7 se pide describir con
palabras y con lenguaje RTL la secuencia de operaciones que se
realizan para ejecutar la instrucción lw $s0, 0($t1).
Descrito con palabras:
Se lee en la memoria de instrucciones
en la posición que indica el PC la instrucción a ejecutar y se
coloca en el bus Instrucción[31-0]. Se aumenta el PC en 4 para que
apunte a la siguiente instrucción. Se decodifica la instrucción y
se accede al registro fuente ($t1) que contiene la dirección base.
Se le suma en la ALU el desplazamiento que contiene el inmediato a la
dirección contenida en el registro fuente. El resultado de la suma
será la dirección a la que accederemos en la memoria de datos para
buscar el dato que queremos cargar en el registro destino.
Finalmente, almacenamos el dato que buscamos en la memoria en el
registro destino ($s0).
Descrito en lenguaje RTL:
Bus Instrucción[31-0] ←
Minstrucciones[PC]
PC ← PC + 4
$s0 ← Mdatos[$t1 + 0]
En el paso 8 se pide el valor de varios
registros y buses cuando se ejecuta la instrucción lw $s0, 0($t1).
En siguiente imagen se muestra cómo buscar la información pedida en
la ventana de ejecución del programa. Ésto servirá además para
comprender mejor todos los datos que dicha ventana nos ofrece.
Ilustración 1:
Localización de los datos pedidos
A continuación se muestran los
valores de los registros y buses pedidos: //no se indica instrucción
PC: 0x00400008
Instrucción [31-0]: 0x8d300000
Instrucción [25-21]: 0x9
Instrucción [20-16]: 0x10
Instrucción [15-0]: 0x0000
Bus de 32 bits tras la extensión de
signo: 0x00000000. Se obtiene extendiendo el valor anterior a 32
bits.
Dato leído 1: 0x10010000
Resultado de la ALU (ó dirección
de memoria de datos): 0x10010000. Se obtiene sumando el inmediato
al dato obtenido en el registro fuente (dirección base)
Dato leído en memoria de datos:
0x0000000A
Dato a escribir en el banco de
registros: 0x0000000A. Es el valor leído de memoria.
Avanzamos hasta el último lw para
responder al paso 9. Dado que es la misma instrucción el proceso de
realización es el mismo, la diferencia está en que el registro
destino donde se guarda el dato es distinto, y a la dirección base
obtenida del registro fuente (que sí es el mismo que en la anterior
instrucción) se le suma un desplazamiento distinto. Los valores
pedidos son:
Instrucción [15-0]: 0x000C
Bus de 32 bits tras la extensión de
signo: 0x0000000C
Nos situamos ahora en la instrucción
add //se ha equivocado, el camino está en naranja fuerte.
Para responder a la cuestión 10. Las
operaciones que se realizan son:
Se obtiene de la memoria de
instrucciones, de la posición que indica el PC, la instrucción a
ejecutar, se incrementa el PC en 4 para que apunte a la instrucción
siguiente. La instrucción se decodifica y se accede a los registros
fuentes. El contenido de los mismos es sumado en la ALU. En la etapa
MEM no se hace nada y finalmente se almacena el resultado de la
operación realizada en la ALU en el registro destino en la etapa WB.
La respuesta a la cuestión 11 es que,
en efecto, se trata del mismo camino de datos que en la instrucción
lw y es además común a todas las instrucciones. Dado que algunas
partes del camino de datos son usadas por todas las instrucciones
(como el PC y la memoria de instrucciones) se puede apreciar que es
más eficiente construir un solo camino de datos con dichos elementos
comunes y añadirle los elementos específicos que necesita cada
instrucción, regulando el flujo de los datos a través del camino
mediante multiplexores. De este modo, existen algunas instrucciones
que hacen uso de unas partes del camino y otras instrucciones que
hacen uso de otras partes del camino, pero todas utilizan el mismo
camino, puesto que todas utilizan los elementos comunes del camino.
Finalmente, respondemos a la cuestión
12 observando en el programa qué señales de control se activan para
las instrucciones lw y add (las señales activadas tienen mayor
grosor que las desactivadas).
Reg
Dest
|
Fuente
PC
|
Salto
Cond
|
Leer
Mem
|
Mem
a Reg
|
ALUop
|
Escr
MEM
|
Fuente ALU
|
Escr
Reg
|
Escr Dato
|
|
LW
|
0
|
0
|
0
|
1
|
1
|
0010
|
0
|
1
|
1
|
0
|
ADD
|
1
|
0
|
0
|
0
|
0
|
0010
|
0
|
0
|
1
|
0
|
La señal ALUop que he puesto es la que
la unidad de control de la ALU le manda a la misma y que es en ambos
casos 0010 (según los apuntes de teoría), ya que en ambas
instrucciones la ALU ejecuta una suma.
•Errores:
Analizando el código descargado del campús, descubrí
algunos fallos de tabulación, así como una pequeña errata en un
comentario, en el que se denominaba al “array_word” como
“array_byte”, que sin embargo no daban ningún problema a la hora
de ensamblar el programa. Adjunto las correcciones que realicé en el
código.
En la cuestión número 8 no se especifica sobre qué
instrucción hay que buscar los datos pedidos, aunque se
sobreentiende que es sobre la primera instrucción lw. No obstante
pienso que añadir la instrucción concreta a la que se refiere la
cuestión contribuiría a dar más claridad al enunciado.
En la cuestión 10 el enunciado dice que el camino de
datos de la instrucción add está marcado en color verde, sin
embargo, al menos en la versión del programa que utilicé para la
práctica (que es el ofrecido en el campus) el camino de datos de la
instrucción add está marcado en naranja oscuro, mientras que las
partes del camino que no usa la instrucción add están marcadas en
naranja claro. En el caso de la instrucción lw sí se marca el
camino de datos en verde y las partes del camino que no usa en negro.
•Mejoras:
Personalmente pienso que la práctica debería hacerse
sobre más instrucciones y no centrarse únicamente en la lw y la
add, para poder comprobar qué partes del camino de datos usan las
distintas instrucciones que hemos utilizado en las clases teóricas.
Adjunto pdf original para su consulta offline.
No hay comentarios:
Publicar un comentario