Jump to content
flashman

peq_with_get VS peq_with_cb_and_phase

Recommended Posts

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.

 

 

Share this post


Link to post
Share on other sites

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;

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×