Ana içeriğe geç

SystemVerilog'da Named Events Kullanımı

· loading · loading · ·
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Named Events Doğrulama Senkronizasyon
Eğitim Doğrulama SystemVerilog
Axolot Logic
Yazar
Axolot Logic
Sayısal Tasarım Mühendisi
Table of Contents
SystemVerilog Tasarım Serisi - This article is part of a series.
Part 24: This Article

📌 SystemVerilog’ta Named Events Kullanımı
#

Named events (isimlendirilmiş olaylar), SystemVerilog’ta eşzamanlı süreçleri senkronize etmek için kullanılan temel yapılardan biridir. Belirli bir olay meydana geldiğinde bir süreci tetikleyerek veya o olayın gerçekleşmesini bekleyerek süreçler arası sinyalizasyon sağlar. Named events, testbench ve donanım modellemede yaygın olarak kullanılır.


🗂️ Named Event Nedir?
#

Named event, SystemVerilog’ta süreçler arası sinyalizasyon için kullanılan özel bir veri tipidir:

  • -> operatörü ile tetiklenebilir.
  • @ operatörü ile beklenebilir.

Named events, semafor veya mailbox gibi yapılara göre daha hafiftir ve basit senkronizasyon görevleri için idealdir (örneğin, başlat/durdur sinyalleri veya faz bildirimleri).


🛠️ Named Event Bildirimi ve Kullanımı
#

📌 Bildirim
#

event my_event;

🔔 Event Tetikleme
#

-> operatörü kullanarak event tetiklenir ve o event’i bekleyen tüm süreçler uyanır.

-> my_event;

Bu tetikleme tek seferliktir — event durumu, o anki simülasyon zaman adımı sonrası sıfırlanır.


⏳ Event Bekleme
#

Bir event’in tetiklenmesini beklemek için @ operatörü kullanılır:

@(my_event);

Bu komut, event tetiklenene kadar süreci bloklar.


🛡️ Kalıcı Tetikleme Kontrolü
#

Aynı simülasyon zaman adımında bekleyen ve tetikleyen süreçlerin yarış durumlarından (race conditions) kaçınmak için .triggered metodunu kullanabilirsin:

wait (my_event.triggered);

Bu yöntem, event daha önce tetiklenmiş olsa bile sürecin o zaman adımında uyanmasını sağlar.


🔀 Event’leri Birleştirme
#

Bir event’i başka bir event’e atayarak senkronizasyon kuyruklarını birleştirebilirsin:

event a, b;
a = b; // a'ya veya b'ye tetikleme yapılırsa ikisi de etkilenir

Bu şekilde, herhangi bir event tetiklendiğinde her iki event’e bağlı süreçler uyanır.


🔍 Temel Operasyonların Özeti
#

OperasyonAçıklama
eventNamed event bildirimi.
-> event_adi;Event’i tetikler ve bekleyen süreçleri uyarır.
@(event_adi);Event tetiklenene kadar bekler.
event_adi.triggeredEvent’in o zaman adımında tetiklenip tetiklenmediğini kontrol eder.
a = b;İki event’in kuyruklarını birleştirir.

🛡️ Yaygın Kullanım Alanları
#

  • Simülasyon Faz Kontrolü: Clock başlatma/durdurma veya reset işlemleri.
  • Testbench Senkronizasyonu: UVM veya diğer doğrulama frameworklerinde faz yönetimi.
  • Süreç Koordinasyonu: Stimulus üretimi ile scoreboard veya monitör senkronizasyonu.

💡 En İyi Uygulamalar
#

✅ Aynı zaman adımındaki yarış durumlarını önlemek için .triggered kullan.
✅ Event’leri birleştirirken (a = b;), atama öncesinde bekleyen süreçlerin asla uyanmayabileceğini göz önünde bulundur.
✅ Testbench yapısında event kullanımını mutlaka dokümante et ve anlamlı isimler vererek bakımını kolaylaştır.


📖 Sonuç
#

Named events, SystemVerilog’ta süreçler arası senkronizasyon için hafif ama çok gerekli bir araçtır. Doğru kullanıldığında, testbench’lerde netlik ve koordinasyon sağlar, karmaşık tasarımların verimli şekilde simüle edilmesini destekler.

module tb_named_event_demo;

  event start_event;  // Declare a named event
  logic clk = 0;

  // Clock generation
  always #5 clk = ~clk;

  // Stimulus process: triggers the event
  initial begin
    #15;
    $display("[Stimulus] Triggering event at time %0t", $time);
    -> start_event;  // Trigger the event
  end

  // Process that waits for the event
  initial begin
    $display("[Monitor] Waiting for event...");
    @(start_event);  // Wait for the event to be triggered
    $display("[Monitor] Event detected at time %0t", $time);
  end

  // Additional demonstration of .triggered usage
  initial begin
    #10;
    wait (start_event.triggered);
    $display("[Monitor] Event detected (using .triggered) at time %0t", $time);
  end

  // Simulation end
  initial begin
    #50;
    $finish;
  end

endmodule

SystemVerilog Tasarım Serisi - This article is part of a series.
Part 24: This Article

Related

SystemVerilog'da Mailbox Kullanımı
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Mailboxes Doğrulama Senkronizasyon
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Semaphores Kullanımı
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Semaphores Doğrulama Senkronizasyon
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Süreçler Arası Senkronizasyon ve İletişim
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Doğrulama Semaphores Mailboxes Named Events
Eğitim Doğrulama SystemVerilog
SystemVerilog'da Polymorphism ve Sanallık (Virtuality)
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog OOP Nesne Yönelimli Programlama Doğrulama Virtuality
Eğitim Doğrulama SystemVerilog
SystemVerilog'da İleri Nesne Yönelimli Programlama: Yapıcılar, Handle'lar ve Statik Üyeler
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog OOP Nesne Yönelimli Programlama Doğrulama Sınıflar
Eğitim Doğrulama SystemVerilog
SystemVerilog'da İleri OOP: Aggregation, Kalıtım ve Daha Fazlası
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog OOP Nesne Yönelimli Programlama Doğrulama Sınıflar
Eğitim Doğrulama SystemVerilog