¿Razón detrás del retraso de la canalización de funciones de división de Altera?

En Quartus II, la función estándar lpm_divide tiene un parámetro PIPELINE_DELAY. El valor predeterminado es floor(WIDTH_Q div 2)- donde WIDTH_Q :=ancho del cociente en bits.

Tengo curiosidad por qué este es un parámetro allí para que el usuario cambie (en lugar de simplemente ser lo que sea), y no puedo ver por qué este valor predeterminado es el caso.

Respuestas (1)

Un divisor es una serie de sustracciones y multiplexores que seleccionan el valor para el siguiente paso. Si se hace de forma puramente combinatoria, entonces la ruta crítica a través de toda esta lógica es bastante larga (incluso con la anticipación de acarreo en los restadores) y el ciclo del reloj debe ser muy lento.

Pero el proceso es fácil de canalizar y la cantidad de etapas de canalización que puede usar es bastante arbitraria. Puede insertar un registro de canalización después de cada par subtract-mux, o puede optar por hacer dos o más etapas de subtract-mux por registro de canalización (dos parece ser el valor predeterminado). Incluso podría ir tan lejos como canalizar las sustracciones y muxes por separado (o incluso canalizar dentro de cada sustracción) para obtener la velocidad de reloj más rápida posible, pero esto sería bastante extremo.

Cuantos más registros de canalización use, más corta puede ser la ruta crítica (y el período de reloj), pero usa más recursos (los registros). Además, la latencia general aumenta, ya que debe tener en cuenta los tiempos de configuración y propagación de los registros de canalización en el período del reloj (además de los retrasos lógicos de restar mux). Esto se multiplica por el número de etapas de canalización para calcular la latencia total.

Esta es la razón por la que le dan el control de este parámetro: es para que pueda seleccionar la compensación correcta para su aplicación en particular.

Tenga en cuenta que, independientemente del valor de este parámetro, con este módulo obtiene un resultado por ciclo de reloj. Si no necesita este nivel de rendimiento, usaría un módulo diferente que calcula el cociente en serie, uno (o posiblemente más de uno) bit a la vez.