Restablecimiento: síncrono vs asíncrono

He estado trabajando con fpgas durante años y siempre usé reinicios sincrónicos para todas las partes (que lo necesitan) de mis circuitos. Ayuda a que el circuito se reinicie globalmente en un ciclo de reloj dado.

Sin embargo, me dijeron que en los circuitos ASIC, la gente tiende a usar el reinicio asíncrono en todas partes. Me pregunto por qué, y si también es el caso en algunos diseños de fpga. Me encantaría escuchar opiniones profesionales.

Gracias

Respuestas (5)

Parece que hay muchas opiniones sobre este.
Se dice que la aserción asíncrona, la desafirmación sincrónica es una buena práctica. Esto evita el problema de que el reloj no funcione (o funcione demasiado lento para capturar la señal de reinicio) en la aserción síncrona y la posible metaestabilidad en la desafirmación asíncrona.

Usaría un sincronizador de restablecimiento (dos FF) con la salida vinculada al resto de los restablecimientos de diseños:

Reiniciar

Un par de discusiones:
asíncrono y restablecimiento de sincronización
Cartas en sincronización vs. restablecimientos asíncronos

¿Cómo se comparan los requisitos de tiempo de configuración/retención entre la liberación de la señal de reinicio de un pestillo y su reloj con los de la entrada de datos? Me sentiría más cómodo si los pestillos del sistema vieran el final de la señal de reinicio en el borde del reloj inactivo. ¿Se garantizaría que el lanzamiento de un reinicio asíncrono en un borde de reloj activo no afecte el ciclo donde ocurre?
No, no se garantiza que la liberación del reinicio de forma asíncrona sea limpia debido al tiempo necesario de recuperación del reinicio (como configuración/retención). Es por eso que debería liberar el reinicio de forma sincrónica.
Mi pregunta es si hacer que latch1 libere la señal de reinicio que alimenta a latch2 en el mismo borde del reloj que latch2 estaría usando es completamente kosher, es decir, si el tiempo mínimo de propagación desde el reloj de latch1 hasta su salida satisfaría el requisito de retención para la entrada de reinicio de latch2. Por cierto, ¿qué piensas de mi respuesta anterior? El circuito que dibujó ofrece poca inmunidad a los pulsos cortos en la línea de reinicio, cuando debería ser posible una inmunidad casi total.
Luego de una consideración adicional, se podría agregar protección contra pulsos cortos agregando un tercer pestillo, y haciendo que su señal de reinicio asíncrono sea una versión suprimida por fallas de la señal alimentada a los dos primeros, de modo que una señal que perturbó asincrónicamente el tercer pestillo sería garantizado para restablecer limpiamente los dos primeros. Un pulso corto en la entrada de reinicio podría causar que la línea principal de reinicio en el chip obtenga un pulso corto, pero si ocurriera tal pulso, sería seguido por un pulso de reinicio síncrono.
Lo siento, creo que ahora veo lo que quieres decir. Si se refiere a la salida del segundo pestillo en el sincronizador para restablecer el FF del sistema, entiendo que el tiempo de recuperación del restablecimiento suele ser menor que el tiempo de configuración de datos para el mismo FF, por lo que debería estar bien. Estoy de acuerdo con los pulsos runt, no ofrece inmunidad a aquellos sin algo como lo que sugieres que se implemente.
La mayoría de las herramientas de temporización estática consideran la entrada de reinicio a los fracasos, por lo que la desafirmación sincrónica se puede temporizar correctamente en la síntesis y las comprobaciones de temporización estáticas extraídas del lugar y la ruta.

Favorecería un reinicio asíncrono sobre un reinicio síncrono por algunas razones (sin ningún orden en particular):

  • Agregar una función de configuración o restablecimiento asíncrono a un flip-flop probablemente dará como resultado un diseño más pequeño debido a la integración de la lógica en una sola celda (frente a un flip-flop no reiniciable con una puerta AND en la entrada)
  • Menos puertas dan como resultado cableado/lugar y ruta menos congestionados
  • Es un proceso más simple/más fácil para restablecer el chip (más fácil de usar/prueba)
  • Hacer que la ruta de reinicio sea asíncrona simplifica la partición del análisis de tiempo estático de la señal de reinicio
  • Un restablecimiento síncrono agregaría lógica adicional a la ruta crítica del flujo de datos y dificultaría el cumplimiento de los requisitos de configuración y mantenimiento.
  • Mientras que un FPGA tiene una función lógica arbitraria de 4-6 entradas en la entrada, usted "paga" por cada entrada en una puerta en un ASIC (más entradas = puerta más grande; funciones complejas = puertas múltiples)

En última instancia, no creo que ninguno de estos problemas sea un impedimento, pero definitivamente contribuirían a una fuerte preferencia por el reinicio asíncrono en los ASIC.

Un peligro con el uso de restablecimientos asincrónicos en la lógica interna de uno es que un pulso corto en la entrada de restablecimiento puede causar cualquier tipo de caos. Si uno va a permitir que el circuito de uno se reinicie de forma asíncrona, uno debe diseñar el circuito de entrada de tal manera que garantice que cualquier pulso de reinicio suficiente para causar posiblemente cualquier tipo de reinicio asíncrono para alcanzar el circuito interno también estará garantizado para causar que se produzca un reinicio síncrono.

El restablecimiento asincrónico con anulación sincrónica funciona muy bien. Como se mencionó anteriormente, los fracasos de restablecimiento asíncrono son más pequeños y no requieren un reloj activo para garantizar el restablecimiento, por lo que puede forzar el restablecimiento de una parte (generalmente un estado conocido de bajo consumo) con solo alimentación y un solo pin cableado o fuente de alimentación. en reinicio

Si realmente quiere profundizar en esto, puede leer los artículos de Cumming sobre esto, en particular:

http://www.sunburst-design.com/papers/CummingsSNUG2003Boston_Resets.pdf

Salud.

Una cuestión que creo que el Sr. Cummings pasa por alto en su artículo es que, si bien los detectores de fallas pueden suprimir lo que de otro modo serían pulsos cortos, también pueden convertir lo que serían pulsos de longitud legítima en pulsos cortos. El efecto de esto es que un pulso que tiene la longitud correcta podría alterar arbitrariamente el estado del sistema sin causar un reinicio adecuado. Dado que es muy difícil evitar la metaestabilidad en todos los casos sin doble sincronización, sugeriría tener dos circuitos de captura asíncrona, uno de los cuales tiene un criterio de detección de fallas 'más estricto', y luego...
... organice las cosas de modo que una falla breve pueda o no causar un reinicio uno o dos ciclos más tarde, pero un pulso lo suficientemente largo provocará un reinicio inmediato. Además, si bien el uso de entradas de 'restablecimiento asíncrono' en flip flops puede ayudar a la síntesis en algunas topologías, eso no significa que deban usarse de forma asíncrona. Puede ser útil tener la mayoría de las señales de reinicio internas sincronizadas con el reloj, incluso cuando se activan entradas de "reinicio asíncrono" en los pestillos.
Cummings dice que los filtros de falla "son feos". Nunca he visto uno en los circuitos integrados en los que he trabajado. Tendemos a usar disparadores Schmitt en todas las celdas del pad de entrada para evitar estos problemas, y los reinicios de encendido que uso se limpian de manera similar. Por cierto, ¿en qué casos tendría pulsos cortos en una línea de reinicio? He visto esto en algunos escenarios de prueba de escaneo, pero todavía están en el orden de un ciclo de reloj de largo, sin pulsos cortos con un propósito. En su último comentario, la anulación del reinicio debe sincronizarse con el reloj para evitar violaciones de s/h en el reinicio y asegurarse de que todos los fracasos salgan del reinicio en el mismo borde.
Los filtros de falla suelen ser útiles para determinar qué tipos de entradas pueden causar metaestabilidad, pero no eliminan los estados metaestables. El objetivo con un filtro de falla debe ser garantizar que cualquier estado metaestable que pueda ocurrir se encuentre en situaciones de "no importa". A veces es necesario que un dispositivo sea capaz de restablecer otro dispositivo que está conectado a él. A menos que el cable de reinicio esté doblemente sincronizado, existirá el riesgo de pulsos cortos debido a eventos ESD cercanos y otras molestias similares.
En cuanto al último punto, simplemente decía que incluso uno está sintetizando un diseño en hardware que proporciona entradas de reinicio asíncronas "gratuitas" en flip flops, eso no significa que uno no pueda sincronizar completamente la señal con el reloj principal en ambos afirmación y liberación. Las señales orientadas hacia el exterior pueden tener que reaccionar de forma asíncrona a una entrada de reinicio, pero eso no significa que uno deba reiniciar de forma asíncrona todos los pestillos. De hecho, para evitar estados inconsistentes, puede ser útil tener todos los pestillos menos dos en el diseño sincrónico.
Un pestillo asíncrono indica que puede haber habido un pulso de reinicio desde el último reinicio "reconocido"; el otro indica que ciertamente lo hubo. Todas las salidas son una función combinatoria de segundo latch asíncrono y lógica síncrona.

Otro enfoque, que parecería incluso más seguro que el enfoque de 'afirmación asincrónica/liberación sincronizada', sería tener un detector de reinicio asincrónico (como se describe en otra parte, con 'afirmación' asincrónica y 'liberación' sincrónica), pero tener la salida de que bloquean cualquier dispositivo de E/S orientado hacia el exterior sin restablecer nada de forma asíncrona (aparte del pestillo en el detector mismo). Si se utilizan dos detectores de reinicio asíncronos, uno para las líneas de E/S y otro para alimentar el detector de reinicio síncrono, y si se diseña uno para las líneas de E/S de modo que solo se dispare mediante pulsos de reinicio que sean lo suficientemente fuertes para disparar el detector principal, uno puede evitar incluso que las salidas fallen en los casos en que no se va a reiniciar la CPU. Tenga en cuenta que si hace esto, un pulso de restablecimiento de longitud legítima restablecerá las salidas de forma asíncrona,

Otra cosa a considerar es que los sistemas a menudo tienen algunos registros que no deberían verse afectados por un reinicio. Si un reinicio asincrónico pudiera afectar a los circuitos que escriben en esos registros, sería posible que un pulso de reinicio que llega en el momento equivocado golpee esos registros, incluso si es un pulso limpio (que no se ejecuta). Por ejemplo, si el código intenta escribir en la dirección 1111 y un restablecimiento asíncrono llega justo antes de que un pulso de reloj fuerce uno de los pestillos de dirección a cero justo cuando llega el pulso de reloj, eso podría causar una escritura errónea en la dirección 1110. Mientras uno podría usar múltiples líneas de reinicio interno con retrasos combinatorios para garantizar que las escrituras de registro se deshabilitaran antes de que la dirección fuera golpeada, el uso de la lógica de reinicio interno síncrono evita el problema por completo.

Por cierto, aquí hay un circuito que ilustra el concepto. Cerca de la esquina inferior izquierda hay dos entradas lógicas para restablecer. Uno generará un pulso de reinicio "limpio" y el otro generará uno realmente desagradable. El LED amarillo indica reinicio del sistema principal; el LED cian indica la activación de E/S. Pulsar un reinicio limpio provocará un "reinicio" inmediato de las salidas; presionar un reinicio repulsivo provocará un reinicio retrasado de las salidas o no las afectará (en el simulador, no hay forma de causar el caso de 'no afectarlas').

Creo que esto suena como una buena idea. tantos tonos de gris con cosas aparentemente simples como reiniciar.

Como ingeniero experimentado ( 3 años con diseño de FPGA y sistemas integrados ), le digo que debe consultar la hoja de datos y la guía del usuario de FPGA. No es una respuesta simple.

Debe hacer que su diseño SE AJUSTE al tipo de FPGA que eligió. Algunos FPGA tienen FlipFlops que fueron diseñados para el reinicio Async, algunos están diseñados para el reinicio Sync.

Debe consultar la guía del usuario de FPGA para saber qué tipo de FlipFlops tiene.

El Implementador/Mapeador elegirá rutas dedicadas para su restablecimiento ( el código puede ejecutarse a mayor frecuencia y ocupa menos espacio ) si hace coincidir su código con el tipo de primitivas FPGA.

Su diseño funcionará en CUALQUIER caso , pero a veces el implementador de FPGA hará todo lo posible para que su lógica funcione ( agrega más lógica ), pero eso causará una frecuencia máxima más baja y/o más recursos de FPGA.

Ejemplo: probado con ZYNQ de Xilinx ( FPGA está diseñado para reinicio sincronizado; consulte la guía de usuario de primitivas ). Al cambiar el reinicio de asíncrono a sincronizado , la frecuencia máxima estable pasó de 220 MHz a 258 MHz , por lo que pasé mi margen de frecuencia.

También podría agregar que el Implementador no sabe qué es un reloj y una señal de reinicio. Asigna pines flip-flop a las señales por ORDEN, no por nombre. Entonces, en algunos FPGA, el implementador elige la primera señal después del "inicio del proceso ()" en VHDL como el reloj, en algunos como el reinicio, dependiendo de en qué FPGA esté configurado el implementador.

No estoy de acuerdo con su afirmación de que "el Implementador no sabe qué es un reloj y una señal de reinicio". Las herramientas de síntesis infieren cuál es el reloj y cuál se restablece según la forma en que se usan. La señal de reloj se usa con una especificación de borde, el reinicio no. Además, cualquier flip-flop se puede usar con una especificación de restablecimiento síncrono y, como observó, esto a menudo conduce a rutas críticas más rápidas.