FPGA canalización automática?

5

Tengo un camino de datos síncrono en mi diseño que falla la verificación negativa de la sincronización, y lo más probable es que pueda corregirlo poniendo registros adicionales en la tubería entre los bloques de datos al cambiar las fuentes de RTL.

También he intentado restringir la ruta de varios ciclos como esta (hizo un proyecto de prueba simple para descubrir cómo funcionan las restricciones de tiempo, son nuevas para mí):

# tell the router that 'do' should be 5 cycles late
set_multicycle_path -setup 5 -to [get_ports {do}] 

Por alguna razón, esperé que el enrutador pusiera registros adicionales en la ruta para 'hacer' el puerto de salida para aumentar la latencia, pero trató de hacer una red muy larga y todavía no pudo alcanzar la sincronización. Ahora sospecho que, dado que la canalización implica cambiar el comportamiento de RTL, el enrutador y sus controles de tiempo no tienen nada que ver con eso, y esas restricciones son solo para establecer los requisitos de tiempo.

Entonces traté de hacer esto:

# don't care how fast the route is as long as it's up
# to 5 cycles
set_multicycle_path -setup 5 -to [get_ports {do}]
set_multicycle_path -hold 4 -to [get_ports {do}]

Este tiempo fijo se comprueba, pero aún no hay canalización adicional y ahora no puedo estar seguro de qué tan rápido es el camino a menos que específicamente mire el tiempo. Creo que esto se convertiría en un problema al restringir un bus de esa manera, ya que las diferentes líneas podrían pasar la verificación de la temporización, pero aún podrían estar fuera de alineación entre sí.

Entonces, aquí está la pregunta: ¿hay alguna manera de hacer que las herramientas FPGA hagan el trabajo de averiguar cuánto necesita canalizar un camino y luego insertarlo automáticamente?

    
pregunta Alexei

2 respuestas

3

En primer lugar, las restricciones de tiempo no se utilizan para agregar lógica. El propósito de estas restricciones es decirle a las herramientas de análisis de tiempo estático (STA) lo que hace su lógica. El énfasis está en su lógica . Es su trabajo como diseñador del circuito agregar cualquier tubería que pueda ser necesaria en el HDL.

En segundo lugar, el set_multicycle_path no está diseñado para explicar los registros de canalización. El propósito de esto es decirle a las herramientas de STA sobre un registro que tiene un reloj habilitado con un período conocido.

Vamos a usar un ejemplo. Si tiene una ruta de datos entre dos registros que solo se sincronizan una vez cada 5 ciclos, puede establecer una restricción de ruta de múltiples ciclos entre los dos registros para que las herramientas STA sepan que los retrasos de propagación para esa ruta pueden ser de 5 ciclos de reloj sin causar violaciones de configuración. Esto no agrega lógica, por lo tanto, a menos que implementes lo que has restringido, la restricción no será válida y ocultará posibles infracciones de tiempo.

La canalización no es nada como una ruta de varios ciclos. Si bien para obtener datos de un registro de "entrada" a un registro de "salida" es posible que tenga varios registros en una cadena, la ruta entre cada registro es todavía solo una vez el ciclo del reloj, por lo que no es una ruta de varios ciclos. La razón por la que funciona la canalización es que toma una ruta combinacional larga y en lugar de esperar varios ciclos antes de registrar la salida, en lugar de eso, agrega registros para dividir el cálculo en pasos más cortos.

Las herramientas de síntesis no pueden agregar esta canalización por usted por la sencilla razón de que al agregar registros de tubería se cambia la latencia del diseño. ¿Podría imaginarse tratando de comparar dos números en un diseño, uno de una ruta combinatoria corta, el otro de una larga, solo para encontrar que las herramientas agregaron 5 ciclos de canalización a la ruta larga? Todo tu diseño quedaría desincronizado.

    
respondido por el Tom Carpenter
5

No tengo conocimiento de ninguna herramienta que tenga esa opción. Lo más cercano es el soporte de 'registro de equilibrado' en, por ejemplo, Síntesis de sinopsis. Allí USTED coloca X etapas de registro en la salida y la herramienta las empuja en el diseño para obtener el cierre de tiempo. No sé hasta qué punto esto es compatible con las herramientas de síntesis de otros proveedores. Lo que estás haciendo es absolutamente incorrecto! No puede simplemente establecer una ruta de varios ciclos y "encontrar" que su problema ha desaparecido. El error de sincronización sigue ahí, su circuito seguirá fallando, pero la herramienta no hará nada al respecto. Entonces, en lugar de un error, ahora tiene un error que la herramienta ignora.

  

Este chequeo de tiempo fijo

¡No lo hace! Lo que estás haciendo es absolutamente incorrecto! No puede simplemente establecer una ruta de varios ciclos y "encontrar" que su problema ha desaparecido. El error de sincronización sigue ahí, su circuito seguirá fallando, pero la herramienta no hará nada al respecto. Por lo tanto, en lugar de un error, ahora tiene un error que la herramienta ignora.
Existen numerosos escollos con las rutas de múltiples ciclos. Esto puede sonar pedante, pero: por lo que leí, creo que no debes tocar la configuración de la ruta de varios ciclos hasta que tengas más experiencia y sepas lo que estás haciendo.
El más cercano a la resolución "automática" de su problema es:

  • Verifique si su herramienta tiene registro de balanceo.
  • Si es así, tome su holgura negativa y divídala por el período de reloj.
  • Redondea el número al entero más cercano.
  • Agregue ese número de etapas de registro en la salida.
  • Síntesis con registro equilibrado en.

De lo contrario, volverá a tener que averiguar cuál es el mejor lugar para colocar una etapa de registro.

    
respondido por el Oldfart

Lea otras preguntas en las etiquetas