flashman Posted April 15, 2016 Report Posted April 15, 2016 Hi all, I'm struggling to figure out the difference between peqs. I wrote my own codes but I don't see any usage case difference. Let me to show a simple example for a Target (not a real code but some portions). PEQ WITH GET: In this case along fw path, transaction is inserted in the peq, triggers an event at delay_time. struct Target : sc_module { // DEFINE A PEQ peq_with_get<tlm_generic_payload> peq_target; // DEFINE A THREAD TO TRIGGER PEQ EVENTS void target_thread(); }; tlm_sync_enum Target::nb_transport_fw(tlm_generic_payload& trans, tlm_phase& phase, sc_time& delay) { // GET TRANSACTION // ANNOTATE DELAY TIME REGARDING PROTOCOL delay_time=... // INSERT IN THE PEQ peq_target.notify(trans, delay_time); ... ... return TLM_UPDATE; }; void Target::target_thread(.....) { while(true) { wait(peq_target.get_event()); // GET TRANSACTION! trans = peq_target.get_next_transaction(); // PROCESS TRANSACTION // send response, wait........ } }; peq_with_cb_and_phase: In this case along fw path, transaction is inserted in the peq and after a delay_time triggers a cb. struct Target : sc_module { // DEFINE A PEQ peq_with_cb_and_phase<Target,tlm_generic_payload> peq_target; // DEFINE A THREAD TO TRIGGER PEQ EVENTS void target_cb(); }; // Constructor connect peq to cb Target::Target (......) : peq_target("peq_target", this, &Target::target_cb()) { } tlm_sync_enum Target::nb_transport_fw(tlm_generic_payload& trans, tlm_phase& phase, sc_time& delay) { // GET TRANSACTION // ANNOTATE DELAY/PHASE TIME REGARDING PROTOCOL delay_time=... // INSERT IN THE PEQ peq_target.notify(trans, phase,delay_time); ... ... return TLM_UPDATE; }; void Target::target_cb(.......) { // Triggered from peq calling target_cb at delay_time // Manage Transaction and response return TLM..... } What is the difference ? Can you show me or indicate an example of what can be do with one and can not be do with other ? Sincerely I don't understand. Thank you in advance. Quote
vijay.franklin Posted October 24, 2016 Report Posted October 24, 2016 peq_with_cb_and_phase - has a call back attached. (ie) When the time has expired, a call back function is triggered. You can then process the transaction in the call back function. The call back function also gives the phase. say, the current call back has a phase AR_READY --> you can then do the processing of the state machine for AR_READY. From the LRM: "Transactions emerge in different ways from the two PEQ variants. In the case of peq_with_get, the method get_event returns an event that is notified whenever a transaction is ready to be retrieved. The method get_next_transaction should be called repeatedly to retrieve any available transactions one at a time. In the case of peq_with_cb_and_phase, a callback method is registered as a constructor argument, and that method is called as each transaction emerges. This particular PEQ carries both a transaction object and a phase object with each notification, and both are passed as arguments to the callback method." For example on how this is to be used - you can refer; https://www.doulos.com/knowhow/systemc/tlm2/tlm_2_0_1/#anchor6 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.