📦 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#
Metod | Açı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