jcmel

Usage of Sc_event_or_list

5 posts in this topic

Hello everybody,

I try to use an sc_event_or_list object to catch multiple events but I don't know how to identify the event which occurs. 

the idea is to schedule the transmission of commands at a specific time

After the wait(_allEvents) I would like to test that event changed.

Thanks in advance for your help.

 

Jean-Claude

 

 

 

Here is a part of the code:

 

class Scheduler : public sc_module
{
public:  
    // Constructor
                                                                Scheduler(sc_module_name name);
    // Destructor
                                                                ~Scheduler();
    // Methods
    void                                                    setSchedule(const T_SCHEDULE& schedule);
    void                                                    setDebug(bool debug)                                            { _isDebug =  debug; }
    void                                                    start();
    void                                                    setTimeSynchro();

    // Spawn Thread
    void                                                    threadReceiveEvents();

private:
    static const int                    _MAX_EVTS;

    bool                                    _isDebug;
    sc_vector<sc_event>         _evts;
    T_SCHEDULE                    _schedule;
    sc_event_or_list                  _allEvents;
    sc_time                               _startTime;

};

 

 

const int Scheduler::_MAX_EVTS = 10;

SC_HAS_PROCESS(Scheduler);
Scheduler::Scheduler(sc_module_name name):
    sc_module(name),
    _isDebug(false),
    _evts("scheduler_evts", _MAX_EVTS)
{}

Scheduler::~Scheduler()
{}

void Scheduler::setSchedule(const T_SCHEDULE& schedule)
{
    if (_isDebug)
    {
        std::cout << sc_time_stamp() << "\tScheduler::setSchedule" << std::endl;
        for (unsigned int i = 0; i< schedule.size(); i++)
        {
            Command* cmd = schedule;
            cmd->display();
        }
    }

    _schedule = schedule;

    // Associate event to each command
    for (unsigned int i = 0; i< _schedule.size(); i++)
    {
        _allEvents |= _evts;
    }

    // Spawn process
    sc_process_handle handle = sc_spawn(
            sc_bind(&Scheduler::threadReceiveEvents, this)
            );


}

void Scheduler::start()
{
    if (_isDebug)
    {
        std::cout << sc_time_stamp() << "\tScheduler::start >>> notify Events..." << std::endl;
    }
    for (unsigned int i = 0; i< _schedule.size(); i++)
    {
        Command* cmd = _schedule;
        double time = cmd->getTime();
        sc_time_unit timeUnit = cmd->getUnit();
        _evts.notify(time, timeUnit);
    }

}


void Scheduler::setTimeSynchro()
{
    if (_isDebug)
    {
        std::cout << sc_time_stamp() << "\tScheduler::setTimeSynchro" << std::endl;
    }

    // Observe current time
    sc_time now(sc_time_stamp());
    _startTime = now;
}


void Scheduler::threadReceiveEvents()
{
    if (_isDebug)
    {
        std::cout << sc_time_stamp() << "\tScheduler::threadReceiveEvents() spawned..." << std::endl;
    }

    while (true)
    {
        wait(_allEvents);

        std::cout << sc_time_stamp() << "\tScheduler::threadReceiveEvents() >>> Event received at " << sc_time_stamp() - _startTime << " from " << _startTime << std::endl;
    }
}

Share this post


Link to post
Share on other sites

Hi Jean-Claude,

in SystemC, there is currently no way to identify whether an event has been triggered during/before the current evaluation phase in the simulation.  See e.g. http://forums.accellera.org/topic/4925-/(and other threads) for earlier discussions. 

Btw: I find allEvents a confusing name for an sc_event_or_list.  To me, wait(allEvents) sounds like waiting for all events to be triggered, whereas an or-list will trigger if any event in the list is notified.

 

Greetings from Duisburg,

  Philipp

Share this post


Link to post
Share on other sites

Hi Philip,

 

I am agree with you, the name is not well chosen.

 

I read many threads on the subject but I don't find any solution.  In the thread above, it is proposed to use instead sc_signal<bool> which has an event() method  but  I don't know how.

I need to trigger the signal at a specific time like an event.

 

Thanks.

 

Jean-Claude

Share this post


Link to post
Share on other sites

Hi Jean-Claude,

    one option would be to create an a process sensitive to each event, and then in that process assign (or perhaps toggle the value) of an sc_signal<bool>. You can then make a process sensitive to all the boolean signals, and find out which signal changed by calling the signal's event method.

 

It's a bit messy, but it would work.

 

You could combine the process, the event, and the boolean signal into a hierarchical channel (perhaps using sc_event_queue for guidance),

 

regards

Alan

Share this post


Link to post
Share on other sites

Hi,

I am wondering  if it's possible to clear a sc_event_or_list before adding the sc_event in the loop.

In the class reference I don't see a method to do this.

On 22/11/2016 at 5:01 PM, jcmel said:

// Associate event to each command
    for (unsigned int i = 0; i< _schedule.size(); i++)
    {
        _orEvents |= _evts;
    }

regards

 

Jean-Claude

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