本文为英文版本翻译,原文地址:Learn SystemC - Hello World
输出字符串
在systemC环境中有两种方式输出字符串:
- c++: 在c++常规函数输出
- systemc: 在SystemC仿真内核调用的SystemC仿真函数输出
在开始学习之前,需要先了解以下基础内容:
SystemC头文件
要使用SystemC库,程序需要包含SystemC头文件,当前包含头文件有两种形式:
-
#include <systemc.h>
- systemc.h将命名空间sc_core和sc_dt中的所有名称添加到它的声明区域中,同时也添加了sc_unnamed以及C/C++中部分选定名称(例如cin、cout、iostream)
- systemc.h主要是为了兼容早期的SystemC版本,在未来可能废弃
-
#include <systemc>
相比较systemc.h,systemc没有默认使用using引入命名空间
在实践中,通常可以先包含头文件#include <systemc>
,再通过using引入相关命名空间:using namespace sc_core
,开发者可按照实际需要再添加其他。
SystemC主入口
普通的c++程序主入口通常是main()
,而使用SystemC库的程序主入口是int sc_main(int argc, char* argv[])
。
这是因为SystemC库中已定义了main()
函数,SystemC库会调用sc_main()
并传递命令行参数。
SytemC模型
一个SystemC模型使用class
或struct
定义,其继承sc_module
。
在后续的示例中会进一步讨论。
下面是经典的HelloWorld之SystemC版本:
// Learn with Examples, 2020, MIT license
#include <systemc> // 包含 systemC 头文件
using namespace sc_core; // 引入命名空间
void hello1() { // 常规c++函数
std::cout << "Hello world using approach 1" << std::endl;
}
struct HelloWorld : sc_module { // 定义一个systemC模型
SC_CTOR(HelloWorld) {// 构造函数,后文中进一步说明
SC_METHOD(hello2); // 注册一个成员函数到systemC仿真内核
}
void hello2(void) { // a function for systemC simulation kernel, void inside () can be omitted
std::cout << "Hello world using approach 2" << std::endl;
}
};
int sc_main(int, char*[]) { // 主入口
hello1(); // 方式 #1: 调用常规函数
HelloWorld helloworld("helloworld"); // 方式 #2, 创建一个systemC模型实例
sc_start(); // 启动systemC仿真内核,systemC仿真内核调用helloworld.hello2();
return 0;
}
运行结果:
Hello world using approach 1 # hello1()输出
Hello world using approach 2 # hello2()输出