信号/端口绑定后,当信号发生变化时,敏感列表将导致SC_METHOD注册方法运行。
当我实现SystemC版本时,我遇到了警告W571。说实话,我认为这个警告是正确的,因为没有活动。但为什么没有我认为应该有的活动就是问题。
第二次调用sc_start()时会出现问题;
我怀疑信号/端口之间的绑定处理不好。
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();
}
}
答案 0 :(得分:0)
我已经解决了这个问题。简而言之,这是我的代码问题(删除不在正确的位置;此外,还有内存泄漏)
将指针类型用作信号/端口时要非常小心。
当sc_start评估是否有活动待处理时,它实际上是在比较m_cur_val和m_new_val。
就我而言,第一次分配 eventSubject = new Event(...)时,请说地址 0x1234
然后由“删除事件; ”
发布现在:m_cur_val指向“0x1234”,值为0xfeeefeee(因为它被释放)
现在来到“ eventSubject = new Event(...)”,内存也分配在“0x1234”。 所以m_new_val是“0x1234”。
因为m_cur_val == m_new_val,SystemC认为没有待处理的活动,所以不会调用SC_MODULE。
如何解决:
添加以下两行代码:
eventSubject = NULL;
sc_start();