🔁 always_ff
vs always @(posedge clk)
#
✅ always_ff
Neden Daha İyi?#
SystemVerilog’ün always_ff
bloğı, Verilog’daki always @(posedge clk)
‘e kıyasla daha güvenli ve kısıtlayıcı bir sıralı lojik bloğudur:
- Derleyici zorunlulukları:
- Sadece non-blocking atamalar (
<=
) kabul eder. - Kombinasyonel ve sıralı lojik karışımını engeller.
- Sadece değişkenler (wire değil) atanabilir.
- Sadece non-blocking atamalar (
- Sentez-simülasyon uyumu garanti eder.
always_ff @(posedge clk or posedge rst) begin
if (rst)
q <= 0;
else
q <= d;
end
⚠️ Kritik:
always_ff
içinde blocking atama (=
) kullanılırsa derleyici hatası alınır.
⚙️ always_comb
vs always @(*)
#
✅ always_comb
Avantajları#
Özellik | always @(*) (Verilog) | always_comb (SystemVerilog) |
---|---|---|
Hassasiyet Listesi | Eksik (tahmine dayalı) | Mükemmel (tüm sinyaller takip edilir) |
Atama Türü | = ve <= serbest | Sadece blocking (= ) zorunlu |
Latch Tespiti | Araç bağımlı | Eksik dallarda uyarı verir |
Fonksiyon Takibi | ❌ Fonksiyon içi sinyalleri kaçırır | ✅ Fonksiyon içindeki sinyalleri de takip eder |
Zaman-0 Çalışması | Hayır | ✅ Simülasyon başında otomatik çalışır |
always_comb begin
y = my_func(sel); // `my_func` içindeki tüm girdileri otomatik takip eder.
end
🚫 Kısıtlama:
always_comb
içinde gecikme (örn.#5
) kullanılamaz.
🧠 Gizli Tuzak: always @(*)
Fonksiyon Hassasiyeti#
❌ Hatalı Verilog Kodu#
function logic [3:0] my_func(input logic flag);
if (flag) return a + b; // `a` ve `b` hassasiyet listesine **EKLEMEZ**!
else return a - b;
endfunction
always @(*) begin
y = my_func(sel); // ❌ `a`/`b` değişirse yeniden hesaplama yapılmaz.
end
✅ always_comb
ile Düzeltme#
always_comb begin
y = my_func(sel); // ✅ `a`, `b` ve `sel` otomatik takip edilir.
end
🕳️ always_latch
– Kasıtlı Latch Tasarımı#
🎯 Ne Zaman Kullanılır?#
Sadece seviye duyarlı latch’ler için:
always_latch begin
if (en) q = d; // `en` düşükken değeri tutar.
end
🔍 Araç Uyarıları:
- Kenar tetiklemeli lojik (örn.
posedge
) kullanılırsa uyarı verir.- Eksik dallarda (örn.
else
yoksa) latch oluşturur.
📚 Hızlı Referans Tablosu#
Blok Türü | Amaç | Atama Türü | Temel Kurallar |
---|---|---|---|
always_ff | Sıralı (flip-flop) | <= | = yok, wire yok, karışık lojik yok. |
always_comb | Kombinasyonel | = | Latch yok, gecikme yok, zaman-0 çalışır. |
always_latch | Kasıtlı latch | = | else olmayan if ile latch oluşturur. |
always @(*) | Eski kombinasyonel | = /<= | Kullanmayın (fonksiyon sinyallerini kaçırır). |
always @(posedge clk) | Eski sıralı | <= /= | Yeni tasarımlarda always_ff tercih edin. |
✅ En İyi Uygulamalar#
- Yeni tasarımlarda
always_ff
/always_comb
kullanın. - Aynı blokta
=
ve<=
karıştırmayın. - Varsayılan atamalar:
always_comb
‘da çıkışları başlatın. - Fonksiyonlar: Tüm bağımlılıkları takip için
always_comb
kullanın.
🔥 SystemVerilog’ün
always_*
blokları, modern RTL tasarımın endüstri standardıdır.