🧵 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.