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