Semântica de agendamento Verilog
O design Verilog e o testbench normalmente têm muitas linhas de código compostas por
always
ou initial
blocos, atribuições contínuas e outras instruções de procedimento que se tornam ativas em momentos diferentes no decorrer de uma simulação. Cada mudança no valor de um sinal no modelo Verilog é considerada um evento de atualização . E processos como
always
e assign
os blocos que são sensíveis a esses eventos de atualização são avaliados em uma ordem arbitrária e são chamados de evento de avaliação . Como esses eventos podem acontecer em momentos diferentes, eles são melhor gerenciados e garantidos de sua ordem correta de execução agendando-os em filas de eventos que são organizados por tempo de simulação.
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
Fila de eventos
Uma etapa de simulação pode ser segmentada em quatro regiões diferentes. Uma fila de eventos ativa é apenas um conjunto de processos que precisam ser executados no momento atual, o que pode resultar em mais processos a serem agendados em filas de eventos ativos ou outras. Os eventos podem ser adicionados a qualquer uma das regiões, mas sempre removidos do ativo região.
- Ativo os eventos ocorrem no momento da simulação atual e podem ser processados em qualquer ordem.
- Inativo os eventos ocorrem no momento da simulação atual, mas são processados após o processamento de todos os eventos ativos
- Atribuição sem bloqueio os eventos que foram avaliados anteriormente serão atribuídos após o processamento de todos os eventos ativos e inativos.
- Monitorar os eventos são processados após a conclusão de todas as atribuições ativas, inativas e não bloqueantes.
Quando todos os eventos na fila ativa para o passo de tempo atual foi executado, o simulador avança o tempo para a próxima etapa de tempo e executa sua fila ativa.
module tb;
reg x, y, z
initial begin
#1 x = 1;
y = 1;
#1 z = 0;
end
endmodule
A simulação começa no tempo 0, e a primeira instrução é programada para ser executada quando o tempo de simulação atinge 1 unidade de tempo na qual ele atribui x e y a 1. Esta é a fila ativa para o tempo atual que é 1 unidade de tempo. O simulador então agenda a próxima instrução após mais 1 unidade de tempo na qual z é atribuído a 0.
O que torna a simulação não determinística?
Pode haver condições de corrida durante a simulação que acabem dando saídas diferentes para o mesmo projeto e bancada de teste. Uma das razões para o comportamento não determinístico é porque ativo os eventos podem ser removidos da fila e processados em qualquer ordem.
Verilog