Verification Engineerの戯言
SimpleATTarget2クラスとSimpleATTarger2クラスの違いは、myNBtransportメソッドでコマンドがphaseがtlm::BEGIN_REQのときの処理です。
SimpleATTarget1クラスでは、mEndRequestEvent.notify(t + ACCEPT_DELAY)を実行後、戻り値としてtlm::TLM_ACCEPTを返すのに、
(mEndRequestEventをnotifyしていませんので)
SimpleATTarget1クラスでは、mEndRequestEvent.notify(t + ACCEPT_DELAY)を実行後、戻り値としてtlm::TLM_ACCEPTを返すのに、
// Notify end of request phase after ACCEPT delay if (mEndRequestQueue.empty()) { mEndRequestEvent.notify(t + ACCEPT_DELAY); } mEndRequestQueue.push(&trans); return tlm::TLM_ACCEPTED;SimpleATTarget2クラスでは、phaseをtlm::END_REQに変更し、mEndResponseEvent.notify(t + RESPONSE_DELAY)を実行後、戻り値としてtlm::TLM_UPDATEDを返しています。
// End request phase after accept delay t += ACCEPT_DELAY; phase = tlm::END_REQ; if (mResponseQueue.empty()) { // Start processing transaction after accept delay // Notify begin of response phase after accept delay + response delay mBeginResponseEvent.notify(t + RESPONSE_DELAY); } mResponseQueue.push(&trans); return tlm::TLM_UPDATED;このため、SimpleATTarget2クラスでは、endRequestメソッドが呼ばれません。
(mEndRequestEventをnotifyしていませんので)
endResponseメソッドが呼ばれる相対的な時間は、t+ACCEPT_DELAY+RESPONSE_DELAYになるので同じです。
戻り値がtlm::TLM_ACCEPTとtlm::TLM_UPDATEDと違いますが、それに対応するようにInitiatorクラスを記述する必要があります。
次回はInitiatorクラスについて見ていきます。