Ana içeriğe geç

SystemVerilog Döngüler & Akış Kontrol İfadeleri

· loading · loading · · ·
HDL SystemVerilog HDL
Axolot Logic
Yazar
Axolot Logic
Sayısal Tasarım Mühendisi
Table of Contents
SystemVerilog - This article is part of a series.
Part 5: This Article

🔁 SystemVerilog Döngüler ve Kontrol Akışı Yapıları
#

SystemVerilog, döngü yapıları ve kontrol akışı mekanizmaları açısından oldukça zengindir. Bu yapılar, hem RTL modellemesi hem de testbench geliştirmeleri için esneklik ve okunabilirlik sağlar. Söz dizimi C diline benzer, ancak donanım modelleme kurallarına dikkat edilmelidir.


🔄 SystemVerilog’ta Döngü Türleri
#

1. for Döngüsü
#

C stilinde klasik döngü yapısıdır.

for (int i = 0; i < 10; i++) begin
  $display("i = %0d", i);
end
  • İterasyon (tekrar) sayısı biliniyorsa uygundur
  • Sayaç değişkeni içeride ya da dışarıda tanımlanabilir

2. while Döngüsü
#

Koşul doğru olduğu sürece döngü devam eder.

int i = 0;
while (i < 5) begin
  $display("i = %0d", i);
  i++;
end
  • Sonsuz döngü riski nedeniyle RTL’de dikkatle kullanılmalıdır

3. do...while Döngüsü
#

Koşulu döngü sonunda kontrol eder, en az bir kez çalışır.

int i = 0;
do begin
  $display("i = %0d", i);
  i++;
end while (i < 3);
  • En az bir kez döngü çalıştırmak istenen durumlar için uygundur

4. foreach Döngüsü
#

Dizi elemanları üzerinde kolay gezinmeyi sağlar.

int arr[5] = '{0, 1, 2, 3, 4};

foreach (arr[i]) begin
  $display("arr[%0d] = %0d", i, arr[i]);
end
  • Array üzerinden daha sade ve okunabilir şekilde geçiş yapar
  • Özellikle testbenchlerde çok kullanılır

🧭 Kontrol Akışı Komutları
#

break
#

İçinde bulunduğu döngüden hemen çıkmak için kullanılır.

for (int i = 0; i < 10; i++) begin
  if (i == 5) break;
  $display("i = %0d", i);
end

💡 Belirli bir durumda döngüyü bitirmek için kullanılır.


continue
#

Bulunduğu iterasyonu atlar, döngünün bir sonraki turuna geçer.

for (int i = 0; i < 5; i++) begin
  if (i == 2) continue;
  $display("i = %0d", i);
end

💡 Belirli durumları es geçmek istediğinizde faydalıdır.


return
#

Fonksiyon veya task içinden erken çıkmak için kullanılır.

function int square(int x);
  if (x < 0)
    return 0;
  return x * x;
endfunction
  • Döngü değil, fonksiyon ya da task çıkışı içindir

⚠️ Donanım Tasarımı Uyarısı
#

  • RTL tasarımda sonsuz while veya do...while döngülerinden kaçının
  • break ve continue sentezlenemez, donanımda kullanılmaz
  • Bu yapılar genellikle testbench, UVM ve davranışsal modellerde tercih edilir

✅ Özet Tablosu
#

Anahtar Sözcük Amacı Sentezlenebilir mi? Yaygın Kullanım
for Sayaçla döngü ✅ (sınırlıysa) Sayaçlı iterasyon
while Koşullu döngü ⚠️ (RTL’de dikkat) Testbench kontrolü
do...while En az bir kez çalışan döngü Davranışsal modelleme
foreach Dizi elemanlarında gezinti Testbench dizi erişimi
break Döngüyü anında sonlandırır Erken çıkış
continue İterasyonu atlar, devam eder Bazı değerleri atlama
return Fonksiyon veya task’tan çıkış Koşullu fonksiyon dönüşü

SystemVerilog’un bu kontrol akışı yapıları, özellikle testbenchlerde esnek ve okunabilir yapılar kurmayı sağlar. RTL’de ise sınırlı ve deterministik döngüler kullanmak kritik önemdedir.


SystemVerilog - This article is part of a series.
Part 5: This Article

Related

SystemVerilog Diziler
· loading · loading
HDL SystemVerilog HDL
SystemVerilog Typedef & Alias
· loading · loading
HDL SystemVerilog HDL
SystemVerilog `fork...join`
· loading · loading
HDL SystemVerilog HDL
SystemVerilog `interface`
· loading · loading
HDL SystemVerilog HDL
Blocking ve Non-Blocking Atamalar
· loading · loading
HDL SystemVerilog HDL
SystemVerilog Giriş
· loading · loading
HDL SystemVerilog HDL