Prof. Edgardo Gho, UNLaM
Ver enYouTubeCapítulo 1
Unidad 0: Arquitectura RISC-V
El profesor Edgardo Gho (cátedra de Arquitectura de Computadoras, UNLaM) presenta la arquitectura RISC-V: el conjunto base RV32I y sus extensiones, los registros y el program counter, los formatos de instrucción y el set de 47 instrucciones con sus pseudoinstrucciones. El video también recorre el simulador Ripes, cómo configurarlo para la materia, y cómo se compara con el kit de desarrollo ESP32-C3. Para practicar, el simulador de LYSZT ejecuta el mismo conjunto de instrucciones, con lecciones y ejercicios en español.
Temas
La arquitectura RISC-V
- RISC-V define una arquitectura base de enteros (RV32I, RV64I, RV128I) y extensiones: multiplicación y división (M), instrucciones comprimidas de 16 bits (C) y operaciones atómicas (A).
- El conjunto más común es RV32IMAC; en este curso se trabaja con el set mínimo indispensable, RV32I.
- Al ser una arquitectura tipo load-register, cada instrucción opera sobre registros: dos operandos (rs1 y rs2) y un registro destino (rd).
- Es una arquitectura tipo Harvard: la memoria de instrucciones y la de datos son memorias lógicamente distintas, con caminos separados de entrada y salida, a diferencia del bus bidireccional único de von Neumann.
- El espacio de direccionamiento de RV32I es de 32 bits: 2 a la 32 direcciones de byte (4 GB), o 1 G de palabras de 4 bytes.
Registros y program counter
- La arquitectura posee un program counter y 32 registros de propósito general.
- El registro x0 (zero) siempre devuelve 0 al leerlo y descarta toda escritura.
- El ensamblador acepta referencias por número (x0, x1, x31) o por nombre: ra para el return address, a0 para los argumentos de las funciones, etcétera.
- El program counter direcciona por byte y se incrementa de a 4 entre instrucciones, porque cada instrucción ocupa 4 direcciones consecutivas.
- El PC no es un registro de propósito general, pero es accesible y forma parte de la arquitectura de programación.
Formatos de instrucción
- RV32I define seis formatos; toda instrucción se representa con 32 bits.
- Los 7 bits menos significativos son el opcode; las operaciones aritmético-lógicas usan funct3 y funct7 para seleccionar la operación, típico de unidades de control cableadas.
- Los operandos son siempre rs1 y rs2 y el destino siempre rd; salvo el formato tipo R, todos definen una constante inmediata, codificada distinto en cada formato.
- Los modos de direccionamiento soportados son registro directo, base más desplazamiento e inmediato.
El set de instrucciones y las pseudoinstrucciones
- RV32I define 47 instrucciones; en el curso no se usan las 9 relacionadas con los CSR, los fences y el ebreak.
- Clases de instrucciones: aritméticas (add, sub, sll, srl), lógicas (and, or, xor y sus versiones inmediatas), branches (beq, bne, bge y sus versiones sin signo), accesos a memoria (word de 32 bits, half de 16 bits, byte), saltos (jal y jalr) y cargas de inmediatos (lui, auipc).
- Los números se asumen con signo salvo que la instrucción indique lo contrario, y los inmediatos se expanden a 32 bits con su signo propagado.
- El ensamblador ofrece pseudoinstrucciones que se desglosan en instrucciones reales: li para cargar inmediatos, la para tomar direcciones, ret para retornar, nop, neg, not y otras.
El simulador Ripes
- Ripes es un proyecto de software libre con fines didácticos, con ensamblador integrado y ejecución paso a paso; también admite el toolchain de GNU para compilar C a assembly.
- Es multiplataforma y de código abierto; se recomienda bajar el binario ya compilado.
- Para arrancar: elegir el procesador single-cycle y desactivar las extensiones M y C (si C queda activada, el ensamblador genera instrucciones de 16 bits).
- Incluye procesadores con pipelining, que se verán más adelante; al principio conviene desactivarlo y trabajar con la versión de un ciclo.
- Algunas simplificaciones del simulador: accesos no alineados sin penalidad, entrada y salida simuladas por la instrucción ecall y una ventana de consola, sin sistema operativo ni manejo de interrupciones.
- La ventana principal muestra los registros y el PC a la derecha, la consola de salida, y a la izquierda el editor con el código de máquina generado al lado del assembly, útil para ver cómo se desdoblan las pseudoinstrucciones.
El kit ESP32-C3 y la comparación con Ripes
- El kit de desarrollo de Espressif usa un microcontrolador RISC-V RV32IMC de la familia ESP32-C3, pensado para sistemas embebidos.
- Recursos: 400 KB de RAM, 384 KB de ROM con el bootloader, 4 MB de flash en los kits del curso (soporta hasta 16 MB), Wi-Fi 802.11 de 2,4 GHz, Bluetooth 5, GPIO, SPI, UART, I2C, alimentación de 3,3 V, un LED WS2812B y 11 pines GPIO; opera hasta 160 MHz con un oscilador de 40 MHz.
- El set de instrucciones es el mismo en ambos entornos, RV32IMC; la diferencia está en el resto.
- Memoria: Ripes asume toda la memoria direccionable como lectura y escritura; el ESP32-C3 tiene 400 KB reales y sus regiones de datos e instrucciones empiezan en direcciones específicas.
- Accesos no alineados: sin penalidad en Ripes (simulado), con penalidad en el ESP32-C3 (hardware real).
- Depuración: Ripes ejecuta paso a paso; el ESP32-C3 tiene un debugger con hasta 8 puntos de quiebre.
- Entrada y salida: en Ripes se simula con ecall; en el ESP32-C3 se usa la biblioteca ESP-IDF para Wi-Fi, periféricos y más.
- Interrupciones: Ripes no las soporta; el ESP32-C3 ofrece 32 interrupciones vectorizadas y 7 niveles de prioridad.
