本文为英文版本翻译,原文地址:Learn SystemC - SystemC Module
什么是systemC模型
- 最小的功能容器,包含状态、行为、层级连接结构
- 是一个c++类,继承systemC基础类:sc_module
- 是SystemC的原理结构构建块
- 用于表示真实系统中一个组件
如何定义一个systemC模型
定义一个systemC模型有如下几种方式:
- SC_MODULE(module_name) {}
使用systemC提供的宏SC_MODULE
定义一个模型。
#define SC_MODULE(user_module_name) \
struct user_module_name : ::sc_core::sc_module
可以看到,使用宏定义和第二种方式相同。
2. struct module_name: public sc_module {}
使用继承sc_module
的结构体定义模型
3. class module_name : public sc_module { public: }
使用继承sc_module
的类定义模型
class和struct区别:
class默认成员private;struct默认成员public
如何使用systemC模型:
- sc_module模型只能在阐述阶段构造,在仿真阶段实例化模型将出现错误
- 模型需要至少一个构造函数,构造函数只能有一个
sc_module_name
类型的参数,及其它类型参数。 - 创建模型实例时需要传入字符串参数作为实例名称
- 模型间交互需要使用接口方法,即模型和外部交互需要通过它的ports,其它交互方法主要用于调试
下面是模型具体定义及使用示例:
// Learn with Examples, 2020, MIT license
#include <systemc>
using namespace sc_core;
SC_MODULE(MODULE_A) { // 方式1, 使用systemC提供的宏:SC_MODULE
SC_CTOR(MODULE_A) { // 默认构造函数
std::cout << name() << " constructor" << std::endl; // name() 返回对象名称,该名称在实例化时提供
}
};
struct MODULE_B : public sc_module { // 方式2, 使用结构体声明
SC_CTOR(MODULE_B) {
std::cout << name() << " constructor" << std::endl;
}
};
class MODULE_C : public sc_module { // 方式3, 使用类声明
public: // 构造函数需要public
SC_CTOR(MODULE_C) {
std::cout << name() << " constructor" << std::endl;
}
};
int sc_main(int, char*[]) { // systemC主入口
MODULE_A module_a("module_a"); // 实例化module_a, 实践中经常模型名称(字符串“module_a")和对象名称一致
MODULE_B module_b("modb"); // 实例化module_b, 模型名称(modb)和对象名称(module_b)不一致
MODULE_C module_c("module_c"); // 实例化module_c
sc_start(); // 可以不调用sc_start(),因为模型实例化过程是阐述阶段完成,该阶段发生在st_start前
return 0;
}
运行结果:
module_a constructor
modb constructor
module_c constructor