如圖:
1. readword 每調用一次,最後都會update RdDataPtr,使其自增1.
2. 關聯數組RdDataArrayBox, Index 是 RdDataPtr, Value 是各個mailbox。 mailbox中放入的是各個transaction。 爲何不直接將RdDataArrayBox的值設爲各個transaction呢? 這是個關鍵所在!不防考慮一下這種情況,在調用了readword後立即調用getword函數。 runloop還沒有來得及把transaction放入到對應的mailbox中,而getword卻要立即返回,當然應該阻塞住getword的返回runloop直到拿到了transaction並放入對應的mailbox中。 回想起來也只有mailbox才能實現這個功能。
3. 所以當我們設計的master要將返回的數據保存以待查用並需要實現阻塞時,通常需要一個ArrayBox來通過put和get實現阻塞。
4. 等待mailbox中排在自己前面的transaction全部處理完畢,這個過程可以用semaphore 加以實現
/////////////////////////////////////////////////////////////////////////////
/*- mdioDone(): Wait until all transactions in the input mailbox
// are finished.*/
/////////////////////////////////////////////////////////////////////////////
task mdioDone();
this.tr = new();
this.tr.TrType = MDIO_m_busTrans::WAIT;
super.trInBox.put(this.tr);
this.tr = null;
super.waitSem.get(1);
endtask
當然上述的3和4也可以用其他方式實現,譬如
3。 通過一個input mailbox和output mailbox加以實現,不過只能是put 到 input mailbox後伴隨着一個 get from output mailbox。請參考I2C Master的VIP, 以及APB3.0 Master的實現。
4。 通過mailbox加以實現,put一個特別的transaction到mailbox中,mailbox拿到了後發出事件。