MDIO master VIP 图解 (ArrayBox的妙用)

来源:互联网 发布:美橙表业淘宝上没有 编辑:程序博客网 时间:2024/06/05 03:24

如图:

 

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拿到了后发出事件。