Estoy tratando de implementar el procesador RiSC-16 (no RISC) documentado aquí usando Verilog. El procesador es realmente simple, sin embargo, hay un problema cuando intenta realizar instrucciones SUMA consecutivamente en un registro, por ejemplo
add r1,r1,r1
add r2,r2,r2
Mirando la implementación secuencial aquí , este código no funcionará. He aquí por qué: dado que la habilitación de escritura del archivo de registro está activada durante la ejecución, el resultado de la primera instrucción se anula al comienzo de la segunda instrucción. Esto se debe a que la dirección de destino no cambia inmediatamente al comienzo del siguiente ciclo de instrucción.
¿Hay alguna manera de evitar que esto suceda?
RISC-16 es RISC. Todas las CPU RISC son RISC. Bueno, tu ejemplo es uno que nunca sucedería en una máquina real. Es una tontería. El problema puede estar en la tubería, el RISC tiende a ejecutar todas las instrucciones en la misma cantidad de ciclos de instrucción, compuestos por buscar, decodificar, ejecutar. La tubería se introdujo para acelerar el procesador: el primer problema es que todas las instrucciones deben tener los mismos ciclos de instrucción para aprovechar la tubería, luego está estrictamente prohibido ejecutar comandos que accederán y cambiarán el valor. del mismo registro dentro de un ciclo de instrucción, ya que la canalización se estropearía.
La única forma de reproducir su comportamiento es escribir intencionalmente esos códigos de ensamblador, ya que ningún compilador haría eso. Si programa en un nivel bajo, debe tener en cuenta la canalización y sus restricciones.
estoy tratando de implementar...
No dice CÓMO está tratando de implementar el procesador. ¿Esto es en software o hardware?
En el caso de este último, lo que está describiendo es un problema conocido.
No sólo ocurre en el caso de
add r1,r1,r1
Pero también si lo haces:
add r1,r2,r3
add r4,r1,r2
La segunda instrucción está usando r1, que todavía está en proceso de cambio. (Tenga en cuenta que las secuencias de instrucciones como la anterior son perfectamente válidas para salir de un compilador).
La solución para esto también es bien conocida, se llama plegado de registro .
Hay un circuito especial que verifica si el registro de destino también está en la tubería para la fuente. Si es así, un mux de retroalimentación separado proporciona una copia de los datos (que se encuentra en algún lugar avanzado de la canalización).
Cuando regrese a casa, veré si puedo encontrar una imagen del procesador RISC que desarrollé para divertirme.
Resolví esto escribiendo y extrayendo la nueva instrucción en el mismo flanco ascendente. Solía ser, estas dos operaciones ocurrirían en dos flancos ascendentes consecutivos, ahora ocurren simultáneamente.
usuario253751
zeke
usuario253751