sc_start warning W571 indicates the signal/port binding fail?

147 Views Asked by At

After Signal/Port binding, when signal changed, the sensitive list will cause SC_METHOD registered method to run.

When I'm implementing the SystemC version, I met this warning W571. To be honest, I think this warning is correct because there is no activity. But Why there is no activity where I thought there should be is the question.

The problem happens when call sc_start() the second time;

I suspect that the binding between signal/port is not handing well.

SC_MODULE ( MyClass )
{
    SC_CTOR(MyClass)
    {
        SC_METHOD(eventListener);
        dont_initialize();
        sensitive << m_event;
    }
    void eventListener()
    {
        Event* event = m_event.read();
        ...
        delete event;
    }
}

int sc_main (int argc, char* argv[]) 
{
    sc_signal<Event*>   eventSubject;
    MyClass  context("CONTEXT");
    context.m_event(eventSubject);   //bind signal to port, m_event is the port

    while(true)
    {
        getline(cin, in);
        ...
        eventSubject = new Event();
        sc_start();
    }
}
1

There are 1 best solutions below

0
On

I've fixed the issue. In short, it is my code's problem (the delete is not at the correct place; besides, there are memory leaks)

Be very careful when using pointer type as signal/port.


when sc_start evaluating whether there are activities pending, it is actually comparing m_cur_val and m_new_val.

In my case, the first time assigning eventSubject = new Event(...), say the address is 0x1234

then it is released by "delete event;"

Now: m_cur_val is pointing to "0x1234" with value 0xfeeefeee (because it is released)

Now comes to "eventSubject = new Event(...)", the memory is allocated at "0x1234" as well. so m_new_val is "0x1234".

since m_cur_val == m_new_val, SystemC thought there is no activity pending, so the SC_MODULE won't be invoked.


How to fix:

add following two lines of code:

    eventSubject = NULL;
    sc_start();