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