Semántica de programación de Verilog
El diseño y el banco de pruebas de Verilog suelen tener muchas líneas de código que comprenden always
o initial
bloques, asignaciones continuas y otras declaraciones de procedimiento que se activan en diferentes momentos en el curso de una simulación.
Cada cambio en el valor de una señal en el modelo Verilog se considera un evento de actualización . Y procesos como always
y assign
los bloques que son sensibles a estos eventos de actualización se evalúan en un orden arbitrario y se denominan evento de evaluación . Dado que estos eventos pueden ocurrir en diferentes momentos, se administran mejor y se garantiza su orden correcto de ejecución programándolos en colas de eventos que están organizados por tiempo de simulación.
module tb;
reg a, b, c;
wire d;
// 'always' is a process that gets evaluated when either 'a' or 'b' is updated.
// When 'a' or 'b' changes in value it is called an 'update event'. When 'always'
// block is triggered because of a change in 'a' or 'b' it is called an evaluation
// event
always @ (a or b) begin
c = a & b;
end
// Here 'assign' is a process which is evaluated when either 'a' or 'b' or 'c'
// gets updated
assign d = a | b ^ c;
endmodule
Cola de eventos
Un paso de simulación se puede segmentar en cuatro regiones diferentes. Una cola de eventos activa es solo un conjunto de procesos que deben ejecutarse en el momento actual, lo que puede dar lugar a que se programen más procesos en colas activas u otras colas de eventos. Los eventos se pueden agregar a cualquiera de las regiones, pero siempre se eliminan de las activas región.
- Activo los eventos ocurren en el momento actual de la simulación y se pueden procesar en cualquier orden.
- Inactivo los eventos ocurren en el tiempo de simulación actual, pero se procesan después de que se procesen todos los eventos activos
- Asignación sin bloqueo los eventos que se evaluaron previamente se asignarán después de que se procesen todos los eventos activos e inactivos.
- Supervisar los eventos se procesan después de realizar todas las asignaciones activas, inactivas y sin bloqueo.
Cuando todos los eventos en la cola activa para el paso de tiempo actual ha sido 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 el tiempo 0 y la primera instrucción está programada 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. Luego, el simulador programa la siguiente declaración después de 1 unidad de tiempo más en la que se asigna 0 a z.
¿Qué hace que la simulación no sea determinista?
Puede haber condiciones de carrera durante la simulación que terminen dando resultados diferentes para el mismo diseño y banco de pruebas. Una de las razones del comportamiento no determinista es que activo los eventos se pueden eliminar de la cola y procesar en cualquier orden.
Verilog
- Tutorial de Verilog
- Concatenación Verilog
- Asignaciones de Verilog
- Bloqueo y no bloqueo de Verilog
- Funciones de Verilog
- Tarea Verilog
- Generador de reloj Verilog
- Funciones matemáticas de Verilog
- Formato de hora de Verilog
- Alcance de la escala de tiempo de Verilog
- Operaciones de E/S de archivos de Verilog