Menu
Coddy logo textTech

Atrasos de Atribuição

Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 69 de 90.

Em lições anteriores, cobrimos atrasos gerais (#10 a = b;) e atrasos de porta (and #5 (out, a, b);). Agora cobriremos 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 assignment delay aguarda um tempo especificado e então realiza o assignment. O delay é colocado after o símbolo # e antes do assignment.

Sintaxe:

variable = #delay expression;

Ao contrário de um delay geral #10 a = b; (delay depois assign), um assignment delay a = #10 b; pega o valor de b naquele momento, waits 10 time units, então assigns a a.

Assignment Delay vs General Delay

 General DelayAssignment Delay
Sintaxe#10 a = b;a = #10 b;
Quando o valor é lido?No momento da atribuição (após o delay)Imediatamente (antes do delay)
Qual valor é atribuído?Valor de b naquele momentoValor de b no tempo 0 (ou momento da leitura)
Quando o valor é atribuído?Após o delayApós o delay

Exemplo: A Diferença

initial begin
  b = 1;
  #5 b = 0;
  
  // Atraso geral
  #10 a1 = b;     // Espera 10, então lê b (b=0) → a1=0
  
  // Atraso de atribuição
  a2 = #10 b;     // Lê b agora (b=0), espera 10, então atribui → a2=0
end

Ambos dão o mesmo result aqui. A diferença aparece quando b changes during o delay.

Key Difference Example

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;       // Muda b para 0 no tempo 5 (durante o atraso)
end
  • No time 0: a1 reads b = 1
  • No time 5: b changes para 0 (enquanto a1 still está aguardando)
  • No time 10: é atribuído 1 a a1 (o valor lido no time 0), não 0

Com um delay geral #10 a2 = b; em um block separado, b seria lido no time 10 (valor 0).

Regras Importantes

RegraExplicação
= vai antes de #a = #10 b; e não a #10 = b;
Valor é lido imediatamenteO lado direito é avaliado imediatamente
A atribuição acontece após o atrasoO lado esquerdo recebe o valor mais tarde
Apenas para blocos proceduraisUsado em initial ou always
challenge icon

Desafio

O que fazer:

Adicione o atraso de atribuição que falta 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
endmodule
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos