Jump to content


  • Posts

  • Joined

  • Last visited

  • Days Won


iamgame last won the day on August 11

iamgame had the most liked content!

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

iamgame's Achievements


Member (1/2)



  1. Hi Eyck and David, Thanks for your responses and help. David - we do have situations where target's (t1) response beats (to a burst req from initiator I1) would be interleaved with response beats from initiator I2. I.e. intra-burst interleaving is required in our model. Could there be ways of 'accounting for' additional delays due to intra-burst interleaving on target's side ? For example - Target T1 has two ports (sockets, 16 bit BUSWIDTH), P1 and P2. On each port T1 gets a req of 64 bits read (resulting in 4 beat response on each port) , and would likely send out data in this seq - BEGIN_RESP_P1_Beat1, BEGIN_RESP_P2_Beat1, BEGIN_RESP_P1_Beat2, BEGIN_RESP_P2_Beat2 ... In such scenario - extending your idea of 'target setting the latency' - can we double the latency for each port ? Interleaving mainly happens due to bank conflict / arbitration. Thanks.
  2. Hi All, We are using convenience sockets (simple initiator/target) in our project, with few point to point buses and simple interconnects and nb_transport() (using 4 Ph base protocol). What would be best way of handling Tx which are longer in length than BUSWIDTH. 4 phase base protocol does not provide 'intermediate' states to let us break transactions into multiple beats. I was unable to glean from SystemC or TLM examples. Could we modify 4 ph protocol to add additional states (for a write Tx) like BEGIN_REQ, BEGIN_NEW_DATA, .(repeat this states as many times as needed; data would be transferred in this state) .., BEGIN_LAST_DATA (to indicate this is last beat). Similarly there would be new states for read Tx. BEGIN_RESP_NEW_DATA, (repeat) and BEGIN_RESP_LAST_DATA. Does this sound complicated ? Thanks.
  3. Hi David, My apologies in getting late about expressing thanks/gratitude for your help. Thank you. Thanks.
  4. 1. Cluster – Is a module, which hosts various compute elements, and multiple arrays of DMEs. In this block diagram two DME-Array – each comprising of 4 DMEs is shown. Cluster is connected to multiple NoCs. Each DME-Array is connected to a NoC based on memory type that the array hosts. 2. DME – Dma and memory element. One DME differs from another in terms of size/banks, security and power characteristics (voltage, and power states) of its memory. There are specific NoC to connect DME-Arrays with specific mem type. There could be multiple NoCs, each connecting common MemType DM arrays. Two such NoCs are shown. 3. DME-Arrays would exchange data with DME-Arrays of another cluster over Noc. We want to model this using convenience sockets. All Transactions originating or terminating from a DME of an DME-Array, would be arbitrated using simple round robin method, and sent to NoC using simple_initiator_socket shown as green bubble. Tx is received in DME-Array from NoC using simple_target_socket using yellow bubble. 4. We want only a pair of initiator / target socket serving all elements of a DME-Array. We would like to instantiate these sockets inside DME class – but have it as static member of the DME-class. This is prohibited by design of the convenience sockets. For now we have instantiated the sockets in Cluster class which is parent of DME. This clutters Cluster class – as these sockets are not used by Cluster class directly or indirectly. They are there because DME would use/access them via parent pointer.
  5. Hi David, Please find the block diagram attached. The textual description that goes with the pic, is in subsequent message. Thanks.
  6. Hi David, Thanks for your response. I will draw a pic and try to highlight the need. Apologize the delay. Thanks.
  7. Hi David, Thanks for you time and response. 1. If I use initializer list of constructor, I would be initializing the socket (a static variable) multiple times. I am looking to design the code in such a way that multiple instances of my_module will all same same socket to send/receive their request. 2. I do not understand uniform initialization syntax. After I declare static tlm_utils::simple_target_socket<my_module> socket; in the definition of class my_module and define the static variable in my source file as tlm_utils::simple_target_socket<my_module> my_module::socket_; I tried initializing it (conditionally, in the constructor) as - socket_ = tlm_utils::simple_target_socket<my_module>("socket") But this run into compiler error as, the socket's assignment operator is disabled/not-allowed. Thanks.
  8. Hi All, Is it possible to have simple_target_socket as static member of a module ? It needs to defined outside the class, can we define and initialize it in constructor ? // header class my_module : public sc_core::sc_module { public: my_module(sc_module_name name); static bool isSockettInitialized_; static tlm_utils::simple_target_socket<my_module> socket_; }; // source file //instantiate socket, cannot initialize it, because it is outside sc_module - it would throw and E100 error. tlm_utils::simple_target_socket<my_module> my_module::socket_; bool my_module::isSockettInitialized_ = false; my_module::my_module(sc_module_name name) : sc_module(name) { if (!isSocketInitialized){ isSocketInitialized = true; // would like to initialize socket_, here, but tlm_utils::simple_target_socket<> class disables assignment operator } } I am unable to find a way to initialize the socket_. 1. If I initialize it outside constructor - I get the error - "Error: (E100) port specified outside of module:" 2. Do not know how to initialize in constructor (as the assignment is disabled) Please help.
  9. Hi All, I coded up (in TLM) few modules for my SoC (cache mem, interconnects, dma engines etc). I have mostly used simple_initiator_socket and simple_target_sockets for all of my SoC components. I'm modelling for cycle accurate comparison with RTL. My aim is to correlate model with RTL design - in terms of cycles consumed, peak/avg bandwidth/latencies at internal and external memories. What is best way to extract, log and aggregate this information ? Is accumulating delays and time info across API calls like simple_initiator_socket::nb_transport_fw/bw() best way to do it ? Are there TLM APIs which aggregates such information over life cycle of simulation run ? After we get all the info rolled up into final numbers, what metrics (e.g. avg cycle / mem req) are typically compared between TLM and RTL design ? Are there some open source designs where model and design are compared ? Thanks
  10. Thanks Eyck. I guess I forgot to add important detail. Class ExistingDesignBase as mentioned in first version - is base for every module in design. There are about 40 modules in the design. And the top level class TlmModule, has few modules inside it. Could this lead up to any issue to sc_module hierarchy ? I observed that this message is thrown from sc_port.cpp if the check for parent of sc_module fails. Thanks
  11. Hi All, I am modifying an existing functional model for my hardware to make it cycle accurate. I get aforesaid error, for my slightly longer hierarchy of classes. class Port { tlm_utils::simple_target_socket<Port> socket_; } class Memory { Port *port; } class TlmMemory::public ExistingMemory{ Memory *mem; } class TlmModule :: public ExistingModule { TlmModule(sc_module_name nm); //socket connection is done here. tlm_utils::simple_initiator_socket<TlmModule> socket_; TlmMemory *tlmMem; } class ExistingModule :: public ExistingModuleBase { } class ExistingModuleBase :: public ExistingDesignBase { } class ExistingDesignBase :: public sc_core::sc_module { } However I do not get the error with following, however this is not what I would ideally like to do - class TlmModule :: public ExistingModule, public sc_core::sc_module { TlmModule(sc_module_name nm); //socket connection is done here. tlm_utils::simple_initiator_socket<TlmModule> socket_; TlmMemory *tlmMem; } class ExistingModule :: public ExistingModuleBase { } class ExistingModuleBase :: public ExistingDesignBase { } class ExistingDesignBase { } I would like request help about why my first method of putting sc_module at the bottom of my class hierarchy is not working. Thanks.
  12. Dear TLM Experts, Could someone please shed some light on this ? I have been able to create a transactionID using extension in GP. In order to trace how each transaction is progressing in my system, I am thinking of using transport_dbg API of sockets, such that every time a socket sends or receives a Tx - it will get logged. Would this be right / clean way of logging every Tx ? I am not clear yet about who would call transport_dbg (with in socket class) after I register a callback for transport_dbg ? Also when is transport_dbg called when Tx travels via non blocking interfaces of an initiator or target sockets ? Thanks.
  13. Hi All Basically for debugging purpose I want to trace every transaction (Tx) going around in my model. I would like to assign an ID to each Tx so that it becomes easy to trace them. I have following questions in this context. I am in early stages of using TLM . 1. What is best way to annotate each Tx ? a) I am thinking of using extensions in generic payload - following ./tlm-2/examples/lock_example.cpp b) Could there be some generic TLM classes in open source that people developed for this specific purpose ? I am thinking of wrappers around core gp, and enhanced sockets classes which could facilitate monitoring and logging of Tx using IDs. 2. What is best way to switch between debug and release version - wherein debug version each Tx is traced ? I guess, like 1.b, I am again asking if you know of open source wrapper classes which can facilitate this in run time ? Thanks.
  14. Hi SC/TLM experts, I have same question/need. Could someone please enlighten ? Are there examples which illustrates usage of gp extensions ? Thanks.
  15. Hi Eyck, Thanks for your replay and help. Will reach out. Thanks.
  • Create New...