Universidad Nacional de San Luis
Facultad de Ciencias Físico Matemáticas y Naturales.
Ingeniería Electrónica con O.S.D.
Arquitectura de computadoras
Trabajo Práctico No 2
Conjunto de instrucciones
Alumno
Cortez Médici Emanuel
Profesores Responsables
Ing. Andrés Airabella
Ing. Astrid Andrada
2 de mayo de 2021
1. Para cada instrucción del conjunto presentado en la figura
1, indicar la siguiente información:
1. Tipo de direccionamiento (directo, indirecto, ...)
2. Formato de instrucción (tipo R, I, S, ...)
3. Identificar las instrucciones de salto y señalar cuáles son condicionales y cuáles no.
Figura 1: Instrucciones RISC-V
1
A continuación se presenta en la tabla 1, las distintas instrucciones con su tipo de
direccionamiento, formato y si son de salto o no.
Tipo de direccionamiento Tipo de Instrucción Produce un salto Instrucción
A registro R No add
A registro R No sub
A registro R No sll
A registro R No xor
A registro R No srl
A registro R No sra
A registro R No or
A registro R No and
A registro R No lr.d
A base R No sc.d
A base I No lb
A base I No lh
A base I No lw
A base I No ld
A base I No lbu
A base I No lhu
A base I No lwu
Inmediato I No addi
Inmediato I No slli
Inmediato I No xori
Inmediato I No srli
Inmediato I No srai
Inmediato I No ori
Inmediato I No andi
Pseudo-Directo I Incondicional jalr
A base S No sb
A base S No sh
A base S No sw
A base S No sd
Relativo al PC e inmediato B Condicional beq
Relativo al PC e inmediato B Condicional bne
Relativo al PC e inmediato B Condicional blt
Relativo al PC e inmediato B Condicional bge
Relativo al PC e inmediato B Condicional bltu
Relativo al PC e inmediato B Condicional bgeu
Inmediato U No lui
Relativo al PC e inmediato J Incondicional jal
Cuadro 1: Tabla con las instrucciones que dispone RISC-V
2
2. Responder las siguiente preguntas sobre el conjunto de
instrucciones:
2.a. Identificar el formato de las instrucciones. ¿Cuántos bits son usados
para las determinar el código de operación? ¿Con cuántos bits se
direccionan los registros?
En la figura 2, se muestran los distintos formatos de instrucciones que posee un pro-
cesador RISC-V de 32 bits. En dicha figura se observa, que se utilizan 7 bits, del bit 0
al 6, para determinar el código de la operación, y 5 bits, del 7 al 11, para direccionar los
registros.
Figura 2: Formato de instrucciones de un procesador RISC-V de 32 bits.
2.b. ¿Cuál es la cantidad máxima de registros que pueden utilizarse con
este formato de instrucciones?
Debido a que el espacio designado para el direccionamiento de registro es de 5 bits, se
podrán usar como máximo 32 registros.
2.c. ¿Cuál es la diferencia entre las instrucciones JAL y JALR?
La diferencia entre las instrucciones JAL y JALR, a pesar de que ambas son saltos
incondicionales, con JAL (llamado a un procedimiento) el salto se produce hacia la di-
rección del PC+X, siendo X un valor inmediato. Mientras que con JALR (retorno de un
procedimiento) el salto se produce hacia la dirección de un registro+X, siendo X un valor
inmediato.
2.d. ¿Cómo se obtiene la dirección de salto con la instrucción JALR?
La dirección de salto para la instrucción JALR se obtiene al sumar un registro Xn
(con valores enteros de n entre 0 y 31) con un valor inmediato. Este valor inmediato se
divide por 4 porque el procesador direcciona de a bytes. Por ejemplo:
Código 1: Código en lenguaje Assembly del ejercicio 2.d.
1 jalr X1 , 40( X2 )
En este caso, la dirección de salto sería X2+10.
3
2.e. ¿Cómo se obtiene la dirección de salto en la instrucción BNE?
La dirección de salto de la instrucción BNE se obtiene al sumar un valor inmediato
más el valor actual del PC, si se cumple que dos registros sean distintos. Por ejemplo:
Código 2: Código en lenguaje Assembly del ejercicio 2.e.
2 bne X1 , X2 ,40
En este caso, si X1 es distinto de X2, se realiza la resta de los mismos y si el resultado da
distinto de cero, se levanta un flag y hace que el procesador salte a la posición PC + 10.
3. Indique la instrucción que usaría para realizar una rota-
ción hacia la izquierda de diez posiciones del registro $t1
para luego guardarlo en $s3. Considere el direccionamien-
to de los registros indicado en la Tabla 2. Describa cómo
se representa la instrucción en hexadecimal.
Para realizar una rotación hacia la izquierda de diez posiciones del registro $t1 usaría
la instrucción SLLI. La instrucción en código Assembly se vería de la siguiente forma:
Código 3: Código en lenguaje Assembly del ejercicio 3
3 slli $s3 , $t1 , 10
Teniendo en cuenta que SLLI es de formato I, el código en binario será de la siguiente
forma:
Immediate (10) $t1 (9) funct3 $s3 (18) SLLI
000000001010 01001 001 10010 0010011
Cuadro 2: Tabla con los distintos grupos etarios que conforman la ciudad de San Luis y clientes esperados.
Pasando el código obtenido a hexadecimal, se obtiene el siguiente número: 0x00A49913.
4. En base al conjunto de instrucciones, escriba un código en
assembly que lea un dato de una posición de memoria, le
sume un valor inmediato y luego guarde el resultado en
el registro $t3. Posteriormente, que obtenga el valor de la
operación 4*$t3 y lo guarde en una posición de memoria
(diferente de la usada para la lectura).
Para realizar dicha acción, se tienen las siguientes sentencias en lenguaje assembly:
Código 4: Código en lenguaje Assembly del ejercicio 4
4 addi $t3 , $V0 , 6
5 slli $t0 , $t3 , 2
4
5. En la Fig. 3 se muestra una conexión posible de un pro-
cesador RISC-V a un banco de memorias RAM y a un
puerto de salidas de 64 bits. El puerto de salidas posee un
registro de 64 bits que es accesible a través del espacio de
direccionamiento del RISC-V, en la dirección 0x1050. Los
valores lógicos de cada una de las salidas del puerto coin-
ciden con el valor escrito en el registro del puerto. Una de
las salidas, correspondiente al bit 3 del puerto de salidas,
se encuentra conectada a un LED.A partir del hardware
descripto, escriba un programa que permita encender y
apagar el LED cada 0,4 s. Para el diseño de los retardos,
tener en cuenta las siguientes especificaciones:
Frecuencia de reloj: 10 MHz.
CPI: 2.
Figura 3: Esquema de conexión.
Para poder encender y apagar un LED cada 0,4 segundos, es necesario obtener el
CP Uexectime .
ClockCP U
CP Uexectime = = 0, 4 ∗ 107 = 4 ∗ 106 (1)
ClockRate
Luego, teniendo en cuenta la cantidad de clocks por instrucciones, se tiene que cada
0,4 segundos se realizan 2 ∗ 106 instrucciones.
Debido a que el LED se debe apagar y encender cada 0,4 segundos, se implementa
un contador el cual al llegar al número 163 ∗ 212 = 667648 cambia el estado del LED de
encendido a apagado o viceversa. Este número se eligió de tener en cuenta la cantidad de
instrucciones que se pueden realizar en 0,4 segundos. Si se multiplica por 3, se obtiene que se
hacen 667648∗3 = 2002944 instrucciones, un número aproximado al obtenido previamente.
Con dicho número, el LED cambiará de estado cada 2002944 ∗ 1027 = 0,40058 segundos.
Este código es implementado en el cuadro de código 5.
5
Código 5: Código en lenguaje Assembly del ejercicio 5
6 addi X1 , X0 0 // LIMPIO EL REGISTRO X1
7 addi X2 , X0 0 // LIMPIO EL REGISTRO X2
8 addi X3 , X0 0 // LIMPIO EL REGISTRO X3
9 addi X4 , X0 0 // LIMPIO EL REGISTRO X4
10 addi X5 , X0 0 // LIMPIO EL REGISTRO X5
11 addi X1 , X0 261
12 slli X1 , X1 4 // OBTENGO LA DIRECCION DEL PUERTO DE SALIDA
13 addi X2 , X0 163 // CON ESTE VALOR OBTENGO LA CANTIDAD DE CICLOS A REALIZAR
14 slli X2 , X2 12 // MULTIPLICO 163 POR 2 A LA 12 PARA OBTENER
15 // LA CANTIDAD DE CICLOS A REALIZAR
16 START : ld X3 , 0( X1 ) // SE CARGA LA DIRECCION PRESENTE EN X1 EN X3
17 x ori X3 , X3 8 // ENCIENDO O APAGO EL LED , PONIENDO UN 1 EN EL BIT 3
18 // Y HACIENDO UN XOR ENTRE DICHO BIT Y EL BIT PRESENTE EN EL REGISTRO
19 sd X3 , 0( X1 ) // GUARDO EL VALOR DE X3 EN LA DIRECCION 0 X00001050
20 LOOP : beq X4 , X2 END
21 addi X4 , X4 1 // CUENTO INSTRUCCIONES
22 beq X4 , X4 LOOP // SALTA A LOOP PARA EMPEZAR DE NUEVO EL CICLO
23 END : jal X5 , START // SE ELIGE EL REGISTRO X5 PARA GUARDAR
24 // LA POSICION PC +3 . CON ESTA SENTENCIA , COMIENZA NUEVAMENTE EL ENCENDIDO DEL LED