MDIO master VIP 圖解 (ArrayBox的妙用)

如圖:

 

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拿到了後發出事件。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章