После привязки Сигнал / Порт при изменении сигнала в чувствительном списке запускается зарегистрированный метод 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();
}
}
Я исправил проблему. Короче говоря, это проблема моего кода ( удалять не в правильном месте; кроме того, есть утечки памяти)
Будьте очень осторожны при использовании типа указателя в качестве сигнала / порта.
когда sc_start оценивает наличие ожидающих действий, он фактически сравнивает m_cur_val и m_new_val.
В моём случае первое назначение присваивает eventSubject = new Event (…), скажи адрес 0x1234
тогда это выпущеноудалить событие;«
Теперь: m_cur_val указывает на «0x1234» со значением 0xfeeefeee (потому что оно выпущено)
Теперь доходит доeventSubject = new Event (…)msgstr «, память также выделена в» 0x1234 «.
поэтому m_new_val равен «0x1234».
так как m_cur_val == m_new_val, SystemC считает, что нет ожидающих действий, поэтому SC_MODULE не будет вызываться.
Как исправить:
добавить следующие две строки кода:
eventSubject = NULL;
sc_start();
Других решений пока нет …