2. SystemC开发环境搭建:安装SystemC库、配置CMake工程、第一个Hello World模块

说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上大半天。我当年第一次装SystemC库时,光链接错误就折腾了两个小时。嗯,这节课咱们就把这事彻底搞定。

2.1 安装SystemC库

SystemC库本质上是一个C++类库,不是独立的工具。你想想看,它只是帮你用C++写硬件描述的一套基础设施。所以安装过程说白了就是:下载源码、编译、安装。

Linux环境下的安装

我个人习惯用Ubuntu 20.04以上版本。步骤如下:

  1. 从Accellera官网下载SystemC 2.3.4源码包
  2. 解压后进入目录,执行标准的三步走
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
注意: Windows路径中不要有空格和中文。我见过有人把SystemC装在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_librariessystemc一定要写在最后。

核心流程总结:
  1. 编写SystemC源码(.cpp文件)
  2. 编写CMakeLists.txt
  3. 创建build目录,执行cmake
  4. 执行make编译
  5. 运行可执行文件,观察输出

下面这张图展示了整个开发流程的脉络:

SystemC开发环境搭建流程 安装SystemC库 配置CMake工程 编写Hello World 编译 仿真运行 调试反馈 每个步骤都可能遇到坑,别怕,多试几次就熟了

这张图把整个流程串起来了。你从左边开始,一步步往右走,最后向下进入仿真。如果仿真结果不对,就沿着虚线箭头回来调试。

我的经验: 第一次跑通Hello World后,建议马上试试修改sc_time参数,比如sc_start(10, SC_NS),看看输出有什么变化。这能帮你快速理解SystemC的时间模型。

好了,环境搭好了,第一个模块也跑通了。接下来你就可以开始探索更复杂的多核建模了。记住,环境搭建是基础,基础不牢,地动山摇。我当年就是在这上面吃过亏,所以现在每次开新项目,都会先花半小时把环境彻底验证一遍。


专注资料整理