---
# System prepended metadata

title: '[DV筆記] Systemverilog - Mailbox'
tags: [DV筆記, systemverilog]

---

# [[DV筆記] Systemverilog - Mailbox](/LnkKNLLcS76GG7SLUYt_mA)
## 前言
Mailbox 對於整個驗證環境來說非常重要，UVM中的TLM (transaction level modeling)也是建立在 Mailbox 上去實現的，Mailbox 主要負責不同 process 中的 data transfer，也可以當作不同task/function或是UVM中各component 之間的 handshake機制

## 語法
Mailbox 又分為 可以放各種datatype的 Gneric Mailbox 以及只能放特定 datatype 的 Parameterized Mailbox

### Generic Mailbox
這類的 mailbox 可以放各種datatype，在使用上來說非常方便，只是如果遇到需要限制特定 datatype 的傳輸的時候，使用這類型的 mailbox 就不能去避免 bug 出現
```
mailbox mbx = new(); //表示這個 mailbox 沒有大小的限制
mailbox mbx_limited = new(5); // 表示 mbx_limited 最多只能放5個 datatype

//mailbox function and method
mbx.put(1); //放入 int 1;
int data;
mbx.get(data); //data = 1, 且 mbx中的 1 被 remove
mbx.try_put(2); // 這是 nonblokcing 的，如果 mbx 沒有滿，就會放入1，並且 return 大於0整數，如果mbx 已經滿了，則會return 0
mbx.try_get(data);// 這是 nonblokcing 的，如果 mbx 不是空，data=2，並且 return 大於0整數，如果mbx 是空的，則會return 0
mbx.peek(data); // 跟 get 類似，只是不會 remove mailbox 裡面的 data
mbx.try_peek(data) // 這是 nonblocking的，如果mailbox 是空的，會 return 0, 如果不是空的會 copy 到 data中，但不會 remove mailbox 中的 data
```

### Parameterized Mailbox
會限制放入mailbox 的 datatype
```
mailbox #(int) mbx=new();
mbx.put("a"); //會報錯!
mbx.put(100); //可以
```

## 結語
mailbox 大概是個簡單的概念，不過卻是十分實用的，後來也廣泛應用在UVM中 data transfer 的應用中






