El Intel 80386 ocupa un lugar particular en la historia del hardware: fue el primer x86 de 32 bits, columna vertebral del PC de escritorio de fines de los años 80 y, curiosamente, un chip que ejecuta la totalidad de sus instrucciones a través de microcode. Esa última característica lo convierte en un candidato ideal para ser reimplementado en un FPGA, y eso es exactamente lo que hace el proyecto open source z386, del desarrollador nand2mario.

Hackaday ya había cubierto el arranque del proyecto en mayo pasado. Ahora nand2mario publicó una nueva actualización donde detalla optimizaciones concretas que llevan al core a una ganancia de rendimiento acumulada del 39% en el benchmark de DOOM, la métrica de facto para medir CPUs vintage.

¿Qué es "early start memory access" y por qué faltaba?

Una peculiaridad del 386 original es que arranca el acceso a memoria de la instrucción siguiente durante el ciclo anterior, gracias a que su unidad de gestión de memoria vive separada del resto del pipeline. Esa técnica, llamada early start memory access, le ahorra al procesador un ciclo completo por cada instrucción que requiere acceso a memoria.

La primera versión del z386 no la implementaba: cada instrucción esperaba su turno completo para pedir memoria. Reproducir esa técnica en FPGA no es trivial, porque el desafío está en que todo el cálculo de la dirección de memoria debe caber en un solo ciclo de reloj. nand2mario resolvió esa restricción y el resultado fue un aumento aproximado del 9% en el rendimiento del core.

¿De dónde salió el 30% restante?

Sobre esa base, el proyecto sumó dos optimizaciones más:

  • Reescritura del store queue: la cola de escrituras a memoria fue rediseñada para eliminar un ciclo del recorrido, entregando otro empujón al throughput.
  • Cálculo anticipado de saltos: los code branches son críticos para el rendimiento. En el 386 original, resolver un salto cuesta 9,25 ciclos. En el z386 actualizado, el core computa la dirección del salto varios ciclos antes que el 386 original, reduciendo el costo a 6 ciclos por jump.

Nand2mario aclara que esta última optimización es una desviación deliberada del diseño original de Intel: el 386 real no adelantaba tanto el cálculo. Como el objetivo del z386 no es replicar el pipeline exacto sino ofrecer un core compatible ejecutable, la desviación se justifica por el rendimiento.

Un ajuste final al frontend de decodificación de microcode cerró el paquete de mejoras.

¿Puede reemplazar a un 386 real?

Por ahora, no. El propio autor advierte que el z386 sigue rezagado respecto del 386 original de Intel en rendimiento y todavía no logra bootear Windows. La familia x86 es notablemente compleja, y su reimplementación completa desde microcode toma tiempo aún dentro de un chip que Intel discontinuó hace décadas.

Aún así, para la comunidad de retrocomputing y para quienes usan FPGAs como Analogue Pocket, MiSTer o desarrollos custom sobre placas Xilinx y Lattice, un core 80386 open source con rendimiento decente abre la puerta a réplicas de PCs 386 sin depender de silicio original cada vez más escaso y caro en el mercado de segunda mano.

¿Qué sigue en el proyecto?

nand2mario deja abierto que continuarán apareciendo optimizaciones. Los próximos objetivos naturales son:

  • Cerrar la brecha de rendimiento con el 386 físico original
  • Alcanzar compatibilidad suficiente para bootear Windows 3.x y las primeras versiones de Windows 95
  • Estabilizar el core lo suficiente para publicar como release usable en placas FPGA de propósito general

El repositorio y la documentación están públicos en el sitio de nand2mario, y quien tenga una placa FPGA puede sumarse al proyecto directamente.