Menu
Coddy logo textTech

Atrasos de Atribuição

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

Nas lições anteriores, cobrimos atrasos gerais (#10 a = b;) e atrasos de porta (and #5 (out, a, b);). Agora cobrimos 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 por 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;

Diferente de um atraso geral #10 a = b; (atraso e depois atribuição), um atraso de atribuição a = #10 b; captura o valor de b naquele momento, aguarda 10 unidades de tempo e então o atribui a a.

Atraso de Atribuição vs Atraso Geral

 Atraso GeralAtraso 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 momentoValor de b no tempo 0 (ou momento da leitura)
Quando o valor é atribuído?Após o atrasoApós o atraso

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 resultado aqui. A diferença aparece quando b muda durante o atraso.

Exemplo de Diferença Chave

Para mostrar b mudando durante o atraso, precisamos de dois blocos initial separados que rodam em paralelo:

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: a1b = 1
  • No tempo 5: b muda para 0 (enquanto a1 ainda está esperando)
  • No tempo 10: a1 recebe a atribuição de 1 (o valor lido no tempo 0), não 0

Com um atraso geral #10 a2 = b; em um bloco separado, b seria lido no tempo 10 (valor 0).

Regras Importantes

RegraExplicação
= vem antes de #a = #10 b; não a #10 = b;
O valor é lido imediatamenteO lado direito é avaliado imediatamente
A atribuição ocorre 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 faltante para que a receba o valor de b após 15 unidades de tempo, mas leia b imediatamente.

Folha de consulta

Atraso de atribuição (Assignment delay) lê o lado direito imediatamente, aguarda o atraso e então realiza a atribuição:

variable = #delay expression;

Diferença fundamental vs atraso geral:

Atraso Geral #10 a = b;Atraso de Atribuição a = #10 b;
Valor de b lidoApós o atrasoImediatamente
Valor atribuídoApós o atrasoApós o atraso

Quando b muda durante o atraso, os resultados diferem:

initial begin
  b = 1;
  a1 = #10 b;   // Lê b=1 agora, atribui a1=1 no tempo 10
  #5 b = 0;     // b muda no tempo 5 — a1 ainda recebe 1
  // Com #10 a2 = b; → lê b=0 no tempo 10, então a2=0
end

Válido apenas dentro de blocos procedurais (initial ou always).

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