⛓️ Verilog’da Blocking ve Non-Blocking Atamalar #
Verilog, always
veya initial
blokları içinde iki tür işlemsel (procedural) atama sağlar:
➡️ Blocking Atama (=
)
#
- Anında ve sıralı olarak çalışır
- Her satır, tamamlanmadan bir sonrakine geçilmesini engeller
- Genellikle kombinasyonel mantıkta kullanılır
✅ Örnek: #
always @(*) begin
a = b;
c = a; // güncellenmiş 'a' kullanılır
end
Böyle düşün: Normal programlama dillerindeki gibi adım adım ilerleyen atamalar.
⏩ Non-Blocking Atama (<=
)
#
- Atamayı planlar — hemen gerçekleşmez
- Tüm sağ taraflar önce değerlendirilir, ardından sol taraflar güncellenir
- Ardışıl (saatle çalışan) mantıkta kullanılır
✅ Örnek: #
always @(posedge clk) begin
a <= b;
c <= a; // 'a' henüz güncellenmedi, eski değeri kullanır
end
Böyle düşün: Flip-flop davranışı gibi — değerler saat döngüsünün sonunda güncellenir.
🧠 En İyi Uygulama #
Bağlam | Tercih Edilen Atama |
---|---|
Kombinasyonel mantık (always @(*) ) |
= (blocking) |
Ardışıl mantık (always @(posedge clk) ) |
<= (non-blocking) |
❗ Aynı
always
bloğu içinde=
ve<=
asla karıştırılmamalı — bu, karmaşık ve hatalı simülasyon sonuçlarına yol açabilir.