Events (Olaylar)

Gün 4: Süreçler Arası İletişim (IPC) | Olay tetikleme (->), bekleme (@, wait) ve senkronizasyon

Kaynak Kod

// =============================================================================
// GUN 4 - Konu 3: Event'ler - Olay Tetikleme ve Bekleme
// =============================================================================

module events;
  // Event tanimla
  event data_ready;
  event ack_received;
  event reset_done;
  event phase_complete;

  int shared_data;

  // --- Uretici (Producer) ---
  initial begin : producer
    $display("=== Events (Olay Tetikleme) ===\n");

    // Reset bekle
    @(reset_done);
    $display("  [%0t] Uretici: Reset tamamlandi, calismaya basliyor", $time);

    repeat (5) begin
      #10;
      shared_data = $urandom_range(1, 100);
      $display("  [%0t] Uretici: Veri uretildi = %0d", $time, shared_data);
      -> data_ready;  // Olayi tetikle

      @(ack_received);  // Tuketici onayini bekle
      $display("  [%0t] Uretici: Onay alindi", $time);
    end

    $display("\n  [%0t] Uretici: Tum veriler gonderildi", $time);
    -> phase_complete;
  end

  // --- Tuketici (Consumer) ---
  initial begin : consumer
    @(reset_done);
    $display("  [%0t] Tuketici: Reset tamamlandi", $time);

    forever begin
      @(data_ready);  // Veri hazir olayini bekle
      $display("  [%0t] Tuketici: Veri alindi = %0d", $time, shared_data);
      #5;  // Isleme suresi
      -> ack_received;  // Onay gonder
    end
  end

  // --- Reset sureci ---
  initial begin : reset_gen
    $display("  [%0t] Reset basladi...", $time);
    #20;
    $display("  [%0t] Reset tamamlandi!", $time);
    -> reset_done;
  end

  // --- wait() ile event bekleme ---
  initial begin
    wait(phase_complete.triggered);
    $display("\n  [%0t] Phase tamamlandi (wait ile algilandi)", $time);
  end

  // --- Triggered ozelligi ---
  initial begin
    #200;  // Zaman asimi
    $display("\n=== Events Sonu ===");
    $finish;
  end
endmodule