Ana içeriğe geç

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
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 11: This Article

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

SystemVerilog, hem RTL tasarımı hem de testbench yazımı için güçlü ve esnek döngü yapıları ve kontrol mekanizmaları sunar. Bu yapılar, C dili gibi klasik programlama dillerine benzese de, simülasyon odaklıdır ve donanım modelleme ihtiyaçlarına göre tasarlanmıştır.


🔄 SystemVerilog’ta Döngü Tipleri
#

1. for Döngüsü
#

C tarzı klasik sayaçlı döngü.

for (int i = 0; i < 10; i++) begin
  $display("i = %0d", i);
end
  • Sabit sayıda tekrarlanacak işlemler için uygundur
  • Sayaç değişkeni ister içinde ister dışında tanımlanabilir

2. while Döngüsü
#

Koşul doğru olduğu sürece çalışır.

int i = 0;
while (i < 5) begin
  $display("i = %0d", i);
  i++;
end
  • RTL’de dikkatli kullanılmalı: sınırsız döngülerden kaçının

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

En az bir kez çalışır, ardından koşulu kontrol eder.

int i = 0;
do begin
  $display("i = %0d", i);
  i++;
end while (i < 3);
  • Döngü gövdesini mutlaka bir kez çalıştırmak istiyorsanız kullanışlıdır

4. foreach Döngüsü
#

Dizi elemanları üzerinde döngü kurmak için özel yapıdır (packed/unpacked/dinamik/associative dizilerde çalışır).

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

foreach (arr[i]) begin
  $display("arr[%0d] = %0d", i, arr[i]);
end
  • Dizi içinde dolaşımı kolaylaştırır
  • Testbench’lerde yaygın olarak kullanılır

5. repeat Döngüsü
#

Döngü gövdesini belirtilen sayıda tekrar eder.

repeat (4) begin
  $display("Repeat bloğu çalışıyor");
end
  • Sayaç gerektirmeyen sabit tekrarlar için uygundur
  • Sayı sabitse sentezlenebilir

6. forever Döngüsü
#

Sonsuza kadar çalışır, dış müdahale olmazsa durmaz.

forever begin
  @(posedge clk);
  $display("Clock tick");
end
  • Saat tabanlı simülasyonlarda, testbenchlerde kullanılır
  • RTL’de doğrudan sentezlenemez (koruyucu kontrol mekanizması gerekebilir)

🧭 Kontrol Akışı Yapıları
#

break
#

Bulunulan döngüden hemen çıkar.

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

💡 Belirli bir koşulda döngüyü sonlandırmak istiyorsanız kullanılır.


continue
#

Geçerli döngü adımını atlar ve bir sonraki adıma geçer.

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

💡 Belirli değerleri veya koşulları atlamak için idealdir.


return
#

Bir task veya function içinden çıkmak için kullanılır, değer döndürme imkanı da sağlar.

function int square(int x);
  if (x < 0)
    return 0;
  return x * x;
endfunction
  • Döngüyü değil, sadece function/task yapısını sonlandırır

⚠️ Donanım Tasarımında Uyarılar
#

  • Sınırsız while, do...while veya forever döngülerinden RTL içinde kaçının
  • break ve continue yapıları RTL’de sentezlenemez — bunun yerine FSM yapıları kullanın
  • Bu yapılar çoğunlukla testbench, UVM, ve davranışsal modelleme içindir

✅ Özet Tablo
#

Anahtar KelimeAmaçSentezlenebilir mi?Yaygın Kullanım
forSayaçlı döngü✅ (sınırlıysa)Sayaç tabanlı işlemler
whileKoşullu döngü⚠️ (sonsuzdan kaçın)Testbench akışı
do...whileEn az bir kez çalışırDavranışsal modeller
foreachDizi üzerinde döngüTestbench, dizi erişimi
repeatBelirli sayıda tekrar✅ (sabit sayı varsa)Protokol, senkronizasyon
foreverSonsuz döngü❌ (RTL için riskli)Saat tabanlı simülasyon
breakDöngüyü anında bitirDöngüden erken çıkış
continueGeçerli adımı atlaBazı değerleri atlamak
returnFunction/task’ten çıkışKoşullu çıkışlar

SystemVerilog’un kontrol akışı yapıları özellikle testbench yazımında esnek ve sezgisel kodlar yazmanıza olanak tanır. RTL yazarken ise tüm döngülerin sınırlı ve deterministik olduğundan emin olun.


module tb_loops_and_flow;

    // For loop
    initial begin
        for (int i = 0; i < 3; i++)
            $display("for loop i = %0d", i);
    end

    // While loop
    initial begin
        int j = 0;
        while (j < 2) begin
            $display("while loop j = %0d", j);
            j++;
        end
    end

    // Do...while loop
    initial begin
        int k = 0;
        do begin
            $display("do-while k = %0d", k);
            k++;
        end while (k < 2);
    end

    // Foreach loop
    int arr[3] = '{10, 20, 30};
    initial begin
        foreach (arr[i])
            $display("arr[%0d] = %0d", i, arr[i]);
    end

    // Repeat loop
    initial begin
        repeat (2)
            $display("repeat loop running");
    end

    // Forever loop (terminated after short sim)
    initial begin
        int cnt = 0;
        forever begin : forever_loop
            #5 $display("forever loop cnt = %0d", cnt++);
          if (cnt == 2) break;
        end
    end

    // Break and continue
    initial begin
        for (int m = 0; m < 5; m++) begin
            if (m == 2) continue;
            if (m == 4) break;
            $display("loop with break/continue m = %0d", m);
        end
    end

    // Return example
    initial begin
        int val = square(-4);
        $display("square(-4) = %0d", val);
    end

    function int square(int x);
        if (x < 0)
            return 0;
        return x * x;
    endfunction

endmodule

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

Related

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 Task ve Function Yapıları
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Task Function RTL Tasarımı Testbench Yeniden Kullanılabilirlik
Donanım Tasarımı Doğrulama
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 Diziler
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Diziler Packed Dinamik Dizi Kuyruk (Queue) Testbench
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
SystemVerilog Interface – modport ve Clocking Block ile Modüler Bağlantı
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Interface Modport Testbench RTL Tasarımı Bağlantı
Donanım Tasarımı Doğrulama