martes, 8 de enero de 2013

PRÁCTICA 6 - Simula3MS


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