参考文章:SystemC入门笔记、预备打工人之SystemC学习
推荐书籍:《SystemC入门》、《SystemC From The Ground Up》
SystemC是基于C++的编程语言。SystemC在C++的基础上增加了一些重要概念,如并发、定时事件和数据类型等概念。SystemC还增加了一个类库,扩展了C++的能力,该类库提供了功能强大的新机制,这种机制可以为具有硬件时序、并发和响应行为的系统结构建模。
SystemC既是系统级语言,也是硬件描述语言,通过SystemC就能为硬件和软件系统建模。SystemC是硬件描述语言,这种语言可以为RTL级的设计建模;SystemC也可以为自己设计的整个系统建模,就像编写软件程序那样,描述该系统的行为。因为SystemC是一种既可以定义硬件组件,又可以定义软件组件的语言,使用SystemC可以无缝地进行软件和硬件的协同仿真。
虽然SystemC可以用于描述硬件,但相比Verilog或VHDL并无优势,仿真速度可能一致或相差无几。SystemC的优势在于可以在更高抽象级别上描述设计,例如用SystemC将设计描述成与时间无关或松散时间的模型,这样就不用像RTL级模型一样把每一个周期下的状态都表现出来,这样就可以显著地加快仿真速度。
在SystemC中常用的数据类型是sc_int/uint、sc_bigint/biguint等可选位宽的整型,写法上为sc_uint<32>、sc_biguint<256>等。此外单比特(1位)的数据类型一般声明为bool。
【注意】 sc_bv/sc_lv 等类型不支持算术操作
端口(sc_in、sc_out、sc_inout)和信号(sc_sigan)都是作为SystemC的硬件类型。sc_signal可以认为是一种通道或连线,类似于Verilog中的wire类型。要表示硬件的话,一般必须要用sc_in、sc_out、sc_signal等硬件类型进行描述。
例如sc_in
SystemC中有三种进程,SC_METHOD(方法进程),SC_THREAD(线进程),SC_CTHREAD(时钟线进程)。进程内会有一个void函数,用于被进程所执行,同时进程还会有一个sensitive敏感列表,用于触发进程
区别:
1、仅SC_METHOD可综合(用于design模块中),线进程和时钟线进程不可综合(一般用于testbench模块中)
2、
SC_METHOD进程必须需要敏感列表(sensitive<<)进行触发才能运行。且每次敏感列表触发后进程内的函数一定会全部执行完一次。
SC_THREAD和SC_CTHREAD线程内的函数从仿真开始时就会开始运行,无需敏感列表触发。但进程内的函数碰到wait()的话会暂时跳出进程,需要敏感列表触发才能重新回到进程内上次wait的地方。且进程内的函数只能从头到尾运行一次,已经顺序执行完的代码不会再次执行(类似于Verilog中的initial)
3、SC_METHOD进程不能使用wait语句,但是能使用next_trigged()与之代替。SC_THREAD和SC_CTHREAD进程可以使用wait语句
敏感列表有上升沿触发,例如sensitive< half_add.h half_add.cpp full_add.h full_add.cpp 全加器模块调用了两个半加器模块,这里半加器模块相当于是子模块,全加器模块相当于一个父模块 以上是全加器的设计部分,需要正常编译运行,还需要testbench(测试平台)和main函数,完整代码可参考https://blog.csdn.net/tristan_tian/article/details/109597259 #include "systemc.h"
SC_MODULE(half_add){
sc_in
#include "half_add.h"
void half_add::prc_half_add(){
sum=a^b;
carry=a&b;
}
全加器模块:
#include "systemc.h"
#include "half_add.h"
SC_MODULE(full_add){
sc_in#include "full_add.h"
void full_add::prc_or(){
carry=c1|c2;
}
左为全加器的结构图,右为单个半加器的结构图
模块之间的两种连接关系
testbench负责发送激励给DUT的输入端口,DUT得到输入激励后,经过执行产生的输出响应通过DUT的输出端口发送给testbench



