"Los ciclos delta son un concepto HDL que se usa para ordenar eventos que ocurren en tiempo físico cero". sigasi.com
Tomando la definición de Sigasi, qué VHDL llama a los ciclos de retardo, Verilog llama a un programador. La forma en que VHDL y Verilog determinan el orden de los eventos de tiempo cero es muy diferente.
VHDL es un simulador determinado donde ordena eventos de tiempo cero mediante la actualización de todo (los valores del ciclo anterior) antes de evaluar cualquier cosa en cada paso de tiempo.
Verilog es un simulador indeterminado donde ordena eventos de tiempo cero mediante el uso de un programador priorizado con cinco regiones (Nota: SystemVerilog tiene 17 regiones). Cada región se ejecuta en un orden de prioridad. Los eventos dentro de cada región se pueden ejecutar en cualquier orden. El evento puede programar (no ejecutar) nuevos eventos en cualquier región. Cuando una región termina de ejecutar sus eventos, el programador se mueve a la región de mayor prioridad que tiene eventos programados. La región final no programa eventos en el ciclo actual, programa eventos en pasos de tiempo futuros. Las regiones son:
- Región activa (antes de cualquier
#0
):
- Evaluar y asignar todas las asignaciones de bloqueo de procedimiento (
=
) (bloque always
)
- Evalúe y asigne todas las asignaciones continuas (
assign
enunciados)
- Evaluar asignaciones no bloqueantes
- Evaluar entradas y cambiar salidas de todas las primitivas
- Evaluar y generar llamadas
$display
y $write
llamadas
- Región inactiva:
- Agregue eventos adicionales al programador desde cada bloque de procedimiento hasta el siguiente
#0
- Procedimientos de devolución de llamada programados con rutinas PLI como
tf_synchronize()
(en desuso en IEEE 1364-2005) y vpi_register_cb(cbReadWriteSynch)
- Región NBA:
- Asignar las asignaciones sin bloqueo (
<=
)
- región del monitor
- Evalúe y escriba
$monitor
y $strobe
llamadas
- Llame a PLI con
reason_rosynchronize
(en desuso en IEEE 1364-2005)
- Región del futuro:
- Programe eventos para que ocurran
#N
(donde N>0
) en los pasos de tiempo en el futuro
En Verilog, un "ciclo delta" puede seguir el orden:
Active⇒Inactive⇒Active⇒NBA⇒Active⇒NBA⇒Inactive⇒NBA⇒Active⇒Monitor⇒Future
OR
Active⇒Inactive⇒NBA⇒Active⇒Monitor⇒Future
Puede parecer muy confuso y es posible entrar en un bucle infinito. Es algo que varios blogs y documentos de VHDL declaran una falla importante en Verilog . En realidad, cuando se sigue el estilo de codificación básico de solo usar asignaciones de bloqueo en bloques combinacionales y solo usar asignaciones no de bloqueo en bloques secuenciales, el típico "ciclo delta" de una simulación de Verilog RTL tendrá el siguiente aspecto:
Active(init & clk)⇒NBA(flop update)⇒Active(comb logic)⇒Future(schedule clk)
La primera región activa es para inicializar y actualizar el reloj. La mayor parte del diseño es NBA (actualización), luego Activo (evaluar), la misma ejecución que VHDL. Las otras regiones (incluidas las regiones adicionales de SystemVerilog) existen para la intención de modelado de comportamiento no sintetizable, enlaces a lenguajes externos (por ejemplo, C / C ++) y bancos de pruebas de verificación.
Añadiré que históricamente la región Inactiva se creó con diseño. Fue un intento fallido para determinar a qué valor debe asignarse un flop. La NBA se creó después y ha sido la solución recomendada desde entonces. Cualquier diseño que aún use la región Inactiva ( #0
de demoras) está siguiendo una práctica que ha estado obsoleta por aproximadamente 20 años o más.