Menu
Coddy logo textTech

Atama Gecikmeleri

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 almıştık. Şimdi, bir atama ifadesinin parçası olarak bir prosedürel blok (initial veya always gibi) içinde gerçekleşen gecikmeler olan atama gecikmelerini ele alıyoruz.

Bir atama gecikmesi belirli bir süre bekler, ardından atamayı gerçekleştirir. Gecikme, # sembolünden sonra ve atamadan önce yerleştirilir.

Sözdizimi:

variable = #delay expression;

Genel bir gecikmenin #10 a = b; (gecikme ve ardından atama) aksine, bir atama gecikmesi a = #10 b; o andaki b değerini alır, 10 zaman birimi bekler ve ardından a değişkenine atar.

Atama Gecikmesi vs Genel Gecikme

 Genel GecikmeAtama Gecikmesi
Sözdizimi#10 a = b;a = #10 b;
Değer ne zaman okunur?Atama anında (gecikmeden sonra)Hemen (gecikmeden önce)
Hangi değer atanır?O andaki b değeriZaman 0'daki (veya okuma anındaki) b değeri
Değer ne zaman atanır?Gecikmeden sonraGecikmeden sonra

Örnek: Fark

initial begin
  b = 1;
  #5 b = 0;
  
  // Genel gecikme
  #10 a1 = b;     // 10 birim bekler, sonra b'yi okur (b=0) → a1=0
  
  // Atama gecikmesi
  a2 = #10 b;     // b'yi şimdi okur (b=0), 10 birim bekler, sonra atama yapar → a2=0
end

Burada her ikisi de aynı sonucu verir. Fark, gecikme sırasında b değiştiğinde 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;     // 0 anında b=1 değerini okur, 10 anında a1=1 atamasını yapar
end

initial begin
  #5 b = 0;       // 5 anında (gecikme sırasında) b'yi 0 olarak değiştirir
end
  • 0 anında: a1, b = 1 değerini okur
  • 5 anında: b, 0 değerine değişir (a1 hala beklerken)
  • 10 anında: a1'e 0 değil, 1 (0 anında okunan değer) atanır

Ayrı bir bloktaki #10 a2 = b; gibi genel bir gecikme ile, b 10 anında okunurdu (değer 0).

Önemli Kurallar

KuralAçıklama
=, # işaretinden önce gelira = #10 b;, a #10 = b; değil
Değer anında okunurSağ taraf hemen değerlendirilir
Atama gecikmeden sonra gerçekleşirSol taraf değeri daha sonra alır
Yalnızca prosedürel bloklar içindirinitial veya always içinde kullanılır
challenge icon

Görev

Yapılması gerekenler:

Eksik atama gecikmesini ekleyin; böylece a, 15 zaman birimi sonra b değerini alır, ancak b değerini hemen okur.

Kopya kağıdı

Atama gecikmesi sağ tarafı hemen okur, gecikme süresi kadar bekler ve ardından atamayı gerçekleştirir:

variable = #delay expression;

Genel gecikme ile arasındaki temel fark:

Genel Gecikme #10 a = b;Atama Gecikmesi a = #10 b;
b değerinin okunmasıGecikmeden sonraHemen
Değerin atanmasıGecikmeden sonraGecikmeden sonra

Gecikme sırasında b değiştiğinde sonuçlar farklılık gösterir:

initial begin
  b = 1;
  a1 = #10 b;   // Reads b=1 now, assigns a1=1 at time 10
  #5 b = 0;     // b changes at time 5 — a1 still gets 1
  // With #10 a2 = b; → reads b=0 at time 10, so a2=0
end

Yalnızca prosedürel bloklar (initial veya always) içinde geçerlidir.

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 değerini 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