[SC]SystemC语法小结(一)
SystemC语法小结(一)
摘要:在 SystemC 中,可以在类的内部声明函数,然后在类的外部实现这些函数。具体来说可以这样做:
- 在类内部声明函数(只提供函数签名)。
- 在类外部实现这些函数的逻辑。
- 使用
public
,protected
, 和private
访问修饰符来控制函数和成员变量的访问权限。
以下是具体说明和完整代码示例:
一、访问修饰符的规则
public
:- 类外部可以直接访问。
- 通常用于接口函数(如
read()
和write()
)。
protected
:- 类外部无法直接访问。
- 仅供类本身及其派生类访问。
- 一般用于需要子类重写或共享的函数。
private
:- 类外部和派生类均无法访问。
- 通常用于类内部的辅助函数或数据。
代码示例
以下是一个在类内部声明函数,并在类外部实现函数的完整示例:
#include <systemc.h>// 声明一个简单的类 MyModule
class MyModule : public sc_module {
public:// 构造函数SC_HAS_PROCESS(MyModule);MyModule(sc_module_name name);// 公有函数声明void public_function();protected:// 受保护函数声明void protected_function();private:// 私有函数声明void private_function();int data; // 私有变量
};// 在类外部实现构造函数
MyModule::MyModule(sc_module_name name) : sc_module(name), data(0) {// 注册 SC_THREAD 进程SC_THREAD(main_process);
}// 在类外部实现公有函数
void MyModule::public_function() {std::cout << sc_time_stamp() << ": Public function called." << std::endl;protected_function(); // 调用受保护函数
}// 在类外部实现受保护函数
void MyModule::protected_function() {std::cout << sc_time_stamp() << ": Protected function called." << std::endl;private_function(); // 调用私有函数
}// 在类外部实现私有函数
void MyModule::private_function() {std::cout << sc_time_stamp() << ": Private function called. Data = " << data << std::endl;
}// SC_THREAD 进程的实现
void MyModule::main_process() {wait(10, SC_NS); // 等待 10 nspublic_function(); // 调用公有函数
}// 主函数
int sc_main(int argc, char* argv[]) {// 实例化 MyModuleMyModule my_module("MyModule");// 启动仿真sc_start(20, SC_NS);return 0;
}
代码解析
-
类内部声明函数:
public:void public_function();protected:void protected_function();private:void private_function();
- 在类中声明函数签名,但不实现具体逻辑。
- 根据函数的访问权限划分为
public
,protected
, 或private
。
-
类外部实现函数:
- 在类外部使用
ClassName::FunctionName
的形式实现函数。 - 例如:
void MyModule::public_function() {std::cout << sc_time_stamp() << ": Public function called." << std::endl; }
- 在类外部使用
-
访问修饰符的作用:
public_function()
: 可以在类外部直接调用。protected_function()
: 只能在类内部或派生类中调用。private_function()
: 只能在类内部调用。
-
SystemC 进程注册:
- 在构造函数中注册一个 SC_THREAD 进程,用于调用
public_function()
。
- 在构造函数中注册一个 SC_THREAD 进程,用于调用
SC_THREAD(main_process);
5. 仿真输出:
- 在仿真中,
main_process
调用了public_function()
,依次触发了protected_function()
和private_function()
。
仿真输出示例
运行上述代码后,输出如下:
10 ns: Public function called.
10 ns: Protected function called.
10 ns: Private function called. Data = 0
注意事项
-
访问控制:
- 选择合适的访问修饰符(
public
,protected
,private
)以保护类的封装性。 - 一般来说,接口函数(供外部调用)设置为
public
,类内部使用的辅助函数设置为protected
或private
。
- 选择合适的访问修饰符(
-
类外实现:
- 函数实现必须写在类定义文件之外。
- 使用
ClassName::FunctionName
的形式标记函数归属。
-
SystemC 特性:
- 在 SystemC 模块中,构造函数需要使用
SC_HAS_PROCESS
宏注册进程。 SC_THREAD
或SC_METHOD
用于定义仿真的行为。
- 在 SystemC 模块中,构造函数需要使用
通过这种方式,你可以在保持类定义简洁的同时,将函数实现与类分离,便于代码的可读性和维护性。