У меня повторяющаяся ошибка сегмента при использовании SystemC. Во время инициализации я устанавливаю значение 0. Во время работы тестового стенда я устанавливаю это значение 1 в модуле (proc). Это переменная sc_signal, которая подключена к порту другого модуля imem. Порт ввода имеет тип sc_in.
Теоретически, это назначение должно привести к тому, что входному порту также будет назначен 1, и когда я пытаюсь получить к нему доступ с помощью функции .read (), он должен вернуть 1 и назначить его другому внутреннему sc_signal в imem.
Однако вместо этого я получаю ошибку сегмента.
Согласно gdb, это происходит во время вызова sc_start (10, SC_NS), который я делаю, что имеет смысл, поскольку именно тогда значения должны быть обновлены. Он прослеживается именно до попытки выполнить возврат .read (). Вот быстрый фрагмент возврата стека (-O0 и -g3 с использованием g ++ и gdb6.6, 64-битная система):
#0 0x00000000004c79a6 in sc_core::sc_in<bool>::read (this=0x881a38) at <redacted>/systemC/install_x64/include/sysc/communication/sc_signal_ports.h:515
#1 0x00000000004e4b60 in imem::reg_write (this=0x881910) at ../src/abstract_proc/mems/imem.cpp:33
#2 0x000000000050578e in sc_core::sc_simcontext::crunch(bool) ()
#3 0x00000000005042b4 in sc_core::sc_simcontext::simulate(sc_core::sc_time const&) ()
#4 0x00000000004c65b0 in sc_core::sc_start (duration=10, time_unit=sc_core::SC_NS)
Объявление порта:
SC_MODULE (imem) {
...
sc_in<bool> en_wr;
Объявление функции (происходит в SC_CTOR (imem)):
SC_METHOD(reg_write);
sensitive << clk.pos();
Функция, в которой он умирает:
void imem::reg_write() {
data_wr_d.write(data_wr.read());
wr_addr_d.write(addr_wr.read());
cout << "imem::reg_write()" << std::endl;
en_wr_d.write(en_wr.read());
cout << "imem::reg_write() done" << std::endl;
}
imem::reg_write()
выводится на консоль незадолго до возникновения ошибки сегмента.
Объявление и привязка порта imem:
imem_i = new imem("imem");
imem_i->en_wr(imem_wr_en);
Декларация водителя:
sc_signal<bool> imem_wr_en;
Есть идеи? Мысли? Что я должен попробовать?
РЕДАКТИРОВАТЬ: Иногда происходит добавление или удаление строк кода, что приводит к исчезновению ошибки сегмента. Один конкретный случай включал добавление исправленного оператора debug cout
, но после добавления << std::endl
в конце возвращалась ошибка seg. Для некоторых это означало, что у меня есть состояние гонки, но в теории SystemC должен обрабатывать все параллельные потоки.