Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

InitiatorとTarget

Verification Engineerの戯言

TLM 2.0 draft #2のユーザーマニュアルのPage.48にInitiatorとTargetの例が載っています。
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メソッドが実行されます。

一方、Targetクラスは次のように定義されています。
    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_prtrtransport_dbgメソッドを実装しています。ただし、実装そのものはダミー関数です。

<<<まとめ>>>
Initiatorになるクラスは、
2つのメソッド('''nb_transport'''、'''invalidate_direct_mem_ptr''')を実装します。

Target   になるクラスは、
3つのメソッド('''nb_transport'''、'''get_direct_mem_ptr'''、'''transport_dbg''')を実装します。