Semaphore

Gün 4: Süreçler Arası İletişim (IPC) | Kaynak yönetimi ve senkronizasyon: mutex, çok portlu erişim

Kaynak Kod

// =============================================================================
// GUN 4 - Konu 5: Semaphore - Senkronizasyon ve Kaynak Yonetimi
// =============================================================================

module semaphore_ornek;

  semaphore bus_lock;     // Paylasilan bus erisimi
  semaphore mem_lock;     // Bellek erisimi (2 port)
  int shared_bus_data;

  // Bus'a erisen ajan
  task automatic bus_agent(string name, int num_txn, int delay);
    for (int i = 0; i < num_txn; i++) begin
      $display("  [%0t] %s: Bus erisimi istiyor...", $time, name);
      bus_lock.get(1);  // 1 anahtar al (yoksa bekle)
      $display("  [%0t] %s: Bus KILITLENDI, islem #%0d basliyor", $time, name, i);
      
      shared_bus_data = $urandom;
      #delay;  // Islem suresi
      
      $display("  [%0t] %s: Islem #%0d tamamlandi (data=0x%08h)",
               $time, name, i, shared_bus_data);
      bus_lock.put(1);  // 1 anahtar geri ver
      $display("  [%0t] %s: Bus SERBEST", $time, name);
      #2;  // Islemler arasi bekleme
    end
  endtask

  // Bellege erisen ajan
  task automatic mem_agent(string name, int delay);
    for (int i = 0; i < 3; i++) begin
      if (mem_lock.try_get(1)) begin  // Bloklamadan dene
        $display("  [%0t] %s: Bellek erisimi SAGLANDI", $time, name);
        #delay;
        mem_lock.put(1);
        $display("  [%0t] %s: Bellek serbest", $time, name);
      end else begin
        $display("  [%0t] %s: Bellek MESGUL, atliyor", $time, name);
      end
      #5;
    end
  endtask

  initial begin
    $display("=== Semaphore Kullanimi ===\n");

    // --- Tek anahtarli semaphore (mutex) ---
    $display("--- Bus Mutex (1 anahtar) ---");
    bus_lock = new(1);  // 1 anahtar = mutex

    fork
      bus_agent("Master_A", 3, 10);
      bus_agent("Master_B", 3, 8);
      bus_agent("Master_C", 2, 12);
    join

    // --- Cok anahtarli semaphore ---
    $display("\n--- Bellek (2 port = 2 anahtar) ---");
    mem_lock = new(2);  // 2 es zamanli erisim

    fork
      mem_agent("Port_1", 8);
      mem_agent("Port_2", 6);
      mem_agent("Port_3", 10);
    join

    $display("\n=== Semaphore Sonu ===");
    $finish;
  end
endmodule