¿Por qué los retrasos no se pueden sintetizar en Verilog?

Siempre he leído que los retrasos declarados en el código RTL nunca se pueden sintetizar. Están destinados solo para fines de simulación y las herramientas de síntesis modernas simplemente ignorarán las declaraciones de retrasos en el código.

Por ejemplo: x = #10 y;será considerado como x = y;por la herramienta de síntesis.

¿Cuáles son las razones por las que no se pueden sintetizar las declaraciones de retraso en cualquier lenguaje de descripción de hardware (por ejemplo, VHDL, Verilog o Sytem-Verilog)?

Esta es una pregunta cruzada ya que se encuentra entre la superposición de SO y ElectronicsSE.

Respuestas (3)

Sintetizar significa convertir de alguna manera lo que ha descrito (en Verilog aquí) en hardware real .

Ahora en su Verilog dice que tiene un retraso de 50 ns. Ok, pero ahora, en términos de hardware, ¿cómo convertirías esto en hardware real?

Si está utilizando un FPGA, ¿cómo construiría realmente su retraso de 50 ns utilizando los recursos de FPGA disponibles (LUT, registros, elemento Ram, ...)? ¿Añadiendo retrasos de enrutamiento adicionales? ¡Imagina que especificas un retraso de 1 s! Imposible sin usar TODA la capacidad de enrutamiento de su chip (tal vez no lo suficiente). Su diseño no se puede ajustar. Lo mismo para un ASIC. Usaría el 80% de la superficie de silicio para agregar un retraso a UNA línea.

La forma en que se supone que funciona es que usa un diseño síncrono e implementa el retraso usted mismo usando contadores u otras técnicas. Pero los retrasos tienen que ser múltiplos del reloj de ese elemento.

Por lo general, encuentra cosas como "después de 10 ns" que son retrasos en la propagación. Al realizar una simulación ideal en un simulador Verilog, las salidas ocurren exactamente cuando cambian las entradas. Esto no es realista y no describe la forma en que funciona el hardware real. Para tener en cuenta eso, puede especificar después de cuánto tiempo se cambiará su salida: usando la declaración de retraso.

Señalaré que "porque ocuparía todo el chip" no es realmente una razón por la que algo no se pueda sintetizar, es una razón por la que algo no se puede ajustar o colocar dentro de los límites definidos.
@ W5VO Tienes razón. Se pretendía mostrar algo absurdo que justificaría buscar otro camino. Corregido.

Portando mi respuesta de SO . Que se centra en por qué no es práctico sintetizar retrasos absolutos

Al sintetizar árboles de reloj, la herramienta de síntesis los equilibra agregando retrasos para que todos los nodos reciban el reloj al mismo tiempo, por lo que parece que la herramienta de síntesis tiene la capacidad de agregar retrasos.

Sin embargo, cuando se fabrican ASIC, hay una variación en la velocidad, en un nivel alto, esto puede verse como Lento, Típico y Rápido. En la práctica hay cientos de variaciones de estos rincones donde ciertos tipos de dispositivos en el silicio corren rápido y otros lentos.

Estas esquinas del silicio también tienen una clasificación de temperatura, el peor de los casos puede ser +140C de silicio rápido y -40C de silicio lento. La variación del retardo a través de un buffer en este caso podría ser de 1ns a 30ns.

Para traer esto de vuelta a Verilog si #10fuera sintetizable, en realidad obtendría 155+-145, es decir, 10ns a 300ns, si también ha diseñado algo #20para ser parte de la misma interfaz o estructura de control, tendrá un rango de 20ns a 600ns . Por lo tanto, todo el asunto no es realmente válido contra su diseño. No obtienes los datos exactos #10y #20que fueron especificados.

Los árboles de reloj están diseñados para limitar los retrasos máximos y mínimos y para que todos los nodos en el árbol de reloj se escalen entre sí. Nunca se les da una regla tan estricta que debe ser #10ns ya que esto es físicamente imposible de garantizar en un circuito combinatorio.

La única unidad absoluta de tiempo sería la de un reloj externo. ¿De dónde vendría el retraso arbitrario? ¿Qué tipo de equivalente lógico digital discreto lo produciría a partir del reloj?

Si desea un retraso sintetizable, deberá usar la entrada de reloj externa y una máquina/contador de estado apropiado que contará para un número específico de ciclos de reloj.

Este pensamiento acaba de cruzar mi mente. ¿Por qué tenemos que confiar en el reloj para generar retraso? ¿Por qué no se puede sintetizar el retraso en un circuito RC simple con Vdd?
La síntesis principalmente llena valores en tablas de búsqueda y elementos de enrutamiento. Supongo que es mucho más difícil crear un circuito RC programable en campo, especialmente uno que no se vea demasiado afectado por la temperatura. Mucho más fácil sincronizar todo en el mismo borde del reloj que esperar tiempos de propagación exactos.