Ana içeriğe geç

SystemVerilog `fork...join`

· 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 8: 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ük Davranış
join Tüm işlemler bitene kadar bekler (bloklayıcı)
join_any Herhangi bir işlem bittiğinde devam eder
join_none Hiç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
#

Varyant Ne Zaman Bekler? Kullanım Senaryosu
join Tüm işlemler bittiğinde Senkron tamamlama gerektiren durumlar
join_any İlk biten işlemde Timeout, yarışma bazlı durumlar
join_none Hiçbirini beklemeden Arka plan izleme, gecikmeli kontrol
disable fork Tüm işlemleri sonlandırır Dö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.


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

Related

SystemVerilog Diziler
· loading · loading
HDL SystemVerilog HDL
SystemVerilog Döngüler & Akış Kontrol İfadeleri
· loading · loading
HDL SystemVerilog HDL
SystemVerilog Tasklar ve Fonksiyonlar
· loading · loading
HDL SystemVerilog HDL
SystemVerilog Typedef & Alias
· loading · loading
HDL SystemVerilog HDL
SystemVerilog `interface`
· loading · loading
HDL SystemVerilog HDL
Blocking ve Non-Blocking Atamalar
· loading · loading
HDL SystemVerilog HDL