1、什么是 SystemC
完成一款集成电路需要设计、制造、封装和测试四个步骤。随着集成电路制造技术按照摩尔定律发展,电子系统变得越来越复杂,人们已经可以把复杂的电子系统集成到一个芯片上,这就是所谓的片上系统。
对于一个复杂的片上系统,在进行寄存器传输级设计前需要进行深入的系统级仿真,以确认设计的体系架构是否恰当、总线是否能够满足吞吐量和实时性要求以及存储器是否被浪费。所进行的这些仿真要求在芯片的仿真模型上运行大量的软件,以覆盖所需的功能。
在寄存器传输级,最广泛使用的两种语言是 VHDL 和 Verilog HDL。在设计细化阶段,原始的 C 和 C++ 描述必须手工转换成为 VHDL 或者 Verilog HDL。这种设计方法的缺点是使用不同的语言进行系统描述的不一致性以及手工编写 RTL 代码效率低下。随着系统越来越复杂和相较之下面市时间的越来越紧迫, RTL 级设计越来越不能满足设计的需求,人们迫切需要真正的系统级设计语言,即简化系统级仿真,又能够使用工具自动实现系统到 RTL 级的转换(即电子系统级综合),而不再为 RTL 所烦恼。
正是基于这些想法和需求,人们扩展了 C++ 从而发展了一种新的 IEEE 标准语言,并将这种新的语言称作 SystemC,从本质上讲,SystemC 是 C++ 的扩展库。
2、SystemC 的作用
SystemC 目前主要用于在抽象层次上对芯片进行描述和分析以及建立虚拟原型,当前 SystemC 主要用于系统建模、体系结构建模、开发事务处理级模型和验证
SystemC 可以描述纯功能模型和系统体系结构,也可以描述软硬件的具体实现,但核心是进行电子系统级设计、建模和验证
3、下载编译 SystemC(以 ubuntu 22.04 为例)
3.1 下载解压 SystemC
wget https://www.accellera.org/images/downloads/standards/systemc/systemc-2.3.3.zip
unzip systemc-2.3.3.zip
3.2 编译 SystemC
cd systemc-2.3.3
mkdir build
cd build
cmake .. -DCMAKE_CXX_STANDARD=11 -DDISABLE_COPYRIGHT_MESSAGE=True
make -j
sudo make install
其中 -DCMAKE_CXX_STANDARD=11 表示使用 c++11 进行编译,如果不使用 c++11 编译,但是后面使用了 systemc 的例子使用了 c++11,那么编译就可能会出现问题,比如会出现下面的错误
-DDISABLE_COPYRIGHT_MESSAGE=True 表示不打印 systemc copyright 等信息
3.3 配置环境变量
当我们编译成功之后,头文件和库的路径分别在以下位置
头文件:/opt/systemc/include
动态库文件:/opt/systemc/lib 或者 /opt/systemc/lib64
至于是 /opt/systemc/lib 还是 /opt/systemc/lib64 可以 cd 到对应的目录看一下,大部分都是 /opt/systemc/lib
然后将头文件和库的路径加入到环境变量里,我这里使用的是 zsh,于是就将环境变量加入到 ~/.zshrc 里面,如果是 bash,那么就将环境变量加到 bashrc 中
export LD_LIBRARY_PATH=/opt/systemc/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=C_INCLUDE_PATH:/opt/systemc/include
export CPLUS_INCLUDE_PATH=CPLUS_INCLUDE_PATH:/opt/systemc/include
export LIBRARY_PATH=/opt/systemc/lib:$LIBRARY_PATH
添加完之后保存,然后执行 source ~/.zshrc 让环境变量立即生效
4、写一个 SystemC 程序,验证安装是否成功
// main.cpp
#include <systemc.h>
SC_MODULE (hello_world) {
SC_CTOR (hello_world) {
SC_THREAD(say_hello);
}
void say_hello() {
cout << "Hello World SystemC" << endl;
}
};
int sc_main(int argc, char* argv[]) {
hello_world hello("HELLO");
sc_start();
return (0);
}
编译运行
g++ main.cpp -std=c++11 -lsystemc
./a.out
如果能正常编译运行,说明 SystemC 的安装已经成功了