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 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 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, 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
endAmbos 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:
a1lêb = 1 - No tempo 5:
bmuda para0(enquantoa1ainda está esperando) - No tempo 10:
a1recebe a atribuição de1(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 ocorre após o atraso | O lado esquerdo recebe o valor mais tarde |
| Apenas para blocos procedurais | Usado em initial ou always |
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 lido | Após o atraso | Imediatamente |
| Valor atribuído | Após o atraso | Apó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
endVá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
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 SoftwareNíveis de Abstração de ProjetoSeu Primeiro MóduloComentários4Operadores Parte 1
Operadores AritméticosOperador de MóduloOperadores de ComparaçãoRecapitulação - Matemática SimplesOperadores Bitwise7Atribuição e Portas Lógicas
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ão
Instrução IfIf - ElseRecapitulação - Comparador SimplesInstrução CaseCasex e CasezRecapitulação - Projeto de ALU13Temporização e Atrasos
O que são AtrasosAtrasos de PortaAtrasos de AtribuiçãoDiretiva TimescaleGeração de ClockRecapitulação - Controle de Temporização2Tipos de Dados
Tipo WireTipo RegInteger e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores Parte 2
Operadores LógicosOperadores de ReduçãoOperadores de DeslocamentoOperador de ConcatenaçãoOperador CondicionalRecapitulação - Desafio de Operadores3Sistemas de Numeração
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRecapitulação - Formatos de Números6Módulos
Estrutura de MóduloPortas de Entrada e SaídaPortas InoutInstanciação de MóduloMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação - Construa um Módulo