¿Es una buena práctica asignar siempre un valor inicial y restablecer las señales en el diseño digital?

He leído que los valores iniciales de una señal se pueden establecer en un FPGA ya que el diseño se "carga en él" después del encendido. Sin embargo, en los ASIC solo podemos confiar en una señal de reinicio para poner todas las señales en un estado conocido. Por lo tanto, ¿es una buena práctica asignar un valor inicial a todas las señales en el código que se sintetizarán?

También he leído que las señales de reinicio hacen un uso intensivo de los recursos de enrutamiento en FPGA y también en ASIC requieren enrutamiento en todas partes. En los FPGA, no usar el reinicio en cada registro individual es una forma de reducir el uso de los recursos de enrutamiento, pero no estoy seguro de qué beneficio tiene en los ASIC. ¿Es una buena práctica encontrar formas de reducir el uso de la señal de reinicio en el diseño síncrono al no usarla en algunas partes del diseño pero sí en otras?

Respuestas (5)

Diría que hay un par de maneras diferentes en las que podría argumentar eso. No estoy seguro de cuál es el "mejor" método en general, dependerá de lo que esté tratando de lograr. Es fácil inicializar todo en el FPGA en HDL para que cuando salga de la rutina de configuración, todo comience desde un estado conocido. Sin embargo, por lo general, los reinicios son necesarios, incluso en un FPGA, debido a varias configuraciones de sincronización. En cuyo caso, NO inicializar las cosas puede tener más sentido, ya que entonces la propagación X se puede verificar en la simulación para asegurarse de que los restablecimientos estén haciendo su trabajo correctamente al restablecer los registros apropiados.

En términos de enrutamiento, tiene sentido averiguar qué es lo que REALMENTE se debe restablecer y luego omitir los restablecimientos en cosas donde la configuración inicial no importa. Esto ahorrará recursos de enrutamiento tanto en FPGA como en ASIC. Por ejemplo, cosas como buses de datos con señales válidas no necesitan NINGÚN bus de datos para restablecerse, solo las señales válidas. Si su bus de datos tiene 32 o 64 bits de ancho, solo restablecer las señales válidas reducirá significativamente la complejidad del circuito de restablecimiento. La complejidad de enrutamiento reducida puede conducir a una menor utilización de recursos y un cierre de tiempo más fácil. También permite que el sintetizador use las entradas de reinicio de los flip flops para otros fines, lo que podría simplificar la lógica y mejorar nuevamente el área y el tiempo.

Además, lo que restablece y cómo lo hace (sincronización frente a asíncrono, restablecimiento a 0 frente a restablecimiento a distinto de cero) puede afectar la forma en que el sintetizador puede inferir cosas como RAM. Los registros de canalización en el bloque de RAM no necesariamente tienen capacidades de reinicio o precarga, por lo que si su lógica de reinicio entra en conflicto con lo que es capaz de hacer el bloque de RAM en su chip de destino, entonces sus registros de canalización no se fusionarán y su rendimiento de tiempo y utilización de recursos sufrirá.

X para simulación, no para síntesis. El tiempo de configuración es el único momento en que se garantiza el comportamiento, por lo que debe usarlo. +1 para restablecimientos locales: xilinx.com/support/documentation/white_papers/wp272.pdf
Debería agregar que estará garantizado por su herramienta de síntesis, no por el código HDL en sí.

Para ninguna tecnología (FPGA o ASIC) debe confiar en la inicialización de la señal. Si necesita que sus puertas y señales se inicien en un estado conocido, use reinicios .

He leído que los valores iniciales de una señal se pueden establecer en un FPGA ya que el diseño se "carga en él" después del encendido.

No necesariamente. No es una función del estándar VHDL en sí mismo y, por lo tanto, depende del sintetizador/FPGA. Los FPGA de Xilinx y Altera son compatibles con esto, pero no es una industria dada. Por lo tanto, debe tener en cuenta que los diseños que se basan en inicializaciones sacrifican la portabilidad hasta cierto punto.

De hecho, Pedroni en Diseño de circuitos con VHDL afirma rotundamente que "el valor inicial [de las señales] no es sintetizable, solo se considera en simulaciones". ref. Sección 7.2

Además, las inicializaciones que realmente se realizan en configuraciones de estructura deben considerarse asíncronas y (dependiendo de su diseño) pueden resultar en violaciones de tiempo. Para referencia, consulte la página 89 de Xilinx UG470 - Configuración de FPGA de la serie 7 , donde el documento analiza el secuenciador de inicio. En concreto, véase la Nota 3:

  • GWE se afirma de forma síncrona con el reloj de configuración (CCLK) y tiene un sesgo significativo en la pieza. Por lo tanto, los elementos secuenciales no se liberan sincrónicamente con el reloj del sistema del usuario y pueden ocurrir violaciones de tiempo durante el inicio. Se recomienda restablecer el diseño después del inicio y/o aplicar alguna otra técnica de sincronización.

Sin embargo, en los ASIC solo podemos confiar en una señal de reinicio para poner todas las señales en un estado conocido.

Esto es exacto. Por lo tanto, en caso de que su diseño alguna vez se transfiera a la fabricación ASIC, tendrá que volver a trabajar mucho si su diseño no usa reinicios.

¿Es una buena práctica encontrar formas de reducir el uso de la señal de reinicio en el diseño síncrono al no usarla en algunas partes del diseño pero sí en otras?

Yo diría que esto constituiría una mala práctica. Una buena práctica sería diseñar siempre reinicios en sus módulos. Si decide que no necesita implementarlos, no los conecte y no se usarán, pero si luego descubre que sus restablecimientos desconectados son la fuente del error que ha estado buscando (no un escenario descabellado), será trivial conectarlos.

Finalmente, señalaré que el diseño de todos sus restablecimientos (en lugar de las inicializaciones) impide los restablecimientos parciales. ¿Cómo regresa por defecto a su estado de inicio en reinicios suaves sin un buen modelo de reinicio? (tú no)

Prefiero aserción asincrónica, reinicios de negación de sincronización en mi HDL; asegura que el chip esté en un estado conocido incluso si el reloj no está presente, pero también que el dispositivo sale del reinicio sin problemas. Esto es fácil de lograr en los dispositivos Altera al tener tanto clk como rst en la lista de sensibilidad y usar una construcción como if rst = '1' then... else if rising_edge(clk) then... end if;
@akohlsmith bastante justo. No quise enfatizar la sincronización sobre la asíncrona. Editaré eso.
La idea es que algunos bloques del diseño se hayan reiniciado, pero algunos bloques intermedios pueden no tenerlos y entrarán en un "estado conocido" antes de que el diseño realmente comience a usarlos. por ejemplo, bloques de procesamiento canalizados.
@ quantum231 Y eso podría funcionar bien. Tú conoces mejor tu proyecto. Escribí esto en términos de mejores prácticas y recomendaciones de Xilinx. También tenga en cuenta la posible necesidad de reinicios suaves. Y tenga en cuenta que es una buena idea escribir código como si planeara reutilizarlo en futuras aplicaciones (es decir, donde realmente necesite la línea de reinicio).

Analogía: ¿Es una buena práctica que los desarrolladores de juegos inicien el estado del juego cuando un usuario lo juega? Usuario 1: "Guau, comencé el juego casi al final y lo terminé... uhm... está bien", usuario 2: "Comencé desde el principio y tenía todo un juego para jugar, ¡bien!".

En ese caso es muy importante , porque importa mucho.

Si está trabajando con filtros digitales, entonces lo que sea con lo que inicialice los registros realmente no importa porque de todos modos es una mierda .

En este caso no es importante .

En otras palabras, depende de lo que realmente esté haciendo, si tiene un sistema de menús o algunas máquinas de estado finito, por lo general es muy importante. Depende 100% de usted, o de los errores que reciba (sé que Quartus puede arrojar algunos errores si no inicia las señales correctamente).

Recomiendo que siempre inicie cuando el sistema se reinicia, ese es un buen diseño en mi opinión , odiaría presionar "reiniciar" que no hace nada cuando/si un sistema falla.

Si veo que gran parte de los recursos de enrutamiento son solo para estados de inicio, entonces adquiriría un FPGA con más recursos, pero esa es solo mi opinión personal. Pero al final, depende de usted y de su futura empresa y cómo la va a utilizar. Si fuera más preciso con respecto a su uso, mi respuesta no habría sido tan general.


Si hubieras presentado algo más en este sentido:

Puedo iniciar cada estado de mi menú en mi FPGA si compro alguna FPGA con más recursos, esto me costará 10 dólares más por unidad, estaré vendiendo 1000 de estas. Así que son 10 mil dólares, una suma de dinero relativamente grande.

O bien, no inicia todos los estados del menú y cada vez que alguien abre el menú aparecen opciones aleatorias y no tiene que comprar otra FPGA. Estás ahorrando una suma de dinero relativamente grande .

"¿Qué debo hacer?", entonces diría que actualice su FPGA porque cualquiera que use su unidad no volverá para la próxima versión que venda. Entonces, puede ganar mucho dinero ahora, pero perder el 99% de sus clientes.


Digo "FPGA" en todas partes como sinónimo de FPGA y ASIC, los problemas son similares, si no idénticos.

Gran publicación y todos han dado excelentes respuestas aquí. Siempre se proporciona un restablecimiento sincronizado/asincrónico para inicializar los valores, para estar en el lado más seguro, durante el encendido. Esto es especialmente cierto en el caso de los ASIC. Es por eso que todos los procesadores, controladores, se inician con un reinicio de encendido. También proporcionan una forma de llevar el sistema a su estado inicial, en cualquier punto de operación. En el caso de los FPGA, la mayoría de los sintetizadores ahora sintetizan valores iniciales, incluso si no hay reinicio presente. En Altera, si hay una señal de reinicio asíncrono, el sintetizador es inteligente para encontrarla e inicializar los valores en consecuencia (no en el caso de reinicio de sincronización). Si se dan tanto el bloque de reinicio como los valores iniciales, altera muestra una advertencia si existe alguna discrepancia entre los valores en reinicio y los valores iniciales. Finalmente, los recursos de enrutamiento, la potencia y el rendimiento de todo el diseño dependen de si su restablecimiento es sincronizado o asincrónico. Lo puedes encontrar aquí:http://only-vlsi.blogspot.in/2009/05/synchronous-reset-vs-asynchronous-reset.html?m=1

Siempre uso reinicio sincrónico. Tengo una fuerte aversión hacia cualquier cosa asincrónica, ¿está de acuerdo con este enfoque? El reinicio surte efecto en el flanco ascendente del reloj.
Usualmente uso el reinicio asíncrono en FPGA, debido a su velocidad y alta prioridad sobre el reloj. Al reiniciar la sincronización, coloca una señal más en las rutas de tiempo y reduce el rendimiento. Por otro lado, el restablecimiento asíncrono es propenso a problemas de metaestabilidad en los ASIC. En los FPGA, esto lo rectifica automáticamente el sintetizador agregando lógica adicional. En los ASIC, tenemos que cuidarlo. Si lee esa publicación, dice que en ASIC, la aserción de sincronización y la anulación de aserción síncrona dan el mejor resultado.

Pedroni estaría equivocado en el contexto de los FPGA basados ​​en SRAM, en el contexto de ASIC estaría en lo correcto. Sin embargo, si escuchas a Harry Svensson, "FPGA en todas partes como sinónimo de FPGA y ASIC, los problemas son similares, si no idénticos", por lo que ahora es probable que esté equivocado.

La mejor práctica es comprender su arquitectura de destino, comprender el uso a largo plazo del código que está escribiendo, comprender qué implementará el sintetizador y el proceso de configuración (en el caso de FPGA) con su RTL. Escriba el código apropiado para su aplicación.