Registro de instrucciones y etapa de decodificación
Cómo una CPU didáctica captura una instrucción, extrae campos de opcode, registro e inmediato y los convierte en señales de control validadas, con contexto de RISC-V y x86.
Resumen: En una CPU sencilla, un registro de instrucciones (IR) captura una instrucción obtenida para que la decodificación vea bits estables. La decodificación identifica el formato de instrucción, extrae campos de registros e inmediatos, comprueba si la codificación es legal y genera información de control para las etapas posteriores. Un procesador moderno puede distribuir esa función entre búferes de búsqueda y registros de canalización, en lugar de contener un único «IR» arquitectónico literal.
El contador de programa responde dónde buscar. La etapa de decodificación responde qué significan los bits obtenidos. Entre ambos, una CPU didáctica suele colocar un registro de instrucciones: un banco de biestables que conserva la instrucción actual mientras la lógica de control la examina.
Ese modelo es útil, pero necesita un límite. El registro de instrucciones no es un registro visible para el programador en la mayoría de las ISA, y una implementación de alto rendimiento puede mantener muchas instrucciones a la vez en bloques de búsqueda, colas, registros de canalización o cachés de operaciones decodificadas. «IR» nombra una función en la ruta de datos didáctica, no un componente físico universal.
La ruta de datos didáctica
Una CPU multiciclo pequeña puede dibujarse así:
PC → instruction memory → instruction register → field extraction → control
En un evento de búsqueda de instrucción:
- el PC proporciona una dirección de instrucción;
- la memoria de instrucciones devuelve una palabra de instrucción;
- el IR captura esa palabra en el flanco de reloj activo; y
- la lógica de decodificación combinacional interpreta los bits almacenados.
La habilitación de escritura del IR se activa solo cuando debe aceptarse una instrucción nueva. Durante una detención, el IR conserva su valor anterior. Durante un reinicio o un vaciado de la canalización, el controlador marca la instrucción almacenada como no válida o la sustituye por una operación inocua.
Algunas rutas de datos multiciclo sitúan un registro de datos de memoria entre la memoria y el IR. Otras capturan directamente la salida de memoria. Ninguna secuencia es universal; la temporización y el protocolo de enlace de la interfaz de memoria elegida determinan los registros necesarios.
Una codificación de ejemplo pequeña
Supón que una ISA didáctica de ocho bits define este formato:
7 5 4 2 1 0
┌──────────────┬───────────────┬───────────────┐
│ opcode [2:0] │ register [2:0]│ mode / small │
│ │ │ immediate │
└──────────────┴───────────────┴───────────────┘
Los campos exactos son una elección de diseño de la ISA. Ocho bits no pueden codificar simultáneamente un espacio grande de opcodes, dos operandos de registro independientes y un inmediato útil, así que una ISA didáctica real suele usar varios formatos. Por ejemplo:
- una instrucción de registro puede dedicar bits a las direcciones de origen y destino;
- una instrucción de carga inmediata puede usar la mayoría de los bits bajos como una constante; y
- una instrucción de salto condicional puede interpretar esos mismos bits como un desplazamiento.
La decodificación debe establecer primero el formato y después interpretar los bits restantes en consecuencia. Dar a cada bit una única etiqueta permanente produce el circuito equivocado.
Campos de posición fija: ejemplo de RISC-V
La ISA base de RISC-V usa formatos de instrucción de 32 bits. Para una instrucción de tipo R:
31 25 24 20 19 15 14 12 11 7 6 0
┌────────────┬────────┬────────┬───────┬─────────┬──────────┐
│ funct7 │ rs2 │ rs1 │ funct3│ rd │ opcode │
└────────────┴────────┴────────┴───────┴─────────┴──────────┘
Los campos de registro ocupan posiciones coherentes en los formatos base:
opcode = IR[6:0]
rd = IR[11:7]
funct3 = IR[14:12]
rs1 = IR[19:15]
rs2 = IR[24:20]
funct7 = IR[31:25]
Esas particiones son cableado, no aritmética. rs1 y rs2 alimentan las direcciones de lectura del banco de registros; rd identifica un posible destino; y el opcode junto con los bits de función identifican la clase y la variante de operación.
Los inmediatos requieren más cuidado. En varios formatos de RISC-V, los bits del inmediato están deliberadamente repartidos por la instrucción. El hardware debe concatenarlos en el orden especificado y extender el signo a partir del bit de signo definido por la arquitectura. Sigue siendo cableado combinacional simple, pero no siempre es una única partición contigua.
La decodificación es más que un decodificador de opcodes
Para una ISA de juguete con ocho operaciones completas, un decodificador de tres a ocho puede crear señales one-hot:
| Opcode | Operación didáctica | Resultado one-hot |
|---|---|---|
000 | NOP | is_nop |
001 | LOAD | is_load |
010 | STORE | is_store |
011 | ADD | is_add |
100 | SUB | is_sub |
101 | JUMP | is_jump |
110 | BRANCH-Z | is_branch_z |
111 | HALT | is_halt |
A partir de esas señales se pueden derivar ecuaciones de control:
Es una introducción útil a los decodificadores y a la lógica de suma de productos, pero no es la estructura general de un decodificador real.
En una ISA más grande:
- el opcode principal suele seleccionar un formato o una familia de instrucciones, en vez de una sola operación;
- los campos de función secundarios distinguen los miembros de la familia;
- el estado de modo o de prefijo puede cambiar el tamaño y la interpretación de los operandos;
- algunos patrones de bits están reservados o son ilegales;
- el privilegio y la disponibilidad de extensiones pueden afectar a la legalidad; y
- las salidas de control suelen estar codificadas, en vez de disponer de un cable dedicado por instrucción.
Un decodificador correcto debe rechazar las codificaciones no admitidas, en lugar de tratarlas accidentalmente como una instrucción legal cercana.
Qué produce la decodificación
Es mejor considerar la salida como un paquete de control que como docenas de cables inconexos. Un paquete didáctico podría contener:
| Campo | Significado |
|---|---|
alu_op | Selecciona suma, resta, operación lógica, comparación o paso directo |
src_a / src_b | Elige operandos de registro, PC, inmediato o constante |
reg_write | Permite una escritura en el banco de registros en la etapa posterior adecuada |
mem_read / mem_write | Solicita una operación de memoria de datos |
result_source | Elige ALU, memoria, valor relativo al PC u otra fuente de escritura de vuelta |
branch_kind | Selecciona sin salto, salto condicional, salto directo o salto indirecto |
immediate | Constante recompuesta y extendida |
legal | Indica si la codificación está admitida en el estado actual de la máquina |
Estas señales deben estar condicionadas por la validez de la canalización y la temporización de etapa. Un reg_write = 1 combinacional en la decodificación no da permiso para actualizar inmediatamente el banco de registros; la escritura ocurre solo cuando la instrucción alcanza la etapa designada sin haber sido vaciada ni haber sufrido un fallo.
Longitud de instrucción fija y variable
La longitud de instrucción cambia la parte inicial del problema de decodificación.
Ejemplo de longitud fija: Arm A64
Las instrucciones Arm A64 tienen 32 bits de ancho. Una vez que la búsqueda ha proporcionado una palabra alineada, las posiciones de los campos se pueden examinar directamente. La longitud fija simplifica el descubrimiento de límites de instrucción, pero no hace trivial toda operación ni toda codificación de inmediato.
RISC-V con instrucciones comprimidas
Las instrucciones base de RISC-V tienen 32 bits. La extensión comprimida opcional añade instrucciones de 16 bits, y la arquitectura reserva un esquema de codificación de longitud para codificaciones más largas. La búsqueda debe determinar si la instrucción siguiente ocupa dos, cuatro u otro número admitido de bytes antes de avanzar el PC y alinear la instrucción siguiente.
Ejemplo de longitud variable: x86
Las instrucciones x86 van de uno a 15 bytes y pueden contener codificaciones de prefijo heredadas o modernas, bytes de opcode, bytes de direccionamiento ModR/M y SIB, desplazamiento y datos inmediatos. Las partes presentes dependen de los bytes anteriores.
Por ello, un front-end moderno de x86 necesita decodificación de límites y longitud de instrucción antes de la decodificación semántica o junto a ella. Las implementaciones difieren: no es seguro afirmar que todos los procesadores obtienen un bloque de tamaño fijo, usan una distribución de colas o traducen cada instrucción por la misma ruta. Los manuales de arquitectura de Intel definen la codificación visible para el software; la canalización exacta depende de la microarquitectura.
Longitud fija y longitud variable no son sinónimos de RISC y CISC. Describen una propiedad de la codificación.
Control cableado y secuenciado
Una CPU pequeña puede generar el control directamente a partir de lógica booleana. En su lugar, un controlador multiciclo puede usar una máquina de estados o una memoria de control cuyas entradas describen varios pasos internos. Los procesadores reales pueden combinar rutas de decodificación rápidas con tratamiento secuenciado para operaciones más complejas.
La distinción útil es:
- Decodificación combinacional asigna los campos actuales a una representación de control inicial.
- Control secuenciado emite varias acciones internas a lo largo del tiempo.
Ningún método es automáticamente «RISC» o «CISC», y una implementación microcodificada no es intrínsecamente lenta. El rendimiento depende de la implementación completa y de la carga de trabajo.
Control de canalización: detención, vaciado y validez
Cuando se solapan varias instrucciones, los bits de instrucción son solo una parte del estado. Cada registro de canalización también necesita metadatos de control.
Detención
Si la etapa siguiente no puede aceptar una instrucción, el registro actual de búsqueda/decodificación debe conservar sus datos o participar en un protocolo de enlace listo/válido. Permitir que los bits avancen mientras el estado de validez se detiene pierde la alineación entre instrucción y control.
Vaciado
Una predicción de salto errónea, una excepción o un reinicio pueden invalidar instrucciones más jóvenes. Borrar solo los bits de instrucción es menos robusto que borrar un bit de validez, porque una codificación formada por todo ceros puede ser legal en algunas ISA.
Tratamiento de dependencias
La decodificación puede identificar registros de origen y destino para las comprobaciones de riesgos. La respuesta puede ser una detención, la selección de reenvío, el renombrado de registros u otra acción específica de la implementación. La extracción de campos proporciona los identificadores; el control posterior decide qué hacer con ellos.
Errores de diseño habituales
- Suponer que la memoria siempre necesita un MDR. Añade registros a partir de la temporización e interfaz reales de la memoria, no de un diagrama universal.
- Cambiar el IR mientras su instrucción sigue activa. Usa una habilitación de escritura o un protocolo de enlace para que la decodificación vea bits estables.
- Decodificar solo el opcode principal. Pueden ser necesarios campos de función, modos, extensiones y comprobaciones de legalidad.
- Concatenar los bits del inmediato en el orden numérico del dibujo. Sigue exactamente el mapeo de bits de la ISA y después extiende desde el bit de signo especificado.
- Accionar efectos laterales directamente desde una decodificación sin calificar. Condiciona las escrituras con la validez de la canalización, la temporización de etapa y el estado de excepción/vaciado.
- Reiniciar a un patrón de instrucción arbitrario. Prefiere un bit de validez o un estado de reinicio del controlador; no supongas que todos los bits a cero significan NOP.
- Tratar una forma de onda didáctica como prueba de temporización física. El modelo puede mostrar secuenciación lógica, no el cierre de tiempos de establecimiento y retención en silicio.
Construir y verificar un decodificador didáctico
Abre el Ejecutor secuencial de instrucciones e identifica:
- el elemento que almacena instrucciones;
- los cables que forman cada campo;
- las salidas de control influidas por cada campo; y
- el punto en el que esas salidas pueden cambiar el estado arquitectónico.
Después, crea una tabla de pruebas compacta:
| Clase de prueba | Qué variar | Resultado esperado |
|---|---|---|
| Cada opcode legal | Bits del opcode principal | Familia de operaciones correcta y habilitaciones de efectos laterales |
| Variantes de función | Campos secundarios | Variante correcta de ALU o direccionamiento |
| Direcciones de registro | Campos rs / rd | Puertos de registro correctos; operación sin cambios |
| Extremos de inmediato | Cero, máximo positivo, máximo negativo | Concatenación y extensión correctas |
| Codificación reservada | Patrón de bits no admitido | Ruta de instrucción ilegal, sin escritura no intencionada |
| Detención | Mantener la decodificación durante varios relojes | La instrucción y el control permanecen alineados |
| Vaciado | Invalidar una instrucción en curso | Sin efecto lateral en registros ni memoria |
Alternar manualmente un ejemplo es una ilustración, no una verificación suficiente. Cubre toda clase de operación legal y codificaciones ilegales representativas.
Dónde encaja en la CPU
El contador de programa proporciona la dirección de búsqueda. La decodificación identifica los operandos y la intención de control. El registro de banderas de la CPU es una posible fuente de condiciones de salto en ISA basadas en banderas; otras ISA comparan registros directamente. La unidad de control secuencia la ruta de datos didáctica y condiciona los efectos laterales.
En conjunto, estos elementos explican el flujo de control de un procesador pequeño, pero ninguno de ellos por sí solo es «todo el plano de control». Las cachés, la predicción, las excepciones, el privilegio, los riesgos y el estado de canalización añaden más control en máquinas mayores.
Referencias principales
- Biblioteca de especificaciones de la ISA RISC-V sin privilegios
- Formatos de instrucciones base de RISC-V
- Explicación de Arm sobre la codificación de ancho fijo A64
- Manuales para desarrolladores de software Intel 64 e IA-32
Continúa con el análisis detallado de búsqueda–decodificación–ejecución y, después, modifica una codificación en la CPU didáctica y actualiza conjuntamente el decodificador, las pruebas y la documentación.



