fork...join
Gün 4: Süreçler Arası İletişim (IPC) | Eşzamanlı süreçler: join, join_any, join_none
Kaynak Kod
// =============================================================================
// GUN 4 - Konu 1: fork...join, fork...join_any, fork...join_none
// =============================================================================
module fork_join;
// Gorev tanimlari
task automatic work(string name, int delay);
$display(" [%0t] %s basladi (sure: %0dns)", $time, name, delay);
#delay;
$display(" [%0t] %s bitti", $time, name);
endtask
initial begin
$display("=== fork...join Turleri ===\n");
// --- fork...join: TUM surecler bitene kadar bekle ---
$display("--- fork...join (hepsi bitsin) ---");
$display(" [%0t] Baslangic", $time);
fork
work("Gorev_A", 30);
work("Gorev_B", 10);
work("Gorev_C", 20);
join
$display(" [%0t] fork...join tamamlandi (en uzun: 30ns)\n", $time);
// --- fork...join_any: HERHANGI BIRI bitince devam et ---
$display("--- fork...join_any (ilk biten) ---");
$display(" [%0t] Baslangic", $time);
fork
work("Gorev_D", 30);
work("Gorev_E", 10);
work("Gorev_F", 20);
join_any
$display(" [%0t] fork...join_any devam etti (ilk biten: 10ns)\n", $time);
#25; // Digerlerinin bitmesini bekle
// --- fork...join_none: HICBIRINI bekleme ---
$display("--- fork...join_none (beklemeden devam) ---");
$display(" [%0t] Baslangic", $time);
fork
work("Gorev_G", 30);
work("Gorev_H", 10);
work("Gorev_I", 20);
join_none
$display(" [%0t] fork...join_none hemen devam etti", $time);
#0; // Delta cycle - fork'lar baslasin
$display(" [%0t] #0 sonrasi (gorevler basladi)", $time);
#35; // Tumunun bitmesini bekle
// --- Ic ice fork ---
$display("\n--- Ic Ice Fork ---");
$display(" [%0t] Baslangic", $time);
fork
begin // Sirali blok 1
work("Sirali_1a", 5);
work("Sirali_1b", 5); // 1a'dan sonra baslar
end
begin // Sirali blok 2
work("Sirali_2a", 3);
work("Sirali_2b", 7);
end
join
$display(" [%0t] Ic ice fork tamamlandi\n", $time);
$display("=== fork...join Sonu ===");
$finish;
end
endmodule