Ana içeriğe geç

SystemVerilog fork...join Yapısı – Paralel İşlem Mantığı

· loading · loading · ·
Kerim Turak
Doğrulama SystemVerilog Fork Join Paralel İşlem Testbench Join_any Join_none
Doğrulama
Yazar
Kerim Turak
Digital IC Design & Verification Engineer
Table of Contents
SystemVerilog Tasarım Serisi - This article is part of a series.
Part 15: This Article

🧵 SystemVerilog fork...join – Paralel Çalışma Açıklaması
#

SystemVerilog’da fork...join yapısı, birden fazla işlemi aynı anda (paralel) çalıştırmanıza olanak tanır. Bu yapı özellikle testbench, uyarı üretimi (stimulus) ve eşzamanlı kontroller için oldukça kullanışlıdır.


🔧 Temel Sözdizimi
#

fork
  statement_1;
  statement_2;
  statement_3;
join
  • fork...join bloğundaki tüm ifadeler aynı anda başlar
  • Simülasyon, join‘den sonraki satıra geçmeden önce tüm işlemlerin tamamlanmasını bekler

📌 join Varyantları
#

Anahtar SözcükDavranış
joinTüm işlemler bitene kadar bekler (bloklayıcı)
join_anyHerhangi bir işlem bittiğinde devam eder
join_noneHiçbirini beklemez, işlemler arka planda devam eder

join ile Örnek:
#

fork
  #10 $display("A");
  #5  $display("B");
join
$display("Hepsi tamamlandı");  // A ve B tamamlandıktan sonra çalışır

join_any ile Örnek:
#

fork
  #20 $display("Yavaş işlem");
  #5  $display("Hızlı işlem");
join_any
$display("İlk tamamlanan işlem sonrası");  // İlk biten işlemden sonra çalışır

join_none ile Örnek:
#

fork
  #10 $display("Çalışıyor...");
  #20 $display("Hâlâ çalışıyor...");
join_none
$display("Beklemeden devam et");

🔁 disable fork Kullanımı
#

SystemVerilog, bir fork...join bloğu içindeki tüm alt işlemleri sonlandırmak için disable fork; komutunu sunar.

initial begin
  fork
    forever begin
      #1 $display("Sonsuz döngü...");
    end
    #10 disable fork;  // 10 zaman birimi sonra sonsuz döngüyü durdur
  join
end

🚨 Sentez Uyarısı
#

  • fork...join sentezlenemez
  • Sadece testbench ve davranışsal modelleme için kullanılır
  • RTL kodlarında kullanılmamalıdır

🧪 Yaygın Kullanım Senaryoları
#

  • Paralel stimulus başlatmak

  • Eşzamanlı kontroller veya monitorleri çalıştırmak

  • Aynı anda farklı görevler:

    • Paket gönderme + scoreboard kontrolü
    • Stimulus + timeout gözlemi
  • join_any ile timeout veya yarışma (race) mantığı kurmak


✅ En İyi Kullanım Önerileri
#

  • Tüm işlemlerin bitmesi gerekiyorsa join kullan
  • İlk biteni yakalamak istiyorsan join_any kullan
  • Arka planda işlemler çalışsın ama bekleme istiyorsan join_none kullan
  • Tüm işlemleri kontrollü şekilde durdurmak için disable fork kullan

🧠 Özet Tablosu
#

VaryantNe Zaman Bekler?Kullanım Senaryosu
joinTüm işlemler bittiğindeSenkron tamamlama gerektiren durumlar
join_anyİlk biten işlemdeTimeout, yarışma bazlı durumlar
join_noneHiçbirini beklemedenArka plan izleme, gecikmeli kontrol
disable forkTüm işlemleri sonlandırırDöngüleri, işlemleri erken durdurma

SystemVerilog’taki fork...join ailesi, özellikle UVM ve testbench ortamlarında güçlü eşzamanlı davranışlar oluşturmanı sağlar. Bu yapıları doğru kullanmak, simülasyonlarını daha gerçekçi, modüler ve kontrollü hale getirir.


module tb_fork_join_demo;

  initial begin
    $display("== fork...join Demo ==");

    // Basic fork...join: Waits for all to complete
    $display("\n[1] fork...join");
    fork
      #10 $display("  Task A done at %0t", $time);
      #5  $display("  Task B done at %0t", $time);
    join
    $display("  -> All tasks finished at %0t", $time);

    // fork...join_any: Continues after first finishes
    $display("\n[2] fork...join_any");
    fork
      #20 $display("  Slow task done at %0t", $time);
      #5  $display("  Fast task done at %0t", $time);
    join_any
    $display("  -> One task finished at %0t", $time);

    // fork...join_none: Moves on immediately
    $display("\n[3] fork...join_none");
    fork
      #10 $display("  Background A at %0t", $time);
      #20 $display("  Background B at %0t", $time);
    join_none
    $display("  -> Proceeding immediately at %0t", $time);

    // fork with disable fork
    $display("\n[4] fork with disable fork");
    fork
      forever begin
        #1 $display("  Looping... %0t", $time);
        if($time == 100) break;
      end
    join

    $display("== Simulation done at %0t ==", $time);
    #10 $finish;
  end

endmodule

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

Related

SystemVerilog Diziler
· loading · loading
Kerim Turak
Donanım Tasarımı Doğrulama SystemVerilog Diziler Packed Dinamik Dizi Kuyruk (Queue) Testbench
Donanım Tasarımı Doğrulama
SystemVerilog Task ve Function Yapıları
· loading · loading
Kerim Turak
Donanım Tasarımı Doğrulama SystemVerilog Task Function RTL Tasarımı Testbench Yeniden Kullanılabilirlik
Donanım Tasarımı Doğrulama
SystemVerilog Döngüler ve Kontrol Akışı – for, while, foreach, repeat, break
· loading · loading
Kerim Turak
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
Kerim Turak
Donanım Tasarımı Doğrulama SystemVerilog Enum Durum Makinesi RTL Tasarımı Testbench Hata Ayıklama
Donanım Tasarımı Doğrulama
SystemVerilog String Veri Türü
· loading · loading
Kerim Turak
Doğrulama SystemVerilog String Testbench Simülasyon Dosya I/O Sentezlenemez
Doğrulama
SystemVerilog Interface – modport ve Clocking Block ile Modüler Bağlantı
· loading · loading
Kerim Turak
Donanım Tasarımı Doğrulama SystemVerilog Interface Modport Testbench RTL Tasarımı Bağlantı
Donanım Tasarımı Doğrulama