Verification Engineerの戯言
SimpleTLInitiator2(_DMI)クラスとSimpleTLInitiator1(_DMI)クラスの違いは、
SimpleTLInitiator1(_DMI)クラスは、tlm::tlm_bw_nb_transport_ifクラスを継承するのに、
SimpleTLInitiator2(_DMI)クラスは、tlm::tlm_bw_nb_transport_ifクラスを継承しません。
そのため、ターゲット側から呼ばれるnb_transportメソッドの扱いが違います。
SimpleTLInitiator2(_DMI)クラスでは、コンストラクタ内でREGISTER_NBTRANSPORTマクロを使って、
socketに対応するメソッド(ここでは、myNBTransport)を対応させます。
myNBTransportメソッドの内容は、SimpleLTInitiator1(_DMI)クラスのnb_transportメソッドと同じになります。
SimpleTLInitiator1(_DMI)クラスは、tlm::tlm_bw_nb_transport_ifクラスを継承するのに、
SimpleTLInitiator2(_DMI)クラスは、tlm::tlm_bw_nb_transport_ifクラスを継承しません。
そのため、ターゲット側から呼ばれるnb_transportメソッドの扱いが違います。
SimpleTLInitiator2(_DMI)クラスでは、コンストラクタ内でREGISTER_NBTRANSPORTマクロを使って、
socketに対応するメソッド(ここでは、myNBTransport)を対応させます。
myNBTransportメソッドの内容は、SimpleLTInitiator1(_DMI)クラスのnb_transportメソッドと同じになります。
SimpleLTInitiator2(sc_core::sc_module_name name, unsigned int nrOfTransactions = 0x5, unsigned int baseAddress = 0x0) : sc_core::sc_module(name), socket("socket"), mNrOfTransactions(nrOfTransactions), mBaseAddress(baseAddress), mTransactionCount(0) { // register nb_transport method REGISTER_NBTRANSPORT(socket, myNBTransport); // Initiator thread SC_THREAD(run); } sync_enum_type myNBTransport(transaction_type& trans, phase_type& phase, sc_core::sc_time& t) { switch (phase) { case tlm::END_REQ: // Request phase ended return tlm::TLM_ACCEPTED; case tlm::BEGIN_RESP: assert(t == sc_core::SC_ZERO_TIME); // FIXME: can t != 0? mEndEvent.notify(t); // Not needed to update the phase if true is returned return tlm::TLM_COMPLETED; case tlm::BEGIN_REQ: // fall-through case tlm::END_RESP: // fall-through default: // A target should never call nb_transport with these phases assert(0); exit(1); return tlm::TLM_REJECTED; }; }
さて、次回は残っているSimpleTLInitiator3(_DMI)クラスです。