首页 > 解决方案 > SystemC sc_signal 数组内存边界

问题描述

我一直在尝试使用 SystemC 规范制作一系列信号,但在特定的意外情况下遇到了一些分段错误。这让我相信,使用 SystemC 可以拥有的变量数量存在某种内存限制,我有兴趣确认这一点,并找到解决方法。

考虑以下 sc_main 函数示例:

sc_main(int argc, char* argv[]) {
    sc_signal<float>    values[100];
    return 0;
}

这个运行得很好。但是,当我运行下面的代码时...

sc_main(int argc, char* argv[]) {
    sc_signal<float>    values[100][800];
    return 0;
}

我得到一个分段错误:11。(80,000 个信号)

我进一步发现,在 40,000 个信号时我没有出错,因此在 40,000 和 50,000 之间肯定存在某种界限。谁能确认这确实是应该发生的事情,或者对我如何绕过这个限制并获得更多信号有任何想法?

标签: c++segmentation-faultsystemc

解决方案


在 64 位 Linuxsizeof(sc_signal<float>)上是 192 字节。默认堆栈大小为 8 MB。因此,您可以在堆栈上分配大约 41000 个信号,这与您的实验结果相关。

一般来说,您不应该在堆栈上分配 SystemC 对象。现实世界的设计通常不适合 8 MB。而是在堆上分配:

#include <systemc.h>

struct test_module : sc_module {
    sc_signal<float>    values[100][800];
    SC_CTOR(test_module) {}
};

int sc_main (int argc, char**argv) {
    auto tmod0 = std::make_unique<test_module>("tmod0");
    sc_start();
    return 0;
}

推荐阅读