Jump to content

Unbound multi_passthrough_initiator_socket/multi_passthrough_target_socket

Recommended Posts

In one of my use case I have following ports in my module

tlm_utils::multi_passthrough_initiator_socket<initiator, 32, tlm::tlm_base_protocol_types,0,SC_ZERO_OR_MORE_BOUND> AXI_Master;
tlm_utils::multi_passthrough_target_socket<initiator, 32, tlm::tlm_base_protocol_types,0,SC_ZERO_OR_MORE_BOUND> AXI_Slave;

These two ports are optional not bound at top level. For that I clearly specify the N=0 and POL=SC_ZERO_OR_MORE_BOUND.

In systemc2.3.0, I didn't get any elaboration error with this use case but when I switch to systemc 2.3.1, I get the following errors

Error: /OSCI_TLM-2/multi_socket: ERROR in instance memory_inst.AXI_Slave: Not bound to tlm_socket.
In file: /usr2/pwcd/sw/systemc-2.3.1a/include/tlm_utils/multi_passthrough_target_socket.h:113

Is there some specific reason for this ? Is we can not keep such ports unconnected even with N=0 and POL=SC_ZERO_OR_MORE_BOUND.


Sumit K

Link to post
Share on other sites
  • 1 month later...
  • 2 weeks later...

Hi Philipp

The following code is working fine on 2.3.0 but giving port not bound error with 2.3.1.

#include "tlm.h"

#include "systemc.h"


using namespace std;


#include <tlm_utils/multi_passthrough_initiator_socket.h>

#include <tlm_utils/multi_passthrough_target_socket.h>


class initiator : public sc_module




public :

tlm_utils::multi_passthrough_initiator_socket<initiator,32, tlm::tlm_base_protocol_types,0,::sc_core::SC_ZERO_OR_MORE_BOUND> AXI_Master;

tlm_utils::multi_passthrough_target_socket<initiator,32, tlm::tlm_base_protocol_types,0,::sc_core::SC_ZERO_OR_MORE_BOUND> AXI_Slave;



initiator(sc_module_name name){









virtual tlm::tlm_sync_enum nb_transport_bw(int id,tlm::tlm_generic_payload &,tlm::tlm_phase &,sc_core::sc_time &){return tlm::TLM_ACCEPTED;}

virtual void invalidate_direct_mem_ptr(int id,sc_dt::uint64 start_range,sc_dt::uint64 end_range){}


virtual bool get_direct_mem_ptr(int id,tlm::tlm_generic_payload& trans,tlm::tlm_dmi& dmi_data){return false;}

virtual unsigned int transport_dbg(int id,tlm::tlm_generic_payload& r){return 0;}

void b_transport(int id,tlm::tlm_generic_payload& trans, sc_core::sc_time &t){}

tlm::tlm_sync_enum nb_transport_fw(int id,tlm::tlm_generic_payload& trans, tlm::tlm_phase& phase, sc_core::sc_time& t){return tlm::TLM_ACCEPTED;}


void run(){}





int sc_main(int argc, char** argv){

initiator* initiator_inst = new initiator("initiator_inst");


return 0;








Link to post
Share on other sites
  • 2 months later...

Unfortunately, the fix for this issue didn't make it into the 2.3.2 public review release.  But we have now a possible fix, which is under review for the final 2.3.2 release:

In src/tlm_utils/multi_passthrough_target_socket.h, add the following lines before the loop in multi_passthrough_target_socket::end_of_elaboration():

    // complete binding only if there has been a real bind
    bool unbound = (binders.size() == 1 && m_export_callback_created);
    // no call to get_base_interface has consumed the export - ignore
    if (unbound) return;

Hope that helps,

Link to post
Share on other sites


This topic is now archived and is closed to further replies.

  • Create New...