Ошибка сегмента SystemC в sc_core :: sc_in <bool>:: read () - PullRequest
1 голос
/ 29 октября 2010

У меня повторяющаяся ошибка сегмента при использовании 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 должен обрабатывать все параллельные потоки.

Ответы [ 2 ]

0 голосов
/ 12 мая 2013

Не могли бы вы сказать, если у вас есть решение вашей проблемы.На самом деле мы сталкиваемся с подобной проблемой, seg fault, при чтении логического sc_signal.И проблема исчезает после добавления отпечатков в коде.

0 голосов
/ 29 октября 2010

Звучит как проблема с памятью.Если вы перезапустите буферы где-нибудь, может случиться что угодно - даже такие вещи, как вы объяснили: сбой программы в случайном месте.

Я действительно надеюсь, что вы получили хорошие модульные тесты.Попробуйте использовать valgrind для выявления проблем с памятью.

...