Apuntes de Verilog
Tema 8. Arquitectura de Ordenadores
Procesador MIPS para instrucciones tipo J
Procesador MIPS para instrucciones tipo J
19 de octubre 2025
Avanzamos un paso más en el estudio del procesador MIPS, ahora con un diseño avanzado que incorpora instrucciones tipo J.
Antes de ver cómo se implementa en el datapath, repasemos un poco la teoría.
Una instrucción tipo J (Jump type) es una de las tres categorías principales de instrucciones, junto con las tipo R (registro) y tipo I (inmediato). Las instrucciones tipo J se utilizan para realizar saltos incondicionales dentro del programa, es decir, para cambiar el flujo de ejecución a una dirección específica del código.
Las instrucciones tipo J más comunes son:
j <target> salta incondicionalmente a la dirección indicada.
jal <target> (Jump And Link) salta a la dirección indicada guardando la dirección de retorno (PC + 4) en el registro $ra (registro 31). Se usa para llamadas a funciones.
Nota: la instruccion jr (Jump Register) es una instrucción tipo R; salta a la dirección contenida en un registro.
Formato de 32 bits
Al igual que otros formatos, las instrucciones de tipo J comienzan con un opcore de operación de 6 bits. Los bits restantes addr se utilizan para especificar la dirección del salto.
| opcode (6 bits) | addr (26 bits) |
Opcode: Indica el tipo de instrucción (j o jal).
Address: Es la dirección de destino del salto, codificada en 26 bits. Esta dirección se combina con los 4 bits más significativos del PC (program counter) y se multiplica por 4 (porque las instrucciones están alineadas en palabras de 4 bytes) para obtener la dirección real.
Cómo se calcula la dirección de salto
El campo de dirección de 26 bits no contiene la dirección completa. El procesador la calcula así:
Dirección destino = (PC + 4)[31:28] concatenado con (address << 2)
(PC + 4)[31:28] → Los 4 bits más significativos del contador de programa actual.
(address << 2) → La dirección del campo address, desplazada 2 bits a la izquierda (porque las instrucciones están alineadas a 4 bytes).
Ejemplo
j 0x00400020 # Salta a la dirección 0x00400020
jal 0x00400030 # Salta a 0x00400030 y guarda la dirección de retorno en $r
opcode = 000010 (para j)
opcode = 000011 (para jal)
address = 0001_0000_0000_0000_0000_1000 (26 bits)
El procesador combina esta dirección con los 4 bits más significativos del PC+4 para formar la dirección final de salto.
Resumen
Las instrucciones tipo J (junto con las instrucciones beq y bne vistas anteriormente) se utilizan tomar decisiones (saltos) dentro de la ejecución de un programa. Esto permite ejecutar sentencias if/else y case, además de bucles while y for.
El objetivo es modificar el contador de programa (PC) para que apunte a una nueva dirección, permitiendo:
Saltos incondicionales.
Llamadas a subrutinas.
Partiendo del datapath para instrucciones beq que vimos en tema anterior, vamos a añadir dos elementos que nos permitiran procesar las instrucciones tipo J. Esdo dós módulos son: el multiplexor JUMP_MUX y el registro de desplazamiento SHIFT_JUMP.
La conexión de estos dos módulos queda como se muestra en la imagen siguiente.
Conexión de los módulos JUMP_MUX y SHIFT_MUX dentro del dataparth
El multiplexor JUMP_MUX tiene una función clave en la selección de la siguiente dirección del Program Counter cuando se ejecuta una instrucción tipo J, esto es, seleccionar qué dirección se carga en el próximo ciclo.
El Program Counter puede tomar tres posibles valores:
PC + 4 → siguiente instrucción normal.
PC + 4 + (offset << 2) → salto condicional (como beq o bne).
{PC[31:28], address[25:0], 2'b00} → salto tipo J (jump absoluto).
El JUMP_MUX se encarga de elegir entre estas opciones, en función de las señales de control.
El registro de desplazamiento SHIFT_JUMP, se utiliza para multiplicar x 4 el campo addr de la instruccion J y obtener la dirección real del salto.
Como hemos visto más arriba, la instrucción tipo J en MIPS tiene este formato:
| OPCODE (6 bits) | TARGET (26 bits) |
El campo TARGET (26 bits) contiene la dirección a la que se quiere saltar, pero no está completa; faltan los dos bits menos significativos de la dirección. Recuerda que un procesador MIPS usa direcciones de 32 bits y todas las instrucciones MIPS están alineadas a 4 bytes, por lo tanto:
Las direcciones de instrucción siempre terminan en 00 en binario y para obtener la dirección completa, el hardware desplaza el campo TARGET 2 bits a la izquierda (<< 2), añadiendo los dos ceros al final.
La dirección final de 32 bits del salto se forma así:
JumpAddr = {PC[31:28],INSTR[25:0],2′b00}
Donde:
PC[31:28] = los 4 bits más altos del PC + 4
INSTR[25:0] = los 26 bits del campo TARGET
2′b00= los dos ceros añadidos por el desplazamiento lógico
La Unidad de Control también sufre algunos cambios para soportar las instrucciones tipo J.
Unidad de Control para soportar instrucciones tipo J
En la siguiente imagen se muestra el código Verilog de los módulos Main Decoder y ALU Decoder que forman la Unidad de Control.
Módulos Main Decoder y ALU Decoder
En el módulo top de la Unidad de Control realizamos las conexiones del Main Decoder y del ALU Decoder.
Top module de la Unidad de Control
El módulo top del procesador MIPS para instrucciones J queda como se muestra en la imagen siguiente:
Top module de un procesador MIPS para instrucciones tipo J
El código Verilog del procesador MIPS puede verse en la imagen siguiente. Para que no quede muy extenso sólo voy a pegar el módulo top y el testbench. Las fuentes están disponibles para descargar al final de la página.
Para verificar el correcto juncionamiento del procesador, cargamos unas instrucciones tipo J en el módulo Instruction Memory y ejecutamos la simulación en Vivado.
Módulo Instruction Memory con instrucciones tipo J de prueba
Ejecutamos la simulación y este es el resultado:
Comprobamos que efectivamente al ejecutar la instrucción nº 3 (0x0800_0006 // j 0x0000006 ) el PC salta a la posición 24 y al ejecutar la instruccion nº 10 (0x0800_0005 // j 0x0000005 ) se produce un salto a la posición 20, creando un bucle en la ejecución del programa.
MIPS32 Single-Cycle Processor, thanks to Mr Moamen Wael for sharing!
MIPS Converter, herramienta online para codificar instrucciones
En este blog:
Tema 7. Procesador MIPS-SAP (simple as possible)
Puedes descargar las fuentes aquí abajo.