SystemC语法入门

参考文章:SystemC入门笔记、预备打工人之SystemC学习
推荐书籍:《SystemC入门》、《SystemC From The Ground Up》

SystemC语法入门

概述:

SystemC是基于C++的编程语言。SystemC在C++的基础上增加了一些重要概念,如并发、定时事件和数据类型等概念。SystemC还增加了一个类库,扩展了C++的能力,该类库提供了功能强大的新机制,这种机制可以为具有硬件时序、并发和响应行为的系统结构建模。
SystemC既是系统级语言,也是硬件描述语言,通过SystemC就能为硬件和软件系统建模。SystemC是硬件描述语言,这种语言可以为RTL级的设计建模;SystemC也可以为自己设计的整个系统建模,就像编写软件程序那样,描述该系统的行为。因为SystemC是一种既可以定义硬件组件,又可以定义软件组件的语言,使用SystemC可以无缝地进行软件和硬件的协同仿真。
虽然SystemC可以用于描述硬件,但相比Verilog或VHDL并无优势,仿真速度可能一致或相差无几。SystemC的优势在于可以在更高抽象级别上描述设计,例如用SystemC将设计描述成与时间无关或松散时间的模型,这样就不用像RTL级模型一样把每一个周期下的状态都表现出来,这样就可以显著地加快仿真速度。

数据类型:

SystemC语法入门_第1张图片
在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 >就表示数据类型是16位宽的无符号整型的输入端口。如果只是单纯的sc_uint<16>,就只表示16位宽的无符号整型的变量。

进程:

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< 下降沿触发,例如sensitive< 值被改变时触发,例如sensitive<

全加器的实例:
半加器模块:

half_add.h

#include "systemc.h"
SC_MODULE(half_add){
	sc_in a,b;
	sc_out sum,carry;
	void prc_half_add();
	SC_CTOR(half_add){
	SC_METHOD(prc_half_add);
	sensitive<

half_add.cpp

#include "half_add.h"
void half_add::prc_half_add(){
	sum=a^b;
	carry=a&b;
}
全加器模块:

full_add.h

#include "systemc.h"
#include "half_add.h"
SC_MODULE(full_add){
    sc_in a,b,c_i;
    sc_out sum,carry;
    sc_signal c1,s1,c2;
    void prc_or();
    half_add * half1_ptr,*half2_ptr;
    SC_CTOR(full_add){
        half1_ptr= new half_add("half1");
        half1_ptr->a(a);
        half1_ptr->b(b);
        half1_ptr->sum(s1);
        half1_ptr->carry(c1);
        half2_ptr= new half_add("half2");
        half2_ptr->a(s1);
        half2_ptr->b(c_i);
        half2_ptr->sum(sum);
        half2_ptr->carry(c2);     
    	SC_METHOD(prc_or);
    	sensitive<

full_add.cpp

#include "full_add.h"
void full_add::prc_or(){
carry=c1|c2;
}

全加器模块调用了两个半加器模块,这里半加器模块相当于是子模块,全加器模块相当于一个父模块
SystemC语法入门_第2张图片
左为全加器的结构图,右为单个半加器的结构图
SystemC语法入门_第3张图片
模块之间的两种连接关系

以上是全加器的设计部分,需要正常编译运行,还需要testbench(测试平台)和main函数,完整代码可参考https://blog.csdn.net/tristan_tian/article/details/109597259

testbench和design之间的关系:

SystemC语法入门_第4张图片
testbench负责发送激励给DUT的输入端口,DUT得到输入激励后,经过执行产生的输出响应通过DUT的输出端口发送给testbench

你可能感兴趣的:(SystemC学习,c++,linux)