Implementación de la instrucción ADD para el procesador RiSC-16

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?

¿El archivo de registro escribe "constantemente" cuando se afirma WE? O solo escribe en la señal del reloj? Si solo escribe en la señal del reloj, es posible que no tengas ningún problema.
@user253751 El archivo de registro escribe en el flanco ascendente del reloj cuando se afirma WE. Entonces, son ambos.
¿Entonces cuál es el problema? La dirección de destino no cambia inmediatamente, pero cambia antes del flanco ascendente del reloj, por lo que el archivo de registro escribe la nueva dirección y no la anterior.

Respuestas (3)

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.

RiSC significa "Computadora ridículamente simple", por lo que no es exactamente RISC. Además, no hay tubería en este procesador. Le sugiero que eche un vistazo a las documentaciones que vinculé en la publicación original.
@zeke No, RISC significa Computadora con conjunto de instrucciones reducido. Cualquiera que intente cambiar esa definición arbitrariamente causará el tipo de confusión que ahora está sufriendo.
@ElliotAlderson Literalmente dice eso en la documentación del procesador. Sé lo que es RISC, este procesador se llama simplemente RiSC.
@zeke ¿Cuántos procesadores existen realmente? ¿Realmente cree que obtendrá una respuesta para una CPU específica que nadie tiene y nunca tendrá?

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.

Estoy usando Verilog para implementar esto en hardware basado en la implementación secuencial que está documentada.

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.