2. SystemC开发环境搭建:安装SystemC库、配置CMake工程、第一个Hello World模块
说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上大半天。我当年第一次装SystemC库时,光链接错误就折腾了两个小时。嗯,这节课咱们就把这事彻底搞定。
2.1 安装SystemC库
SystemC库本质上是一个C++类库,不是独立的工具。你想想看,它只是帮你用C++写硬件描述的一套基础设施。所以安装过程说白了就是:下载源码、编译、安装。
Linux环境下的安装
我个人习惯用Ubuntu 20.04以上版本。步骤如下:
- 从Accellera官网下载SystemC 2.3.4源码包
- 解压后进入目录,执行标准的三步走
tar -xzvf systemc-2.3.4.tar.gz
cd systemc-2.3.4
mkdir build && cd build
../configure --prefix=/usr/local/systemc-2.3.4
make -j4
sudo make install
这里有个坑——--prefix路径别乱改。我在项目中遇到过有人装到/opt下,结果CMake找库时死活找不到。建议统一用/usr/local/systemc-2.3.4。
/usr/local/systemc-2.3.4/include里有没有systemc.h。没有的话,说明安装失败了。
Windows环境下的安装
Windows上我推荐用MSYS2 + MinGW64。为什么?因为Visual Studio的配置太繁琐,我曾经被它的路径分隔符坑过一整天。
pacman -S mingw-w64-x86_64-gcc
pacman -S mingw-w64-x86_64-cmake
pacman -S mingw-w64-x86_64-make
然后同样下载源码,用CMake生成Makefile:
mkdir build && cd build
cmake .. -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=C:/tools/systemc-2.3.4
mingw32-make -j4
mingw32-make install
C:\Program Files下,结果编译时一堆莫名其妙的错误。
2.2 配置CMake工程
有了库,接下来就是搭工程。我个人强烈推荐用CMake,而不是手写Makefile。为什么?因为CMake能自动处理跨平台路径问题,省心。
一个典型的CMakeLists.txt长这样:
cmake_minimum_required(VERSION 3.10)
project(MySystemCProject)
# 设置SystemC路径
set(SYSTEMC_HOME "/usr/local/systemc-2.3.4")
set(SYSTEMC_INCLUDE_DIR ${SYSTEMC_HOME}/include)
set(SYSTEMC_LIB_DIR ${SYSTEMC_HOME}/lib-linux64)
# 包含头文件
include_directories(${SYSTEMC_INCLUDE_DIR})
# 链接库
link_directories(${SYSTEMC_LIB_DIR})
# 生成可执行文件
add_executable(hello_world hello_world.cpp)
# 链接SystemC库
target_link_libraries(hello_world systemc)
这里有个细节:lib-linux64这个目录名可能因系统而异。我在Ubuntu 22.04上遇到过它叫lib-linux的情况。建议装完库后先ls一下确认。
2.3 第一个Hello World模块
好了,环境搭好了,咱们写个最简单的模块。说白了就是让SystemC打印一句话,证明它能跑起来。
// hello_world.cpp
#include <systemc.h>
SC_MODULE(HelloWorld) {
SC_CTOR(HelloWorld) {
SC_THREAD(say_hello);
}
void say_hello() {
std::cout << "Hello, SystemC World!" << std::endl;
}
};
int sc_main(int argc, char* argv[]) {
HelloWorld hello("hello");
sc_start();
return 0;
}
这段代码干了三件事:
- 定义了一个
SC_MODULE,这是SystemC的基本单元 - 在构造函数里注册了一个线程
SC_THREAD - 在
sc_main里实例化模块并启动仿真
你想想看,这跟C++的main函数有什么区别?嗯,区别在于sc_start()启动了SystemC的内核调度器,它会管理所有线程的执行顺序。
2.4 编译与仿真流程
编译命令很简单:
mkdir build && cd build
cmake ..
make
./hello_world
如果一切顺利,你会看到:
Hello, SystemC World!
嗯,就这么简单。但这里有个常见的坑——链接错误。我曾经遇到过undefined reference to sc_core::sc_time::sc_time(...),原因是链接库的顺序不对。记住:target_link_libraries里systemc一定要写在最后。
- 编写SystemC源码(.cpp文件)
- 编写CMakeLists.txt
- 创建build目录,执行cmake
- 执行make编译
- 运行可执行文件,观察输出
下面这张图展示了整个开发流程的脉络:
这张图把整个流程串起来了。你从左边开始,一步步往右走,最后向下进入仿真。如果仿真结果不对,就沿着虚线箭头回来调试。
sc_time参数,比如sc_start(10, SC_NS),看看输出有什么变化。这能帮你快速理解SystemC的时间模型。
好了,环境搭好了,第一个模块也跑通了。接下来你就可以开始探索更复杂的多核建模了。记住,环境搭建是基础,基础不牢,地动山摇。我当年就是在这上面吃过亏,所以现在每次开新项目,都会先花半小时把环境彻底验证一遍。