因为sc_module没有默认构造函数(有一个不带默认值的参数name),所以不能直接使用std::vector来定义一个sc_module 子类 的数组。为了方便定义一个sc_module 子类 的数组,sc_vector就应用而生了。
如果子类只有一个name的参数,则初始化的时候直接init (num)就行了,但如果子类包含除name外的其他参数,此时就需要自己创建一个 create 函数,将函数指针传作为int函数的第2个参数。
// execute:
// g++ -g -Wall -lsystemc -m64 -pthread main.cpp
// -L/$(your systemc path)/lib-linux64
// -I/$(your systemc path)/include -I/$(your systemc path)/src/tlm_utils -o sim
#include <systemc>
#include "tlm.h"
using namespace sc_core;
using namespace std;
using namespace tlm;
class ScModule_1 : public sc_core::sc_module {
public:
SC_HAS_PROCESS(ScModule_1);
explicit ScModule_1(sc_core::sc_module_name name):sc_core::sc_module(name) {}
~ScModule_1() override = default;
int m_idx;
};
class ScModule_2 : public sc_core::sc_module {
public:
SC_HAS_PROCESS(ScModule_2);
explicit ScModule_2(sc_core::sc_module_name name, int idx):sc_core::sc_module(name),m_idx(idx) {}
~ScModule_2() override = default;
int m_idx;
};
class ScVectorTest : public sc_core::sc_module {
public:
SC_HAS_PROCESS(ScVectorTest);
explicit ScVectorTest(sc_core::sc_module_name name);
~ScVectorTest() override = default;
sc_core::sc_vector<ScModule_1> m_model_1;
sc_core::sc_vector<ScModule_2> m_model_2;
};
ScVectorTest::ScVectorTest(sc_core::sc_module_name name)
: sc_core::sc_module(name)
,m_model_1("module_1")
,m_model_2("module_2")
{
m_model_1.init(5);
auto CreateModule2 = [&](const char* name, int index) -> ScModule_2* {
return new ScModule_2(name, index);
};
m_model_2.init(5, CreateModule2);
// m_model_2.init(5); // no matching function for call to ‘ScModule_2::ScModule_2(const char*&)
}
//main
int sc_main(int argc, char ** argv)
{
ScVectorTest *m_sc_vector;
m_sc_vector = new ScVectorTest("sc_vector_test");
sc_start(20,SC_NS);
return 0;
}
注意,CreateModule2这里的 (const char* name, int index) 是必须的,两个参数分别是 数组中相应元素的module name和 index;根据sc_vector的init函数实现,可以发现这里的两个参数跟 调用Creator c时的参数一致。