本文为英文版本翻译,原文地址:Constructor: SC_CTOR
构造函数
每个C++类都需要构造函数,对于普通的C++类,若没有明确提供构造函数,将会自动生成默认构造函数。
而每个systemC模型需要一个唯一的名称,该名称在实例化模型对象时作为参数传入,这就需要构造函数至少有一个参数。
SC_CTOR
SystemC提供了宏SC_CTOR
,可用于声明及定义构造函数。
使用时需注意:
- 需要符合C++对于构造函数的规则
- 该宏声明的构造函数只有一个参数,作为实例对象的名称
- 不能添加用户自定义参数
该宏SC_CTOR
定义如下:
#define SC_CTOR(user_module_name) \
typedef user_module_name SC_CURRENT_USER_MODULE; \
user_module_name( ::sc_core::sc_module_name )
如果需要添加额外的参数,需要使用显示定义构造函数(后文进一步介绍)
下面看下该节示例:
// Learn with Examples, 2020, MIT license
#include <systemc>
using namespace sc_core;
SC_MODULE(MODULE_A) {
SC_CTOR(MODULE_A) { // 构造函数只有一个参数
SC_METHOD(func_a); // 注册成员函数到仿真内核
}
void func_a() { // 成员函数,无输入,无输出
std::cout << name() << std::endl;
}
};
SC_MODULE(MODULE_B) {
SC_CTOR(MODULE_B) { // 构造函数
SC_METHOD(func_b); // 注册成员函数到仿真内核
}
void func_b(); // 声明成员函数
};
void MODULE_B::func_b() { // 定义成员函数
std::cout << this->name() << std::endl;
}
SC_MODULE(MODULE_C) { // 该类的构造函数有多个参数
const int i;
SC_CTOR(MODULE_C); // 推荐使用SC_HAS_PROCESS,后文进一步介绍
MODULE_C(sc_module_name name, int i) : sc_module(name), i(i) { // 显示构造函数
SC_METHOD(func_c);
}
void func_c() {
std::cout << name() << ", i = " << i << std::endl;
}
};
int sc_main(int, char*[]) {
MODULE_A module_a("module_a");
MODULE_B module_b("module_b");
MODULE_C module_c("module_c",1);
sc_start();
return 0;
}
运行结果:
module_a
module_b
module_c i = 1
小结
- 了解SC_CTOR
- 需要使用显示构造函数以传入多个参数