SystemC中的模块与进程

描述

SystemC中的模块

模块(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中并发的行为动作。

并发是SystemC在C++基础上新增加的概念。对于每个独立的进程来说,只有在它的敏感信号或敏感事件发生时进程才会被调用,而在其他情况下处于保持状态。

当多个独立的进程有同一个敏感变量时,这个敏感变量可以触发这些进程的调用,实现并发的行为。SystemC的进程有3种:SC_METHOD、SC_THREAD、C_CTHREAD。

  • • 方法进程(SC_METHOD)是目前唯一可综合的寄存器传输级进程,它可以描述同步或非同步系统。方法进程由sensitive()、sensitive_pos( )、sensitive_neg( )等函数中的敏感信号触发。当敏感列表上有事件发生时,方法进程就会被调用。方法进程调用后需要立即返回,因此在该进程中不允许使用wait( )之类的语句。方法进程由于面向可综合的设计,而且方法进程的调用特性使它更倾向于在较低的抽象层次上使用,如在寄存器传输层次上。
  • • 线程进程(SC_THREAD)在执行过程中能够被挂起和重新激活,可以使用wait( )语句执行挂起动作,当敏感事件发生时被重新激活执行。由于线程进程的这个特点,它更加适合于较高抽象层次上的行为和系统的描述。线程进程的另外一个用途就是可以用来描述验证平台(testbench)。
  • • 钟控线程进程(SC_CTHREAD)是一种继承于线程进程的特殊进程,可以认为是线程进程和方法进程在描述行为上的一个折中。它只能在时钟的上升沿或下降沿被触发,这种行为其实更接近于实际硬件的行为。
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分