Entendendo Semântica de Escalonamento em Verilog: Timing, Eventos e Ordem de Execução
Design e testbench Verilog típicos têm muitas linhas de código com blocos always ou initial, atribuições contínuas e outras instruções procedurais que ficam ativas em diferentes tempos na simulação.
Toda mudança de valor de sinal no modelo Verilog é considerada um evento de atualização (update event). Processos como always e blocos assign sensíveis a estes eventos são avaliados em ordem arbitrária = evento de avaliação (evaluation event). Como eventos acontecem em tempos diferentes, são gerenciados e ordenados corretamente agendando-os em filas de eventos (event queues) organizadas por tempo de simulação.
module tb;
reg a, b, c;
wire d;
// 'always' é processo avaliado quando 'a' ou 'b' atualizado
// Mudança em 'a' ou 'b' = 'update event'
// 'always' disparado por mudança = 'evaluation event'
always @ (a or b) begin
c = a & b;
end
// 'assign' é processo avaliado quando 'a', 'b' ou 'c' atualizados
assign d = a | b ^ c;
endmodule
Fila de Eventos (Event Queue)
Um passo de simulação pode ser segmentado em quatro regiões. Fila ativa = conjunto de processos para executar no tempo atual, podendo agendar mais processos na ativa ou outras filas. Eventos podem ser adicionados a qualquer região, mas sempre removidos da ativa.
- Active: ocorrem no tempo atual, processados em qualquer ordem
- Inactive: ocorrem no tempo atual, processados após todos ativos
- Nonblocking assign: avaliados anteriormente, atribuídos no tempo atual após ativos e inativos
- Monitor: processados após ativos, inativos e nonblocking
Quando todos eventos na fila ativa do passo de tempo atual executados, simulador avança tempo para próximo passo e executa sua fila ativa.
module tb;
reg x, y, z;
initial begin
#1 x = 1; y = 1;
#1 z = 0;
end
endmodule
Simulação inicia no tempo 0, primeira instrução agendada para tempo 1 (atribui x=1, y=1). Fila ativa para tempo 1. Simulador agenda próxima instrução após 1 unidade (tempo 2) onde z=0.
O que torna simulação não-determinística?
Podem haver condições de corrida (race conditions) dando saídas diferentes para mesmo design/testbench. Uma razão: eventos ativos podem ser removidos da fila e processados em qualquer ordem.
Verilog
- Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
- Dominando Concatenação Verilog: Guia Prático
- Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
- Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
- Dominando Funções em Verilog para Design RTL Eficiente
- Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
- Gerador de Clock Verilog: Guia de Design e Implementação
- Dominando Funções Matemáticas do Verilog para Design de Hardware Eficiente
- Dominando $timeformat do Verilog: Precisão e Controle de Exibição
- Entendendo e Imprimindo Timescales do Verilog em Qualquer Escopo