Atrasos de Atribuição
Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 69 de 90.
Nas lições anteriores, abordamos atrasos gerais (#10 a = b;) e atrasos de portas (and #5 (out, a, b);). Agora abordaremos os atrasos de atribuição, que são atrasos que ocorrem dentro de um bloco procedural (como initial ou always) como parte de uma instrução de atribuição.
Um atraso de atribuição aguarda um tempo especificado e, em seguida, realiza a atribuição. O atraso é colocado após o símbolo # e antes da atribuição.
Sintaxe:
variable = #delay expression;Ao contrário de um delay geral #10 a = b; (delay e depois atribuição), um assignment delay a = #10 b; obtém o valor de b naquele momento, espera 10 unidades de tempo e, então, atribui esse valor a a.
Atraso de atribuição vs. atraso geral
| Atraso geral | Atraso de atribuição | |
|---|---|---|
| Sintaxe | #10 a = b; | a = #10 b; |
| Quando o valor é lido? | No momento da atribuição (após o atraso) | Imediatamente (antes do atraso) |
| Qual valor é atribuído? | Valor de b naquele momento | Valor de b no tempo 0 (ou no momento da leitura) |
| Quando o valor é atribuído? | Após o atraso | Após o atraso |
Exemplo: A diferença
initial begin
b = 1;
#5 b = 0;
// Atraso geral
#10 a1 = b; // Espera 10, depois lê b (b=0) → a1=0
// Atraso de atribuição
a2 = #10 b; // Lê b agora (b=0), espera 10, depois atribui → a2=0
endAmbos dão o mesmo resultado aqui. A diferença aparece quando b muda durante o atraso.
Exemplo da diferença principal
To show b changing during the delay, we need two separate initial blocks that run in parallel:
initial begin
b = 1;
a1 = #10 b; // Lê b=1 no tempo 0, atribui a1=1 no tempo 10
end
initial begin
#5 b = 0; // Altera b para 0 no tempo 5 (durante o atraso)
end- No tempo 0:
a1lêb = 1 - No tempo 5:
bmuda para0(enquantoa1ainda está aguardando) - No tempo 10:
a1recebe1(o valor lido no tempo 0), não0
Com um atraso geral #10 a2 = b; em um bloco separado, b seria lido no tempo 10 (valor 0).
Regras importantes
| Regra | Explicação |
|---|---|
= vem antes de # | a = #10 b;, não a #10 = b; |
| O valor é lido imediatamente | O lado direito é avaliado imediatamente |
| A atribuição acontece após o atraso | O lado esquerdo recebe o valor posteriormente |
| Apenas para blocos procedurais | Usado em initial ou always |
Desafio
O que fazer:
Adicione o atraso de atribuição ausente para que a receba o valor de b após 15 unidades de tempo, mas leia b imediatamente.
Experimente você mesmo
module assignment_challenge;
reg a, b;
// Bloco separado para alterar b durante o atraso
initial begin
b = 1;
// TODO: Adicionar atraso de atribuição
// a deve receber b após 15 unidades de tempo
// Ler b agora, atribuir após o atraso
end
initial begin
#5 b = 0; // Altera b durante o atraso
#20 $display("Time %0t: a = %b", $time, a);
$finish;
end
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs. SoftwareSeu primeiro móduloComentáriosNíveis de abstração de projeto4Operadores Parte 1
Operadores aritméticosOperador móduloOperadores de comparaçãoRecapitulação - Matemática simplesOperadores bit a bit7Atribuições e Portas
Atribuição ContínuaAtribuição com OperadoresPrimitivas de Portas IntegradasPortas AND, OR e NOTPortas XOR e XNORRecapitulação - Circuito de Portas Lógicas10Tomada de Decisões
Declaração IfIf - ElseRevisão - Comparador SimplesDeclaração CaseCasex e CasezRevisão - Projeto de ALU13Temporização e Atrasos
O Que São AtrasosAtrasos de PortasAtrasos de AtribuiçãoDiretiva de Escala de TempoGeração de ClockRevisão - Controle de Temporização2Tipos de Dados
Tipo WireTipo RegInteiro e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores - Parte 2
Operadores lógicosOperadores de reduçãoOperadores de deslocamentoOperador de concatenaçãoOperador condicionalRevisão - Desafio de operadores3Sistema Numérico
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRevisão - Formatos Numéricos6Módulos
Estrutura de MódulosPortas de Entrada e SaídaPortas InoutInstanciação de MódulosMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação — Construindo um MóduloPratique por conta própria: Compilador de Verilog online