Assignment Delays
Coddy'nin Verilog Journey'sinin Temeller bölümünün bir parçası. Ders 69 / 90.
Önceki derslerde genel gecikmeleri (#10 a = b;) ve kapı gecikmelerini (and #5 (out, a, b);) ele aldık. Şimdi, bir atama ifadesinin parçası olarak prosedürel bir blokta (örneğin initial veya always) içeride gerçekleşen gecikmeler olan atama gecikmelerini ele alıyoruz.
Bir atama gecikmesi, belirtilen bir süre bekler ve ardından atamayı gerçekleştirir. Gecikme, # simgesinin after önüne ve atamanın öncesine yerleştirilir.
Sözdizimi:
variable = #delay expression;Genel bir delay #10 a = b; (delay sonra assign) aksine, bir assignment delay a = #10 b;, o andaki b değerini alır, 10 time units waits ve ardından bunu a'ya assigns.
Assignment delay ve General delay
| General delay | Assignment delay | |
|---|---|---|
| Sözdizimi | #10 a = b; | a = #10 b; |
| Değer ne zaman okunur? | assignment sırasında (after delay) | Hemen (before delay) |
| Hangi değer atanır? | O andaki b değeri | time 0'daki (veya okuma anındaki) b değeri |
| Değer ne zaman atanır? | After delay | After delay |
Örnek: Fark
initial begin
b = 1;
#5 b = 0;
// Genel gecikme
#10 a1 = b; // 10 bekler, sonra b'yi okur (b=0) → a1=0
// Atama gecikmesi
a2 = #10 b; // b'yi şimdi okur (b=0), 10 bekler, sonra atar → a2=0
endBurada her ikisi de aynı sonucu verir. Fark, b changes during the delay olduğunda ortaya çıkar.
Temel Fark Örneği
To show b changing during the delay, we need two separate initial blocks that run in parallel:
initial begin
b = 1;
a1 = #10 b; // Zaman 0'da b=1 okur, zaman 10'da a1=1 atar
end
initial begin
#5 b = 0; // Zaman 5'te b'yi 0 yapar (gecikme sırasında)
end- time 0'da:
a1b = 1reads - time 5'te:
b0olarak changes (a1hâlâ beklerken) - time 10'da:
a1'e1atanır (time 0'da okunan değer),0değil
Separate block içinde genel bir gecikme olan #10 a2 = b; ile b, time 10'da (değer 0) okunurdu.
Önemli Kurallar
| Kural | Açıklama |
|---|---|
=, #'den önce gelir | a = #10 b;, a #10 = b; değil |
| Değer hemen okunur | Sağ taraf hemen değerlendirilir |
| Assignment gecikmeden sonra gerçekleşir | Sol taraf değeri daha sonra alır |
| Yalnızca prosedürel block'lar için | initial veya always içinde kullanılır |
Görev
Ne yapmalı:
Eksik assignment gecikmesini Add; böylece a, b'nin değerini after 15 time units gets, ancak b'yi hemen reads.
Kendin dene
module assignment_challenge;
reg a, b;
// Gecikme sırasında b'yi değiştirmek için ayrı blok
initial begin
b = 1;
// TODO: Atama gecikmesi ekle
// a, 15 zaman birimi sonra b'yi almalı
// b'yi şimdi oku, gecikmeden sonra ata
end
initial begin
#5 b = 0; // Gecikme sırasında b'yi değiştirir
#20 $display("Time %0t: a = %b", $time, a);
$finish;
end
endmoduleBu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Temeller bölümündeki tüm dersler
4Operators 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 LogicKendi başına pratik yap: Online Verilog derleyicisi