Vengineerの妄想(準備期間)

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

socket

Verification Engineerの戯言

http://blogs.yahoo.co.jp/verification_engineer/27806028.html
で書きましたが、ユーザーマニュアルを読んでみて、socketはちょっと違うようです。

TLM 2.0 draft #2では、InitiatorとTargetはそれぞれsocketを持つことになります。
InitiatorはInitiator socketを、TargetはTarget socketを持つことになります。

InitiatorとTarget間は、2つのパスを持っていて、
Initiator -> Targetへのパスは、Forward path、Target -> Initiatorへのパスは、Backward pathになります。

Forward pathでは、Initiator側がportでTarget側がexportになります。
一方、Backword pathでは、Target側がportでInitiator側がexportになります。

つまり、socketとはportとexportの機能を持つことになります。
具体的には、ユーザーマニュアルのPage.43では、tlm_initiator_socketクラスを次のように定義しています。以下はかなりの部分を省略しています。
    template <
    unsigned int BUSWIDTH = 32,
    typename FW_IF = tlm_fw_nb_transport_if<>,
    typename BW_IF = tlm_bw_nb_transport_if<>
    >
    class tlm_initiator_socket : public sc_core::sc_port<FW_IF>
    {
        public:
            typedef sc_core::sc_export<bw_interface_type> export_type;
     
        protected:
            export_type mExport;
    };
つまり、tlm_initiator_socketクラスは、sc_portクラスの子クラスであり、sc_exportをメンバーに持っています。また、tlm_target_socketクラスは、tlm_initiator_socketクラスとは逆になり、sc_exportクラスの子クラスであり、sc_portをメンバーに持っています。
    template <
    unsigned int BUSWIDTH = 32,
    typename FW_IF = tlm_fw_nb_transport_if<>,
    typename BW_IF = tlm_bw_nb_transport_if<>
    >
    class tlm_target_socket : public sc_core::sc_export<FW_IF>
    {
        public:
            typedef sc_core::sc_export<fw_interface_type> export_type;
        protected:
            port_type mPort;
    };

うまく考えていますね。