wait fork ve disable fork

Gün 4: Süreçler Arası İletişim (IPC) | Süreç bekleme, iptal etme ve timeout kalıbı

Kaynak Kod

// =============================================================================
// GUN 4 - Konu 2: wait fork ve disable fork
// =============================================================================

module wait_disable_fork;

  task automatic slow_task(string name, int delay);
    $display("  [%0t] %s basladi", $time, name);
    #delay;
    $display("  [%0t] %s bitti", $time, name);
  endtask

  // --- wait fork: Tum cocuk sureclerin bitmesini bekle ---
  initial begin
    $display("=== wait fork ve disable fork ===\n");

    $display("--- wait fork ---");
    $display("  [%0t] Ana surec basladi", $time);
    
    fork
      slow_task("Task_A", 20);
      slow_task("Task_B", 40);
    join_none
    
    $display("  [%0t] join_none sonrasi, diger is yapiliyor...", $time);
    #10;
    $display("  [%0t] Ek is bitti, simdi fork'lari bekliyoruz", $time);
    
    wait fork;  // Task_A ve Task_B bitene kadar bekle
    $display("  [%0t] wait fork: Tum gorevler tamamlandi!\n", $time);
  end

  // --- disable fork: Tum cocuk surecleri sonlandir ---
  initial begin
    #100;
    $display("--- disable fork ---");
    $display("  [%0t] Baslangic", $time);

    fork
      begin
        slow_task("Uzun_Task", 100);  // Cok uzun
      end
      begin
        slow_task("Kisa_Task", 10);
      end
    join_any

    $display("  [%0t] join_any: Biri bitti, digerini iptal ediyoruz", $time);
    disable fork;  // Kalan surecleri sonlandir
    $display("  [%0t] disable fork: Tum bekleyen gorevler iptal edildi\n", $time);
  end

  // --- Zaman asimi (Timeout) kalibi ---
  initial begin
    #300;
    $display("--- Timeout Kalibi ---");
    $display("  [%0t] Baslangic", $time);

    fork : timeout_block
      begin
        slow_task("Hedef_Task", 50);
        $display("  [%0t] Hedef gorev basarili!", $time);
      end
      begin
        #30;  // 30ns timeout
        $display("  [%0t] ZAMAN ASIMI! 30ns icinde bitmedi", $time);
      end
    join_any
    disable timeout_block;
    $display("  [%0t] Timeout blogu tamamlandi\n", $time);

    #10;
    $display("=== wait/disable fork Sonu ===");
    $finish;
  end

endmodule