Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

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.

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

  1. Dominar Verilog: Tutorial completo para diseño de circuitos digitales
  2. Dominar la concatenación en Verilog: Guía práctica
  3. Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
  4. Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
  5. Dominar las funciones en Verilog para diseño RTL eficiente
  6. Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
  7. Generador de reloj en Verilog: Guía de diseño e implementación
  8. Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
  9. Dominar $timeformat en Verilog: Control de precisión y visualización
  10. Comprender e imprimir timescales de Verilog en cualquier alcance
  11. Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar