Ramificación de una tubería

-2

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?

    
pregunta Jorge Aldo

1 respuesta

1

Encontré una solución.

Mi canalización está hecha de cierres tipo D que envían opcode + data (si corresponde) a cada ciclo de reloj. Cada etapa está hecha de lógica combinacional (ej. ALU) más un d-latch que alimenta la etapa.

Para detener la tubería (o partes seleccionadas de ella) debo O la fuente de reloj con la salida Q de un flip-flop R S. Si la unidad de memoria caché necesita detener la tubería (la totalidad de la misma), simplemente puede configurar el flip-flop, hacer flotar los pestillos que impulsan la memoria CAM y la entrada / salida de la memoria RAM de la caché y luego manipular la caché, luego reiniciar la tapa flop, permitiendo que la tubería fluya nuevamente.

Cuando el reloj está ORed con una bandera, los flip-flops de tipo D almacenarán el último valor que vean y lo adelantarán tan pronto como el reloj vuelva a subir. Los cierres no deben estar sincronizados con el reloj o esto fallará.

El manejo de la memoria caché (ya que todo el procesador debe detenerse si se produce una falta de memoria caché o TLB) y la MMU se realiza en una sola unidad que vigila la tubería, se detiene todo y se encarga del problema.

¿Alguien ve algún problema con esa solución?

    
respondido por el Jorge Aldo

Lea otras preguntas en las etiquetas