Search the Community
Showing results for tags 'tlm 2.0'.
-
Is there a way to identify each generic payload transactions with id? I need some id that I can print out as my transaction flows from initiator to target via different modules. Thanks
- 6 replies
-
- tlm 2.0
- generic_payload
-
(and 1 more)
Tagged with:
-
Hello , I am having a closed design which is running using SystemC 2.3.1 , When i updagraded to version 2.3.2 i found an error resulting from multi_socket_bases.h in the b_transport method "Call to b_transport without a registered callback for b_transport" as shown below. multi_socket_bases.h void b_transport(transaction_type& trans,sc_core::sc_time& t){ //check if a callback is registered if (m_b_f && m_b_f->is_valid()) { (*m_b_f)(m_id, trans,t); //do the callback return; } display_error("Call to b_transport without a registered callback for b_transport."); } Although , customer is supposed to be registering callbacks correctly as the register_b_transport function is called , but it looks like the callback pointers are not set due to an extra check as mention below in the end_of_elaboration function in multi_passthrough_socket.h // 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; void end_of_elaboration(){ //'break' here if the socket was told not to do callback binding if (m_eoe_disabled) return; //get the callback binders and the multi binds of the top of the hierachical bind chain // NOTE: this could be the same socket if there is no hierachical bind std::vector<callback_binder_fw<TYPES>* >& binders=get_hierarch_bind()->get_binders(); std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*>& multi_binds=get_hierarch_bind()->get_multi_binds(); // complete binding only if there has been a real bind // THIS IS A NEW CHECK WHICH WAS NOT IN 2.3.1 bool unbound = (binders.size() == 1 && m_export_callback_created); // no call to get_base_interface has consumed the export - ignore if (unbound) return; //// // iterate over all binders for (unsigned int i=0; i<binders.size(); i++) { binders[i]->set_callbacks(m_nb_f, m_b_f, m_dmi_f, m_dbg_f); //set the callbacks for the binder if (multi_binds.find(i)!=multi_binds.end()) //check if this connection is multi-multi //if so remember the interface m_sockets.push_back(multi_binds[i]); else{ //if we are bound to a normal socket //get the calling port and try to cast it into a tlm socket base base_initiator_socket_type* test=dynamic_cast<base_initiator_socket_type*>(binders[i]->get_other_side()); if (!test){display_error("Not bound to tlm_socket.");} m_sockets.push_back(&test->get_base_interface()); //remember the interface } } } When I commented out this extra check , the design worked fine. I would appreciate if you can tell me what could be the reason for this check and what to check ? and if there are any known issues with this extra check ? i can see that there are some fixe 2.3.3 to check the hierarchial binding but it did not work too. Thanks, Samuel
-
Hello, I'm just starting off with TLM-2.0 and would like to explore more about the use cases for byte_enable_ptr. In TLM manual, I see that " A value of 0 shall indicate that that corresponding byte is disabled, and a value of 0xff shall indicate that the corresponding byte is enabled"; Does this mean that we can switch between 0xff and 0x0 if required for every transaction? TLM manual also states that Byte Enable can be used to create burst transfers, can anyone please explain this? Thanks, R.Adiga
-
- byte_enable_ptr
- systemc
-
(and 2 more)
Tagged with:
-
I couldn't find a fifo that I can attached to socket. Are there any fifo available or do we have to create our own fifo? Thanks
-
Hello All, I am trying to create a generic TLM interface for 2 to 3 modules . In which i am virtually inherting the tlm interface . But i am getting an error . Could you tell me the cause of error. example class A : public sc_module, public my_tlm_interface_fw{ }; class B : public sc_module, public my_tlm_interface_forward , public my_tlm_interface_backward{ } class C : public sc_module, public my_tlm_interface_backward{ } and binding C->initiator(B->target) B->initiator(A->target) Error: (E124) sc_export instance not bound to interface at end of construction: export 'i_top.tlm_base_initiator_socket_export_0' (sc_export) In file: ../../../../src/sysc/communication/sc_export.cpp:135
-
Hello all, i am using tlm socket and declared as following tlm_utils::simple_initiator_socket_tagged<current_model> initiator_socket[2]; // in construcot initiator_socket[0] = new tlm_utils::simple_initiator_socket_tagged<current_model>("socket0"); initiator_socket[1] = new tlm_utils::simple_initiator_socket_tagged<current_model>("socket1"); error: no match for ‘operator=’ (operand types are ‘tlm_utils::simple_initiator_socket_tagged<current_model<unsigned int, 32u>, 32u, tlm::tlm_base_protocol_types>’ and ‘tlm_utils::simple_initiator_socket_tagged<current_model<unsigned int, 32u>, 32u, tlm::tlm_base_protocol_types>*’) initiator_socket[0] = new tlm_utils::simple_initiator_socket_tagged<current_model>(txt);
-
Hi everybody! About my model: Here is two different initiators and one target. Initiators makes b_transport to different sockets. first b_transport of each initiator its "req to transition", second - data transition. Could anybody help me to write synch point? My target should will call some behavioral function when all initiators will make "req to transition". Could anybody helps me to change this code? Please, help me! #define SC_INCLUDE_DYNAMIC_PROCESSES #include <systemc.h> #include <tlm.h> #include <tlm_utils\simple_initiator_socket.h> #include <tlm_utils\simple_target_socket.h> SC_MODULE(Initiator) { tlm_utils::simple_initiator_socket<Initiator> socket; void process() { tlm::tlm_generic_payload *trans = new tlm::tlm_generic_payload; sc_time delay = sc_time(10, SC_NS); for(int i =0 ; i < 100; i++) { cout << "Initiator1: send payload with req to target @ " << sc_time_stamp() << endl; socket->b_transport(*trans, delay); if(trans->is_response_ok()) { cout << "Initiator1: Start transaction. Send data @ " << sc_time_stamp() << endl; trans->set_data_ptr(reinterpret_cast<unsigned char*>(&i)); socket->b_transport(*trans, delay); } } } SC_CTOR(Initiator) { SC_THREAD(process); } }; SC_MODULE(Initiator2) { tlm_utils::simple_initiator_socket<Initiator2> socket; void process() { tlm::tlm_generic_payload *trans = new tlm::tlm_generic_payload; sc_time delay = sc_time(0, SC_NS); for(int i =5 ; i < 100; i++) { cout << "Initiator2: send payload with req to target @ " << sc_time_stamp() << endl; socket->b_transport(*trans, delay); if(trans->is_response_ok()) { cout << "Initiator2: Start transaction. Send data @ " << sc_time_stamp() << endl; trans->set_data_ptr(reinterpret_cast<unsigned char*>(&i)); socket->b_transport(*trans, delay); } } } SC_CTOR(Initiator2) { SC_THREAD(process); } }; SC_MODULE(Target) { tlm_utils::simple_target_socket<Target> socket, socket2; bool dataRecievedI1, dataRecoevedI2; virtual void process1(tlm::tlm_generic_payload &tx, sc_time& dt) { if(!dataRecievedI1) { wait(socket->default_event()); } } virtual void process2(tlm::tlm_generic_payload &tx, sc_time& dt) { if(!dataRecoevedI2) { } } SC_CTOR(Target) { dataRecievedI1 = false; dataRecoevedI2 = false; socket.register_b_transport(this, &Target::process1); socket2.register_b_transport(this, &Target::process2); } }; SC_MODULE(Top) { Initiator *initiator; Initiator2 *initiator2; Target *target; SC_CTOR(Top) { initiator = new Initiator ("initiator"); target = new Target ("target"); initiator2 = new Initiator2("initiator2"); initiator->socket.bind(target->socket); initiator2->socket.bind(target->socket2); } }; int sc_main(int argc, char* argv[]) { Top top("top"); sc_start(); getchar(); return 0; }