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