c++ - sc_core::sc_in<bool>::read() 上的 SystemC 段错误

标签 c++ hardware segmentation-fault systemc

我在使用 SystemC 时遇到重复的段错误。在初始化期间,我将值设置为 0。在测试台运行期间,我在模块 (proc) 中将此值设置为 1。这是附加到另一个模块 imem 端口的 sc_signal 变量。输入端口是sc_in类型。

理论上,这个分配应该导致输入端口也被分配 1,当我尝试使用 .read() 函数访问它时,它应该返回 1 并将它分配给 imem 中的另一个内部 sc_signal。

但是,我遇到了段错误。

根据 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端口的声明和绑定(bind):

imem_i = new imem("imem");
imem_i->en_wr(imem_wr_en);

行车信号的声明:

sc_signal<bool> imem_wr_en;

有什么想法吗?想法?我应该尝试的事情?

编辑:有时会发生一些奇怪的事情,即添加或删除代码行会导致段错误消失。一个特定实例涉及添加调试 cout声明固定的东西,但在添加 << std::endl 之后到最后,段错误返回。这对一些人来说意味着我有竞争条件,但理论上 SystemC 应该处理所有并发线程。

最佳答案

听起来像是内存问题。如果你在某处过度运行缓冲区,任何事情都可能发生 - 甚至像你解释的那样:程序在随机位置崩溃。

我真的希望你有好的单元测试。尝试使用 valgrind 检测内存问题。

关于c++ - sc_core::sc_in<bool>::read() 上的 SystemC 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4046977/

相关文章:

delphi - 如何获取CPU一级缓存(主缓存)信息?

linux - "machine hardware"和 "hardware platform"之间的区别

c++ - 为什么我的 C++ 代码在使用 read(...) 函数后会导致段错误?

c - 代码出现段错误,怎么办?

c++ - 处分学生,避免内存泄漏

c++ - std::map 的复制列表初始化,其中 std::variant 作为mapped_type

c++ - 具有多个文件夹的 Visual Studio 项目

c++ - const 成员函数优先于返回值类型匹配

debugging - 硬件观察点-它们如何工作?

c - 段错误 - 使用 Pthreads 和矩阵的 C 程序