如图:
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);
t