Assignment Delays
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 porta (and #5 (out, a, b);). Agora abordamos assignment delays, 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 espera por um período especificado e, em seguida, realiza a atribuição. O atraso é colocado after do 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.
Assignment Delay vs General Delay
| General Delay | Assignment Delay | |
|---|---|---|
| Sintaxe | #10 a = b; | a = #10 b; |
| Quando o valor é lido? | No momento da assignment (after delay) | Imediatamente (antes de delay) |
| Qual valor é atribuído? | Valor de b naquele momento | Valor de b no time 0 (ou no momento da leitura) |
| Quando o valor é atribuído? | After delay | After delay |
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 changes 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 time 0:
a1readsb = 1 - No time 5:
bchanges para0(enquantoa1ainda está esperando) - No time 10:
a1recebe1(o valor lido no time 0), não0
Com um atraso geral #10 a2 = b; em um bloco separado, b seria lido no time 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 |
| Assignment acontece after delay | O lado esquerdo gets o valor posteriormente |
| Apenas para blocos procedurais | Usado em initial ou always |
Desafio
O que fazer:
Add o delay de assignment ausente para que a gets o valor de b after 15 time units, mas reads 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 projeto4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design13Timing And Delays
What Are DelaysGate DelaysAssignment DelaysTimescale DirectiveClock GenerationRecap - Timing Control5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicPratique por conta própria: Compilador de Verilog online