Práctica de diseño cruzando dominios de reloj y señales asíncronas

4

He estado diseñando algunos proyectos en diferentes FPGA's en VHDL, y parece que mi fuente más común de "errores difíciles de encontrar" es cuando me olvido de sincronizar una señal asíncrona, o me olvido de volver a sincronizar una señal que cruza los dominios del reloj.

Mi mejor arma hasta ahora, ha sido dibujar un esquema de los componentes.

Mi pregunta es, ¿cuál es la mejor práctica de diseño para evitar estos errores?

    
pregunta JakobJ

3 respuestas

5

Hoy en día, incluso los diseños FPGA pueden tener arquitecturas de temporización extremadamente complejas y muchas entradas asíncronas, lo que resulta en muchos problemas potenciales de los CDC.

Diría que los siguientes puntos constituyen un conjunto mínimo de "reglas de oro" para evitar los errores de los CDC:

  1. Mantenga un registro de todas las señales que cruzan dominios de reloj (diagramas, listas, hojas de cálculo, lo que encuentre más conveniente). Las señales de entrada asíncronas también deben incluirse.
  2. Todas las señales de la lista anterior deben estar sincronizadas, a menos que haya una razón clara por la que no.
  3. ¡Nunca sincronice señales de bits múltiples bit a bit! En su lugar, utilice esquemas de sincronización especiales para buses (sincronización FIFO, intercambio de ideas bidireccional, etc.).
  4. Si hay un reinicio asíncrono en el sistema, y este reinicio no se aplica a todos los flip-flops: todas las señales que se originan en este dominio de reinicio y pasan a la lógica de no reinicio deben tratarse como asíncronos (e incluirse en la lista del # 1)

Estoy seguro de que la lista anterior de prácticas está incompleta y se puede ampliar fácilmente.

También sugiero considerar las herramientas de verificación de los CDC (como Questa CDC de Mentor): estas herramientas utilizan técnicas formales para detectar automáticamente los problemas de los CDC en su diseño.

    
respondido por el Vasiliy
2

Algunas prácticas de nomenclatura pueden ser útiles:

  • Cualquier señal que atraviese un dominio de reloj debe tener el dominio con el que está sincronizado. Entonces, si tiene count en el dominio del reloj controlado por la señal clk (y necesita ir a otro dominio del reloj controlado por other_clk ), llámelo count_clk y count_other_clk .

  • Mantenga todo el código de sincronización de un dominio de reloj a otro en un lugar. Tal vez encapsúlala, dependiendo de cuánto haya. Coloque comentarios claros a su alrededor (por ejemplo, above here is clk , this is the domain crossing from clk to other_clk , below here is other_clk )

  • Las señales verdaderamente asíncronas pueden tener _async agregado al final.

Esto al menos hace que la revisión del código sea un poco más fácil de manejar, pero si tiene muchos dominios y muchos cruces, le beneficiará invertir en algunas herramientas para ayudar (como Spyglass por ejemplo, lo que hace mucho más que solo revisar dominios de reloj)

    
respondido por el Martin Thompson
1

Además de las respuestas anteriores:

Tiempo de informe

Use su herramienta de análisis de tiempo en su cadena de herramientas FPGA para encontrar cualquier señal que haya olvidado manejar correctamente.

Puede generar fácilmente una lista de transferencias de reloj sin restricciones, todas las cuales deben sincronizarse y agregarse una ruta falsa apropiada. Lo ideal es incrustar esto en su sistema de compilación para que falle con un error si hay transferencias de reloj sin restricciones, ¡entonces no puede olvidarse de ellas!

Código de reutilización

Tenga una sola entidad / módulo para realizar la sincronización de un solo bit, use un parámetro / genérico para controlar el número de registros en la cadena de resincronización. Es posible que desee un sincronizador separado para los restablecimientos.

Restricciones de inserción

La ventaja de reutilizar el código: incrusta las restricciones de ruta falsa en la RTL. De esa manera, no tiene que acordarse de agregar restricciones de tiempo para cada señal.

Una nota sobre la colocación

Los registros en las cadenas del sincronizador deben colocarse juntos para garantizar que se proporciona la ventana de tiempo máxima. Altera afirma que detecta automáticamente las cadenas del sincronizador para que no necesiten restricciones de ubicación. Si está paranoico con Xilinx, puede usar las restricciones de RLOC para asegurarse de que los registros de su sincronizador estén ubicados juntos (desafortunadamente, Altera no admite restricciones de ubicación relativas).

    
respondido por el Chiggs

Lea otras preguntas en las etiquetas