Comprender la semántica de programación en Verilog: Temporización, eventos y orden de ejecución
El diseño y testbench de Verilog típicamente tienen muchas líneas de código que comprenden bloques always o initial, asignaciones continuas y otras declaraciones procesuales que se vuelven activas en diferentes momentos en el transcurso de una simulación.
Cada cambio en el valor de una señal en el modelo Verilog se considera un evento de actualización (update event). Y los procesos como bloques always y assign que son sensibles a estos eventos de actualización se evalúan en un orden arbitrario y se llama evento de evaluación (evaluation event). Dado que estos eventos pueden ocurrir en diferentes momentos, se gestionan mejor y se asegura su correcto orden de ejecución programándolos en colas de eventos (event queues) que se organizan por tiempo de simulación.
module tb;
reg a, b, c;
wire d;
// 'always' es un proceso que se evalúa cuando 'a' o 'b' se actualiza.
// Cuando 'a' o 'b' cambia de valor se llama 'evento de actualización'.
// Cuando el bloque 'always' se dispara por un cambio en 'a' o 'b' se llama
// evento de evaluación
always @ (a or b) begin
c = a & b;
end
// Aquí 'assign' es un proceso que se evalúa cuando 'a' o 'b' o 'c'
// se actualizan
assign d = a | b ^ c;
endmodule
Cola de eventos
Un paso de simulación puede segmentarse en cuatro regiones diferentes. Una cola de eventos activa es solo un conjunto de procesos que necesitan ejecutarse en el tiempo actual lo que puede resultar en más procesos programados en colas activas u otras colas de eventos. Los eventos pueden agregarse a cualquiera de las regiones, pero siempre se eliminan de la región activa.
- Activos eventos ocurren en el tiempo de simulación actual y pueden procesarse en cualquier orden.
- Inactivos eventos ocurren en el tiempo de simulación actual, pero se procesan después de que todos los eventos activos se procesen.
- Asignación no bloqueante eventos que fueron evaluados previamente se asignarán después de que todos los eventos activos e inactivos se procesen.
- Monitor eventos se procesan después de todos los eventos activos, inactivos y asignaciones no bloqueantes.
Cuando todos los eventos en la cola activa para el paso de tiempo actual se han ejecutado, el simulador avanza el tiempo al siguiente paso de tiempo y ejecuta su cola activa.
module tb;
reg x, y, z;
initial begin
#1 x = 1;
y = 1;
#1 z = 0;
end
endmodule
La simulación comienza en tiempo 0, y la primera declaración se programa para ejecutarse cuando el tiempo de simulación alcanza 1 unidad de tiempo en la que asigna x e y a 1. Esta es la cola activa para el tiempo actual que es 1 unidad de tiempo. El simulador entonces programa la siguiente declaración después de 1 unidad de tiempo más en la que z se asigna 0.
¿Qué hace la simulación no determinista?
Pueden haber condiciones de carrera durante la simulación que terminen dando diferentes salidas para el mismo diseño y testbench. Una de las razones del comportamiento no determinista es porque los eventos activos pueden eliminarse de la cola y procesarse en cualquier orden.
Verilog
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Dominar la concatenación en Verilog: Guía práctica
- Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
- Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
- Dominar las funciones en Verilog para diseño RTL eficiente
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
- Generador de reloj en Verilog: Guía de diseño e implementación
- Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
- Dominar $timeformat en Verilog: Control de precisión y visualización
- Comprender e imprimir timescales de Verilog en cualquier alcance
- Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar