Estoy desarrollando una tubería.
Esta tubería tiene flujos de ejecución paralelos.
Lo que necesito saber es, ¿cómo derivar la tubería y luego cómo plegarlo?
(esta pregunta no tiene nada que ver con la rama de instrucciones y el retorno).
Prev. Unit -> Stage0 ----> Stage1 -+-> Stage2 -> Stage3 -> Stage7 -> Next unit
^ |
| +-> Stage4 -> Stage5 -> Stage6 -+
| |
+------------------------------------+
Esto es lo que quiero saber, cómo bifurcar (es decir, tener más de una posible etapa siguiente) y luego retirarse (tener una unidad que pueda tomar datos de dos etapas diferentes).
Si data + opcode pasa por Stage4, Stage5 y Stage6 Stage0 debe dejar de enviar datos (esta parte de la tubería debería detenerse) porque Stage4 significa una falta de caché (stage1 es la memoria CAM que le dirá si la página está en el caché o no), si los datos están en el caché, stage2 lo toma y Stage3 opera en él. De lo contrario, Stage4, Stage5, Stage6 (tamaño arbitrario) desalojará una página y cargará la página correcta en el caché de la unidad.
Por lo tanto, necesito poder "ramificar" la canalización según si la página está en el caché o no. Pero, si la página no está en la memoria caché, probablemente todo lo demás también se almacenará en memoria caché, así que necesito detener la tubería (pero no todo lo demás no podría manejar la falta de memoria caché).
El problema es que mis etapas de canalización están hechas de flip-flops D que envían una palabra en cada ciclo de reloj. Si no evito que el reloj funcione, los datos simplemente se eliminarán.
¿Existe una forma estándar de implementar el control de flujo para las sucursales en la tubería?