一种时序精确的集成电路网络应用系统建模与仿真环境

   2019-07-20 117
核心提示:[db:简介]

摘要:新型复杂的系统集成电路芯片(SOC)常常应用于网络环境中,因此需要对其所处网络环境建模与仿真,这意味着要能够对芯片同时进行网络建模和传统的系统级的建模。本论文介绍了一种时序精确的建模与仿真方法,它集成了系统建模语言(SystemC)和网络仿真环境(NS-2),使用这种集成建模与仿真环境可以显著地加速具有网络通信需求的芯片的设计过程。

关键词:集成电路协仿真SystemC NS-2

1 引言

现代系统集成电路芯片(SOC)对通信能力的需求逐渐增加,通常要求设备能随意接人、可自由移动或者在非友好环境下工作或可接人周围网络环境。对于集成电路芯片而言,由于片上总线架构对其性能有重要影响,此时系统的通信议题显得至关重要。根据国际半导体技术蓝图的报告[1],对于65nm以下的技术而言,由于电源和时延的问题,在复杂度高的芯片上要保持全局时钟的有效同步是不可能的。通常采用的是全局异步、局部同步的办法,即GALS[2],这时不同的时钟模块之间就像网络里不同的计算机之间一样通信,由此而引入了面向网络的片上架构。

因此对具有网络通信需求的系统集成电路进行建模时,可以考虑:系统的一部分在传统的系统级、面向硬件的环境里建模,而网络应用部分则在网络建模工具里描述。通过这种方式,可以获得集成电路系统在与网络环境交互时的初步反馈,并在下一改进级别上对系统模型进行改善。但是,这么做必须首先保证网络仿真器和系统仿真器在时间上完全同步,即两个仿真器有相同的时间观念,并且它们之间能够以双工方式交互数据。与完全通过系统级描述的模型相比,只要同步负荷不重,新的仿真方式将可以加速系统建模。

另一个议题是仿真器之间的数据交互格式。网络仿真器通常使用抽象数据类型来描述包、帧、消息,而不是使用数据的比特精确模式。集成电路则至少在低改进级上需要比特精确数据接口,这样就有必要增加一些转换接口。

使用同时具备网络仿真和集成电路系统建模环境的工具可以显著地加速网络设备的设计,并且可以在短时间内产生相应的测试台。使用这种工具的另一个好处是,它可以验证、校验集成电路芯片的通信结构,从而使其协议栈达到网络仿真器高层描述的参考协议栈的水准。

本文介绍了以下两种仿真器的集成仿真框架[12]:系统级仿真器SystemC[4],网络仿真器NS-2[5]为了提供良好的效率,集成在内核级上进行,它支持仿真器间的时序精确同步。

2 仿真环境

集成不同的仿真环境在计算机辅助设计领域即是著名的协仿真议题。文献[7,8]提出了几种不同的协仿真框架。它们之间的主要区别在于协仿真器所针对的抽象级别(事务级、指令级、RTL级)和仿真器间同步所采用的通信原语。

文献凹利用MATLAB来对整个系统进行建模(包括网络和硬件),然而,这种模型不能直接用来生成相应的硬件。文朗10)则完全利用C++来对一个ADSL调制解调器建模,这种方式使验证设备时要模拟复杂的网络环境变得很困难。文献[11)则直接将设备与真实的网络相连,没有用任何网络模型。以上的解决方案都没有有效地集成系统级仿真和网络仿真。

本文介绍的方法依赖于两个著名的仿真环境:SystemC和NS-2。SystemC能够在不同的抽象级别用C++库来搭建系统模型,NS—2则是一种非常流行的网络协议和算法分析仿真工具。NS—2基于两种编程语言:C++和OTcl,后者使得仿真内核(用C++语言而写)和仿真配置得以分离。

所提及的两个仿真器都是基于事件驱动引擎的:它们以非递减时序的方式来安排事件的执行。所不同的是事件的语义。在SystemC里面,事件是和硬件相关实体(比如信号、端口)相联系的。SystemC支持时钟纯粹是概念性的,它仅被用来定义事件的时间间隔。在NS—2里,事件是和通信信道的异步变化(比如发送或接收一个包)相关联的。

2.1 仿真器交互

在设计集成仿真框架时,有两个主要议题影响集成方案并且定义仿真的语义。首先,也是最重要的是,仿真器如何紧密地协同工作。解决方案包括在仿真器间建立通信机制(直接消息传递或共享内存接口)直至完全的系统内核集成。其次,仿真器在哪一个抽象级上进行交互。解决方案从包级别的接口到低级上的信令而不尽相同。

要解决上述两个议题,首先需要对NS—2和SystemC的特性有深入的了解。这两个仿真器都将目标描述视作是一个分层次的实体,其层次等级与不同的抽象层和仿真中的数据操纵粒度相联系。 NS—2将网络描述视作是分层的,类似协议栈的实体,它包括四个不同等级的实体:链路、节点、代理和应用。这和协议栈中的数据链路、网络、传输和应用层各自相联系。特别地,代理代表产生和消费网络层的包的终端,并且,代理可以对传输协议原语提供支持。在SystemC里,抽象层和初始规范的精炼有关,本文直接以传统的协议层来标识。

在仿真集成电路网络应用系统时,最直接的集成方式,这里,NS—2的代理与SystemC的网络层相互通信。这种方案只强调两个层之间的消息交互以及一些消息转换接口,但是,系统间的任何同步都需要额外的消息通过用户API接口来传递,这使得通信负荷过重,而且,连续的时间同步并不容易达到,因为此时时间都是由系统内核管理的,要获得时间信息也就意味着要与本地的内核进行交互。

一种在系统内核级上基于消息传递的集成方案。这种方案看起来似乎更加有效,因为消息交互仅限于系统内核之间。但是如图中分离的两条时间轴所示,这种方案不能解决时间自动同步的问题。

本文所提出的方案。两个内核紧密结合在一起(注意最外面的虚线框)。仅管仍是基于消息传递的,但是相关仿真时间的同步变得更加容易,这种方案比前述两种方案更加高效。nextpage

3 内核同步

保持仿真器间在时间上的同步是非常重要的。事实上,要保证每个仿真器里的仿真时间的一致性是比较容易的,难点在于当仿真器间数据交互时也要保证时间上的一致性。下面将介绍这个问题相关的实现细节。

3.1 基本时间同步

两个仿真器之间通过周期性交互信息来保持全局时间的一致性。在执行时,拥有较小时间的仿真器优先执行,此时另一仿真器则置为阻塞状态。

仿真时间的同步的伪代码。启动同步的仿真器首先执行第2行的初始化工作,之后从远端的另一仿真内核得到仿真时间Tn(第3行),一旦获得Tk2,它将Tk2与本地的仿真时间Tk1,作比较(第4行),如果本地时间小于远端的时间,说明仿真器当前滞后了,于是当前处于就绪状态的事件先被执行(第5行)。而后,调度队列里下一事件对应的时间Tnext k1披发送到远端的仿真器以便于同步(第6行)。相反,如果仿真器当前时间比远端时间大,则仿真器将当前仿真时间Tk1发送到另一仿真器,而后挂起(第7行)。以上操作在整个仿真期间重复执行(第8行)。

3.2 处理数据交互

同步方案已经可以正常工作,但是在大多数情况下,仿真器间需要数据交互,而数据序列的时间也必须保持一致性。这就意味着要修改内核的数据结构,使得事件和与事件相关的数据相分离。由于NS-2和SystemC都是基于事件驱动的,因而它们的结构都比较典型:具备一个传统的就绪队列,这个队列里是准备就绪、可以执行的事件,调度器会以时序上非递减的方式,从这个队列里挑选出相应事件来执行。

同步中的五个基本实体。两个仿真器都拥有一个等待队列,该队列里包含了正在等待数据条件来驱动的那些事件,这与传统操作系统里的方案很相似:就绪进程和等待一些事件完成(比如I/O请求,资源变为空闲)的进程是分开的。

进程队列外覆器是就绪队列和等待队列与内核的界面接口。然而,进程队列外覆器对等待队列的处理与对另外两个数据交互实体的操作是紧密相关的。当从通信信道接收到一个数据的时候,数据队列管理器便将它置人数据队列里。每一个目标实体都有一个自己的数据队列。等待队列里的进程正在等待一些数据相关条件的触发。所以,对于每一个新收到的数据元,进程队列外覆器在等待队列里查找那些正在等待相关事件的进程,这些事件即是受新数据元影响的数据队列里的事件。这样,这些进程将进入到就绪队列,而它们的时间标记也会更新为新数据元的时间标记。从以上讨论不难得出,将仿真器间交互的数据用一系列信息来封装是非常必要的。

3.3 用户程式范例

前面所提到的协议有几个地方值得注意:1)数据交互相关实体的标识(NS-2里的代理和SystemC里的模块);2)发送实体对数据的时间标记。这些信息都封装在消息里面。消息由两个内核以对用户透明的方式来组装。在NS-2侧,需要添加一个新的类:SystemC,其定义如下:

其中的Recv()函数允许NS-2里的对象传递一个数据包给内核(以正常的通过NS-2节点传递方式),这个数据包同时也必须传递给SystemC的以receiver标识的那个进程。布尔值state使得内核可以知道数据包当前正准备传递给SystemC。通过以上信息,NS-2内核就能够组装那些需要发送给SystemC的消息。以NS—2里的标准UDP代理为例,为了能与SystemC通信,必须按如下修改:

无论任何时候,只要NS-2收到一个数据消息,内核就调用Recv0函数来获得一个包,表面上看起来,这个包就像是从其它NS-2代理发过来的一样。

在SystemC侧,为了允许用户向NS-2对象接收或发送一个数据包,需要添加新的端口ns_in和ns_out。它们从类模板sc_in和sc_out衍变而来,并且通过两个函数read()和write()来管理,这两个函数是通过扩展标准的管理sc_n和sc_out的函数而来的。新的端口实际是执行了文献[7]里提到的“协仿真外部端口”的概念。所以,SystemC里能与NS-2进行双工通信的进程按如下方式定义:

无论何时,只要SystemC内核接收到一个数据消息,在接收消息的这个时间点上,内核会在消息里指定的进程的ns_in端口上产生一个事件,这是通过将包指定到端口来完成的。由此将会唤醒SystemC里正在等待这个包的进程,对这个进程而言,这个包就像是SystemC里其它进程发送的一样。对应地,无论何时,当SystemC进程写一个包到ns_out端口时,write()函数会将包写到内核监视的缓冲区里。

以上所述的方法有两个主要优点。第一,NS-2和SystemC的内核仍使用它们各自最初的原语(Recv()方法和将值指定到一个端口)来唤醒对象和进程。通过这种方法,不需要额外的等待队列。第二,NS-2的对象和SystemC的进程交互数据时都要通过对通信信道负责的系统内核。这样,除了必要的唤醒对象或进程去监视信道的事件外,不需要产生其它事件。这些都增强了协仿真的性能。

3.4 为同步而进行的内核扩展

内核为了同步所需执行的伪代码。下标k1指当前正在执行代码的内核,k2指另一内核。为了协作,两个内核都作了必要的修改。

启动进程的仿真器首先执行初始化工作(第2行),主同步程序(第3—22行)围绕两个仿真器间信道上消息的接收(第4行)而执行。任何时候,一旦收到一条消息,首先检查它是不是数据消息类型,如果是,则如同上节3.3里所描述的那样,调用NS—2接收器或SystemC的Recv()函数(第6.7行)。

然后,提取出远端事件的时间标记,并将它和本地事件时间标记Tk1相比较(第8、9行)。第10—18行管理本地队列里所有的滞后于Tk2的事件。如果有一事件Tk2需要传输数据(第13行),则在时间Tk1产生一条消息Mk1,并填人相应的数据域Dk1和远端接收者j(第14行),并且用一标识符记下当前条件以备后续使用(第15行)。第11—17行的do-while循环使得内核分别处理在同一仿真时间上的不同事件。当10—18行的循环退出时,需要向另一内核发送消息。如果前面标识符是真(第19行),内核就产生一个数据消息,否则产生时间消息,当消息就绪后就将它发送到另一内核。最后,值得注意的是时序同步过程在代码中仍然可辨,只是已经紧密融合于所有同步代码了。

4 总结

本文介绍了一种对SOC芯片进行建模与仿真的设计环境。这种环境集成了SystemC和NS-2,并且在时序上保持精确同步。通过高效的时间同步算法,两个内核以消息传递的方式集成在一起,其中NS-2用来建模网络环境,SystemC用来建模系统硬件部分。使用这种集成建模与仿真环境可以显著加速具有网络通信需求的芯片的设计过程。

 
举报收藏 0打赏 0
 
更多>同类数控技术
推荐图文
推荐数控技术
点击排行
网站首页  |  关于我们  |  升级会员  |  联系客服  |  广告合作  |  广告位图  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  RSS订阅  |  违规举报  |  蜀ICP备2021024440号