Ana içeriğe geç

SystemVerilog always_ff, always_comb ve always_latch Farkları – Güvenli RTL Kodlama

· loading · loading · ·
Donanım Tasarımı SystemVerilog Always_ff Always_comb RTL Tasarımı Sıralı Mantık Latch Yapısı
Donanım Tasarımı
Axolot Logic
Yazar
Axolot Logic
Sayısal Tasarım Mühendisi
Table of Contents
SystemVerilog Tasarım Serisi - This article is part of a series.
Part 8: This Article

🔁 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.
  • 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ı
#

Özellikalways @(*) (Verilog)always_comb (SystemVerilog)
Hassasiyet ListesiEksik (tahmine dayalı)Mükemmel (tüm sinyaller takip edilir)
Atama Türü= ve <= serbestSadece blocking (=) zorunlu
Latch TespitiAraç 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_ffSıralı (flip-flop)<== yok, wire yok, karışık lojik yok.
always_combKombinasyonel=Latch yok, gecikme yok, zaman-0 çalışır.
always_latchKası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
#

  1. Yeni tasarımlarda always_ff/always_comb kullanın.
  2. Aynı blokta = ve <= karıştırmayın.
  3. Varsayılan atamalar: always_comb‘da çıkışları başlatın.
  4. 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.


SystemVerilog Tasarım Serisi - This article is part of a series.
Part 8: This Article

Related

SystemVerilog Modülleri – Yapı, Örnekleme ve RTL İçin En İyi Uygulamalar
· loading · loading
Donanım Tasarımı SystemVerilog Modül RTL Tasarımı Always_ff Parametre Modül Çağırma
Donanım Tasarımı
SystemVerilog Boyutsuz Literaller
· loading · loading
Donanım Tasarımı SystemVerilog Literal RTL Tasarımı Başlatma Sentezleme Reset Mantığı
Donanım Tasarımı
SystemVerilog Clocking Block – Testbench Zamanlama Kontrolü
· loading · loading
Doğrulama Donanım Tasarımı SystemVerilog Clocking Block RTL Tasarımı Testbench UVM Zamanlama
Doğrulama Donanım Tasarımı
SystemVerilog Döngüler ve Kontrol Akışı – for, while, foreach, repeat, break
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Döngüler Kontrol Akışı Testbench RTL Tasarımı Break/Continue
Donanım Tasarımı Doğrulama
SystemVerilog Enum Veri Tipi
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Enum Durum Makinesi RTL Tasarımı Testbench Hata Ayıklama
Donanım Tasarımı Doğrulama
SystemVerilog Giriş
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Verilog RTL Tasarımı UVM Donanım Doğrulama IEEE 1800
Donanım Tasarımı Doğrulama