Uso de reprogramación de registros para canalizar un módulo

De mi lectura, entiendo que las herramientas de síntesis modernas pueden realizar la reprogramación de registros donde los registros se mueven entre la lógica combinacional para cumplir con las restricciones de tiempo.

Entonces, por ejemplo, en su HDL describiría comb -> reg1 -> reg2 -> reg3y las herramientas moverían esos registros para obtener comb1 -> reg1 -> comb2 -> reg2 -> comb3 -> reg3.

¿Cuándo se canalizaría manualmente la lógica en lugar de depender de la reprogramación del registro?

Respuestas (3)

Bueno, hay al menos dos escenarios en los que optaría por la reprogramación manual:

  1. Donde sé que hay una geometría óptima específica, por ejemplo, un árbol lógico, y no quiero que el sintetizador haga esto solo, ya que podría hacer una elección subóptima.

  2. Los tiempos de ejecución de la síntesis pueden ser largos. Es posible que prefiera tomar estas decisiones solo en lugar de dejar que la herramienta las tome, donde es posible que deba verificar lo que hizo y posiblemente volver a ejecutar la síntesis.

Ambos son buenos puntos, supongo que las decisiones de reprogramación de registros son NP completas y, por lo tanto, los algoritmos no intentan encontrar una solución óptima sino una buena solución.

Para módulos RTL que son principalmente lógica de control (por ejemplo, controlador DMA), la mejor opción es la implementación de registro manual. Para los módulos RTL que son principalmente lógica de ruta de datos (p. ej., filtro), la mejor opción es la reprogramación de registros de herramientas de sintetizador.

Para ambos, en mi experiencia, la razón es por menos errores y facilidad de depuración. Determinar la causa raíz de la falla en una simulación HDL de la lógica de ruta de datos implementada para el retiming de registros (sin filtros intermedios de registros) es mucho más fácil cuando el resultado de la lógica de cálculo/algoritmo combinacional no tiene registros entre su entrada y su salida. Para la lógica de control, que depende en gran medida de las actualizaciones de ciclo a ciclo de las variables (regs), lo contrario es cierto.

La canalización generalmente se realiza para reducir la ruta crítica (la ruta que tiene el retraso más largo y que determina la frecuencia operativa máxima) del circuito y también para aumentar el rendimiento del diseño.

Entonces, al diseñar el RTL, debemos tener una idea (aproximadamente, si no exacta) sobre qué rutas del circuito van a tener retrasos más largos. En base a esto, colocamos algunos registros u otros elementos de almacenamiento en lugares apropiados (dentro de la parte combinacional) para reducir esta ruta crítica. Durante la síntesis, la herramienta optimizará las posiciones de los registros en función de los valores de retardo reales de las puertas sin alterar la funcionalidad del circuito.

El número de registros que coloca determina el número de etapas canalizadas en su circuito. Así que inicialmente decida un cierto número de etapas y sintetícelo para verificar si el diseño ha cumplido con las especificaciones. Si el diseño no ha cumplido con el tiempo y desea un circuito más rápido, independientemente del consumo de energía y área, luego aumente el número de etapas de la tubería.

Esto responde por qué agregaría registros. En mi ejemplo, se ha determinado que tres etapas son suficientes. Pero, ¿por qué dividiría la lógica combinatoria versus el uso de reprogramación de registros para lograr el objetivo final?