⛓️ SystemVerilog’da Blocking ve Non-Blocking Atamalar#
SystemVerilog, 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.