模块(SC_MODULE)是SystemC系统建模的一个基本单位。一个系统由许多个模块构成,各个模块实现系统中不同的功能。在设计中,设计者需要根据功能把复杂的系统划分成若干个更小、更易于管理的模块。模块内部包含若干个进程(Process)来描述模块的功能。
一个模块可以包含端口、内部信号、内部数据、子模块、进程、构造函数和析构函数等,这些元素实现了模块要求的功能。SC_MODULE是SystemC库中定义的一个宏,使用它定义一个模块实际上是定义了一个新对象。下面是一个半加器的例子:
//File:myand.h
#include < systemc.h > //该文件中存有SystemC类库的定义,所有SystemC模块都
//必须包含这个文件
SC_MODULE (myand) //这个模块的名字为myand
{
sc_in< bool > a,b; //输入端口
sc_out< bool > c; //输出端口
void proc_and ( ); //声明进程proc_and
SC_CTOR (myand) { //构造函数
SC_METHOD (proc_and); //proc_and是一个SC_METHOD型进程
sensitive < < a < < b ; //敏感变量
}
}
//myand.cpp //这个文件存放进程的定义
#include "myand.h″
void myand::proc_and( )
{
c=a.read( ) & b.read( );
}
模块与模块之间通过通道实现通信,而进程之间则利用通道或事件互相通信。这是最基本的系统建模概念。模块、端口、接口和通道这些概念在4.7.6节事务级建模中已经有过介绍。
信号是SystemC中新增加的一个概念,模块之间的通信需要通过端口连接到通道。信号(以sc_signal为例)实现模块之间端口的连接。信号也是一种通道。
信号与Verilog中的wire类似,可以实现模块之间的互连,这是一种硬件方式的互连,因此是可综合的设计。信号一般通过read( )和write( )函数来读/写,由于信号总是连接到端口上,如sc_in、sc_out及sc_inout 等,也可以通过端口读/写信号。
其中,sc_in端口支持read( )、event( )、posedge( )及negedge( )4种方法,而sc_out和sc_inout还支持write( )方法。
进程是SystemC中基本的运行单元,调用进程可以仿真目标设备或系统的行为。进程是一个独立的处理单元,可以实现SystemC中并发的行为动作。
并发是SystemC在C++基础上新增加的概念。对于每个独立的进程来说,只有在它的敏感信号或敏感事件发生时进程才会被调用,而在其他情况下处于保持状态。
当多个独立的进程有同一个敏感变量时,这个敏感变量可以触发这些进程的调用,实现并发的行为。SystemC的进程有3种:SC_METHOD、SC_THREAD、C_CTHREAD。
全部0条评论
快来发表一下你的评论吧 !