我一直在尝试制作符合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之间必须存在某种界限。任何人都可以确认这确实是应该发生的事情,或者对如何解决此限制并拥有更多信号有任何想法吗?
答案 0 :(得分:0)
在64位Linux上,sizeof(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;
}