Menu
Coddy logo textTech

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 delayAssignment 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ğeritime 0'daki (veya okuma anındaki) b değeri
Değer ne zaman atanır?After delayAfter 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
end

Burada 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: a1 b = 1 reads
  • time 5'te: b 0 olarak changes (a1 hâlâ beklerken)
  • time 10'da: a1'e 1 atanır (time 0'da okunan değer), 0 değil

Separate block içinde genel bir gecikme olan #10 a2 = b; ile b, time 10'da (değer 0) okunurdu.

Önemli Kurallar

KuralAçıklama
=, #'den önce gelira = #10 b;, a #10 = b; değil
Değer hemen okunurSağ taraf hemen değerlendirilir
Assignment gecikmeden sonra gerçekleşirSol taraf değeri daha sonra alır
Yalnızca prosedürel block'lar içininitial veya always içinde kullanılır
challenge icon

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
endmodule
quiz iconKendini test et

Bu 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

Kendi başına pratik yap: Online Verilog derleyicisi