Estamos trabajando en un procesador canalizado escrito en VHDL, y tenemos algunos problemas con el tiempo, la sincronización y los registros en el simulador (el código no necesita ser sintetizable, porque lo vamos a ejecutar solo en el simulador) .
Imagina que tenemos dos etapas de procesador, A y B, con un registro de canalización en el medio:
- La etapa A del procesador es combinatoria y no depende del reloj
- El registro de tubería R, es un registro y, por lo tanto, cambia su estado en el flanco ascendente del reloj.
- La etapa B del procesador es una etapa compleja y tiene su propia máquina de estado y, por lo tanto, cambia su estado y realiza operaciones dentro de un proceso VHDL, gobernado por el flanco ascendente del reloj.
La configuración sería la siguiente
_______ ___ _______
| | | | | |
---| A |---|R|---| B |---
|_____| |_| |_____|
Con esta configuración, hay un problema de tiempo:
- t = 0: A obtiene datos y realiza sus operaciones
- t = 1: en el flanco ascendente, R actualiza sus datos con la salida de A.
- t = 2: en el flanco ascendente, B obtiene los valores de R, actualiza su estado y da una salida.
Nos gustaría que B cambiara su estado y generara una salida en t = 1, pero también necesitamos el registro en el medio para que funcione la tubería.
Una solución sería actualizar el registro R en el flanco descendente. Pero entonces, estamos asumiendo que todas las etapas del procesador se ejecutan en medio ciclo de reloj, y la otra mitad es un poco inútil.
¿Cómo suele resolverse este problema en canalizaciones?