分类: C/C++
2008-11-28 15:08:01
摘要:针对目前设计中的时间瓶颈,根据系统建模语言对SoC进行事务级建模的方法,提出并实现了采用该方法构建基于规范的SoC片内总线模型的方案。模型采用了SystemC2.0的接口、端口和通道的概念,这使模型具有很好的开放性和可扩展性。模型各部分间的通信通过调用各接口内定义的函数来进行,模型运行时只使用SystemC自带的轻量级仿真内核。实验结果表明:本总线模型完全符合AMBA2.0规范,可以有效克服目前SoC软硬件协同设计中的时间瓶颈。
关键词:微处理器总线结构;系统C建模语言;事务级;系统集成芯片
引言
系统集成芯片SoC(System-on-Chip)是一种由硬件和软件构成的混合系统。目前常用的开发方法是硬件工程师使用硬件描述语言(如VHDL、Verilog)建立硬件模型,软件工程师使用高级语言(如C、C++)来建立软件模型,然后通过远程过程调用、Socket通信等方式进行软硬件协同仿真、协同验证。该方法存在着以下局限性:①硬件描述语言抽象层次较低,更多关注硬件在RTL级上的特性。随着SoC硬件部分复杂度不断增加,其仿真时间会变得很长。②远程过程调用、Socket通信等带来了大量时间开销。③软硬件使用不同的语言描述,软硬件的开发是分开进行的。软硬件协同仿真只能等硬件的RTL级模型开发出来后才能进行,延长了开发周期。
为了解决上述不足,国内外提出了不同的方法。研究比较多的是通过扩展软件高级编程语言如JAVA;或者使用一种专门的语言如SDL(specification and description language);或者通过扩展硬件描述语言来进行系统高层建模。
这些方法虽然支持对系统进行更高抽象级建模,从一定程度上缩短了开发周期,但软硬件仍使用不同语言描述,软硬件开发仍是分开进行的,还是会用到远程过程调用等通信方式。因此本文采用了基于标准C++扩充的系统建模语言(SystemC),对SoC在更高的抽象级(相对于RTL级),即事务级进行了软硬件统一建模。详细地给出了基于AM-BA(ARM microcontroller bus architecture)[9]规范的片内总线的事务级模型的设计与实现。
基于AMBA的SoC体系结构
由ARM公司开发的AMBA总线是目前SoC片内总线的行业标准。如图1所示,基于AMBA的SoC体系结构一般由高性能系统总线AHB(the advanced high-performance bus)或ASB(the advanced system bus)和低带宽的外围总线APB(the advanced peripheral bus)组成,系统总线和外围总线通过总线桥进行连接。系统总线上接有CPU、片上存储器、以及DMA(direct memory access)等设备;外围总线上接低速外围设备。
主设备(如微处理器)能够通过提供地址信息和控制信息来发起读/写操作。从设备(如存储器)在给定地址空间内响应读/写操作。仲裁器对主设备的请求进行仲裁,确保同一时刻只有一个主设备使用总线。译码器对每次传输的地址进行译码,给相应的从设备发出选中的信号。
图1 典型AMBA结构图
事务级AMBA总线模型的设计与实现
在SoC设计中,事务[10]是指在被建模和被仿真的系统中,两个部件之间的一次数据或者事件的传输。事务级的一次事务可以对应到RTL级的一个或者多个周期的行为;事务级的模块没有定义管脚,模块间通信通过函数调用来进行,而不是像RTL级那样通过管脚信号来进行。事务级比RTL级抽象层次更高就体现于此。
总线模型的设计
SystemC2.0中的端口(port)、通道(channel)、接口(interface)概念大大方便了事务级模型的开发。接口声明了一套方法(methods),这些方法在通道里实现。通道模块实现一个或者多个接口中定义的方法。端口用于连接模块(module)和通道,一个模块里的进程可以通过端口调用通道模块里实现的方法。图2所示的是事务级总线模型。图3所示的是接口类关系。总线模型中定义了总线接口、译码器接口、仲裁器接口以及从设备接口。这些接口中定义的方法在相应的通道模块中实现。还定义了主设备端口,这样主设备模块可以通过它们调用总线接口中定义的方法。
总线模型的实现
AHB总线模块
在AHB总线接口(businterface)中定义了两类方法:非阻塞方式(non-blocking)和阻塞方式(blocking)。非阻塞方式下主设备模块控制传输,在此过程中,主设备检查传输的状态信息,可以对其他事务(比如中断)做出响应;阻塞方式下总线模块控制传输,发起阻塞读/写的主设备在传输过程中不能再对其他事务做出响应。在本模型中,当主设备调用阻塞方式的方法时,运行在主设备模块中的进程会被挂起,传输完成后恢复运行;而当主设备调用非阻塞方式的方法时,主设备模块的进程不会被挂起。AHB总线通道模块实现了总线接口中的上述两类方式方法,供主设备模块调用。
图2 事务级AMBA总线模块图
图3 接口类关系图
非阻塞方式的方法包括非阻塞读操作和非阻塞写操作,读操作被定义为:
virtualbool
read(intmaster-id,//主设备号
data-pointerdata-buffer,//数据缓冲区指针
address-typestart-address,//读操作首地址
boollock,//是否锁定的标志量
intnumber-of-bytes)=0;//读操作的字节数
写操作的定义与读操作类似。
阻塞方式的方法包括阻塞读操作和阻塞写操作,阻塞读操作被定义为:
virtualbool
burst-read(intmaster-id,//主设备号
data-pointerdata-buffer,//数据缓冲区指针
address-typestart-address,//读操作首地址
intburst-length,//突发读写的长度
burstmode-typeburst-mode,//突发读写模式
intnumber-of-bytes)=0;//读操作字节数
写操作的定义与读操作类似。
图4给出了总线模块的状态图,next-id是下一拍要处理请求对应的主设备序号,通过调用仲裁函数得到;current-id是当前处理请求对应的主设备序号。
图4 总线模块状态图
每个状态总线模块要完成以下操作:
1.空闲(IDLE):
next-id==0,current-id==0
总线上无地址传输,无数据传输。
2.起始(START):
next-id!=0,current-id==0
总线上有地址传输,无数据传输。在该状态总线完成如下操作:
①调用AHB译码器通道模块中的译码函数,取得地址传输的目标从设备;
②调用AHB从设备的地址传输函数,传送地址以及控制信息。
3.忙(BUSY):
next-id!=0,current-id!=0
总线上既有数据传输,又有地址传输。在该状态总线完成如下操作:
①根据读写标志位来调用数据传输的目标从设备的读(写)函数;
②更新地址,数据缓冲区指针。把地址控制信息送给地址传输的目标从设备;
③如果是两次传输的交接周期,调用译码函数,更新地址传输目标从设备。
4.结束(END):
next-id==0,current-id!=0总线上有数据传输,没有地址传输。在该状态总线完成如下操作:
①根据读写标志位来调用进行数据传输的目标从设备的读(写)函数;
②把与当前请求相关的数据结构清零。
译码器
在AHB译码器接口(decoderinterface)中定义了译码函数,完成对地址的译码。该函数被定义为 virtualintget-slave(address-type&address)=0;//需进行译码的地址该函数根据系统初始化时配置的地址空间分布对地址进行译码,并发出选定的信号。译码器通道模块实现了该接口定义的函数供总线模块调用。
仲裁器
在AHB仲裁器接口(ArbiterInterface)中定义了仲裁函数,对主设备的请求进行仲裁。该函数被定义为:
virtualint
arbitrate(request-type **
request-pointer-vector)=0;
//请求数据结构的指针数组
该函数使用固定优先级仲裁算法对多个主设备的占用总线请求进行仲裁。仲裁器通道模块实现了该接口定义的函数供总线模块调用。
主设备
主设备模块必须定义一个连结总线接口的端口才可以访问AHB总线通道模块中实现的方法。该端口被定义为:
sc-port〈bus-if〉
sc-port在SystemC2.0中是所有端口的基类,在其基础上用户可以自定义端口,bus-if是指定的总线接口类型,这样实现了该接口中方法的AHB总线通道模块可以被连结到端口上,向主设备模块提供服务。SoC的软件部分在主设备模块里运行,软件用C++进行描述。
从设备
在AHB从设备接口(slaveinter face)中定义了地址传输函数、读写函数,以响应主设备的地址传输和数据传输请求。读函数被定义为:
virtualvoid
read(address-typeaddress,//读操作地址
intnumber-of-bytes)=0;//字节数
写操作的定义与读操作类似。
从设备通道模块实现了该接口定义的方法供总线模块调用。
运行试验
为验证本模型,选用了两组实验运行环境,第1组环境为主频1.2GHz,内存256MB,操作系统为Windows2000的PC机;第2组为主频2.4GHz,内存512MB,操作系统为Windows2000的IBMPC机。在每组环境下都分别进行10000次阻塞方式和非阻塞方式的操作,求平均获得仿真运行速度。表1所示为运行结果。
表1 运行结果
结论
在事务级对SoC用SystemC进行建模的方法使软硬件开发基于同一语言环境,摒弃了远程过程调用、Socket通信等传统方式,可以使软硬件协同仿真提前进行;在事务级建模使模块的通信通过函数调用进行。为验证本方法,设计与实现了基于AM-BA规范的总线模型。运行结果表明,模型完全符合AMBA2.0规范,可以有效克服目前SoC软硬协同设计的时间瓶颈。