Ana içeriğe geç

SystemVerilog'da Mailbox Kullanımı

· loading · loading · ·
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Mailboxes 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 23: This Article

📦 SystemVerilog’ta Mailbox Kullanımı
#

Mailboxes (Posta Kutuları), SystemVerilog’ta eşzamanlı süreçler arasında süreçler arası iletişim (IPC) ve veri paylaşımı için güçlü ve pratik bir mekanizmadır. Testbench ve simülasyon ortamlarında sıklıkla producer-consumer (üretici-tüketici) yapıları oluşturmak için kullanılırlar.


🗂️ Mailbox Nedir?
#

Mailbox, süreçler arasında mesajları (verileri) depolayan bir FIFO kuyruğu gibi davranır:

  • Bir üretici süreç, mailbox’a veri gönderir (put).
  • Bir tüketici süreç, mailbox’tan veri alır (get).

Mailbox yapısı hem sınırsız (unbounded) hem de sınırlı (bounded) kuyruk büyüklüklerini destekler:

  • Sınırsız mailbox (varsayılan), put işlemlerinde asla bloklanmaz.
  • Sınırlı mailbox, kuyruk doluysa üreticiyi askıya alarak veri akışını güvenli bir şekilde kontrol eder.

🛠️ Mailbox Oluşturmak
#

Mailbox’lar mailbox sınıfı ve new() yapıcısı kullanılarak oluşturulur.

mailbox mbx;

// Sınırsız mailbox oluştur
initial begin
  mbx = new();
end

// 10 boyutunda sınırlı mailbox oluştur
initial begin
  mbx = new(10);
end

🚦 Mailbox Kullanımı
#

📤 Mailbox’a Veri Göndermek
#

Mailbox’a mesaj koymak için put() task’ı kullanılır.

mbx.put(data); // sınırlı mailbox doluysa bloklanır

Bloklanmadan mesaj göndermek için try_put() kullanılır:

if (mbx.try_put(data)) begin
  // Veri başarıyla eklendi
end else begin
  // Mailbox dolu
end

📥 Mailbox’tan Veri Almak
#

Mailbox’tan mesaj almak için get() task’ı kullanılır.

mbx.get(data); // mailbox boşsa bloklanır

Bloklanmadan almak için try_get() kullanılır:

if (mbx.try_get(data)) begin
  // Veri alındı
end else begin
  // Mailbox boş
end

👀 Mesajı Okumak (Peek)
#

Mailbox’taki bir mesajı kuyruğu boşaltmadan kopyalamak için peek() kullanılır.

mbx.peek(data); // mailbox boşsa bloklanır

Bloklanmadan kopyalamak için try_peek() kullanılır:

if (mbx.try_peek(data)) begin
  // Veri okundu
end else begin
  // Mailbox boş
end

🔍 Temel Metodların Özeti
#

MetodAçıklama
new()Mailbox oluşturur (sınırlı veya sınırsız).
put()Mailbox’a mesaj koyar (doluysa bloklanır).
try_put()Bloklamadan mesaj koymaya çalışır.
get()Mailbox’tan mesaj alır (boşsa bloklanır).
try_get()Bloklamadan mesaj almaya çalışır.
peek()Mesajı kopyalar (kuyruktan silmeden, bloklanır).
try_peek()Bloklamadan mesaj kopyalamaya çalışır.
num()Mailbox’taki mevcut mesaj sayısını döndürür.

🛡️ Yaygın Kullanım Alanları
#

  • Üretici-Tüketici Haberleşmesi: Driver’dan monitör’e işlem gönderimi.
  • Scoreboard Haberleşmesi: Farklı testbench bileşenleri arasında veri iletimi.
  • Akış Kontrolü: Sınırlı kuyruklar ile veri akışını yönetme.

💡 En İyi Uygulamalar
#

✅ Bloklamayan veri akışı senaryolarında try_put() ve try_get() kullan.
✅ Mailbox’ların büyümesini kontrol etmek için her put() çağrısına karşılık bir get() çağrısı yap.
✅ Belirli veri tiplerini kullanırken parametreli mailbox kullanarak tip güvenliğini artır.
✅ Testbench mimarisinde mailbox kullanımını mutlaka dokümante et.


📖 Sonuç
#

Mailboxes, SystemVerilog doğrulama ortamlarında veri paylaşımı ve senkronizasyon için çok yönlü bir mekanizmadır. Doğru kullanıldığında, eşzamanlı süreçler arasında güvenli ve esnek iletişim sağlar ve simülasyon sonuçlarının güvenilirliğini artırır.

module tb_mailbox_demo;

  mailbox mbx;  // Define mailbox

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

  // Producer process: sends data into mailbox
  initial begin
    mbx = new();  // Create an unbounded mailbox

    repeat (5) begin
      automatic int data = $urandom_range(0, 255);
      mbx.put(data);  // Put data into mailbox (blocking)
      $display("[Producer] Sent: %0d at time %0t", data, $time);
      #10;
    end
  end

  // Consumer process: receives data from mailbox
  initial begin
    int received;
    repeat (5) begin
      mbx.get(received);  // Get data from mailbox (blocking)
      $display("[Consumer] Received: %0d at time %0t", received, $time);
      #15;
    end
  end

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

endmodule

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

Related

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 Named Events Kullanımı
· loading · loading
Eğitim Doğrulama SystemVerilog SystemVerilog IPC Named Events 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