Verification Engineerの戯言
TLM 2.0 draft #2のユーザーマニュアルのPage.48にInitiatorとTargetの例が載っています。
Initiatorクラスは、次のように定義されています。
そのため、コンストラクタでinit_socketに対して、自分自身をbindしています。
これにより、tlm_bw_nb_transport_ifクラスで必要となるnb_transportと
invalidate_direct_mem_ptrメソッドを実装しています。ただし、実装そのものはダミー関数です。
Initiatorクラスは、次のように定義されています。
struct Initiator: sc_module, tlm::tlm_bw_nb_transport_if<> { tlm::tlm_nb_initiator_socket<32> init_socket; SC_CTOR(Initiator) : init_socket("init_socket") { SC_THREAD(T); init_socket.bind( *this ); } void T() { tlm::tlm_generic_payload t; tlm::tlm_phase phase = tlm::BEGIN_REQ; sc_time delay = SC_ZERO_TIME; init_socket->nb_transport(t, phase, delay); } virtual tlm::tlm_sync_enum nb_transport( tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& t) { return tlm::TLM_REJECTED; // Dummy implementation } virtual void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, sc_dt::uint64 end_range) { } // Dummy implementation };Initiatorクラスは、tlm_bw_nb_transport_ifクラスを継承しています。
そのため、コンストラクタでinit_socketに対して、自分自身をbindしています。
これにより、tlm_bw_nb_transport_ifクラスで必要となるnb_transportと
invalidate_direct_mem_ptrメソッドを実装しています。ただし、実装そのものはダミー関数です。
Initiatorクラスは、SC_THREADマクロで登録したメソッドTの中で、init_socket->nb_transport(t,phase,delay)を
呼んでいます。このnb_transportメソッドは、Targetクラスのnb_transportメソッドが実行されます。
呼んでいます。このnb_transportメソッドは、Targetクラスのnb_transportメソッドが実行されます。
一方、Targetクラスは次のように定義されています。
そのため、コンストラクタでtarg_socketに対して、自分自身をbindしています。
これにより、tlm_fw_nb_transport_ifクラスで必要となるnb_transportと
get_direct_mem_prtrとtransport_dbgメソッドを実装しています。ただし、実装そのものはダミー関数です。
struct Target: sc_module, tlm::tlm_fw_nb_transport_if<> { tlm::tlm_nb_target_socket<32> targ_socket; SC_CTOR(Target) : targ_socket("targ_socket") { targ_socket.bind( *this ); } virtual tlm::tlm_sync_enum nb_transport( tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& t) { return tlm::TLM_REJECTED; // Dummy implementation } virtual bool get_direct_mem_ptr( const sc_dt::uint64& address, tlm::tlm_dmi_mode& dmi_mode, tlm::tlm_dmi& dmi_data) { return false; } // Dummy implementation virtual unsigned int transport_dbg(tlm::tlm_debug_payload& r) { return 0; } // Dummy implementation };Targetクラスは、tlm_fw_nb_transport_ifクラスを継承しています。
そのため、コンストラクタでtarg_socketに対して、自分自身をbindしています。
これにより、tlm_fw_nb_transport_ifクラスで必要となるnb_transportと
get_direct_mem_prtrとtransport_dbgメソッドを実装しています。ただし、実装そのものはダミー関数です。
<<<まとめ>>> Initiatorになるクラスは、 2つのメソッド('''nb_transport'''、'''invalidate_direct_mem_ptr''')を実装します。 Target になるクラスは、 3つのメソッド('''nb_transport'''、'''get_direct_mem_ptr'''、'''transport_dbg''')を実装します。