您的位置:首页 > 其它

GEM5与SystemC混合仿真的实现

2015-08-06 12:47 405 查看

1 简介

目前SystemC越来越受到芯片设计公司重视,在架构探索,架构验证阶段,其有着快速迭代、软硬件设计依赖小的优点。特别是在SoC架构设计中,多家设计公司都在使用SystemC进行建模仿真。SoC离不开CPU,但是目前普遍使用的ARM,除了FastModule(功能仿真,多数用来进行软件调试)外,并没有特别好的CPU模型(Tensilica提供CPU SystemC Module)。目前有多个OpenSource的CPU模拟器,用来进行软件调试或架构分析。
GEM5提供了Atomic、Timing、InOrder、OutOfOrder等精度的CPU模型,并且支持ARM、X86…等多种核。若实现GEM5与SystemC的混合仿真,就能够解决SoC中CPU来源的问题,并且可以更具应用场景,配置为不同精度类型的CPU(如架构探索阶段,可以使用Timing模型;软件调试阶段,使用Atomic模型;架构验证阶段,使用InOrder或OutOfOrder模型)。


2 GEM5与SystemC仿真同步

GEM5基于离散事件驱动仿真推进,而SystemC通过Kernel的调度机制来实现仿真推进。目前GEM5中已经支持SystemC的同步,路径为gem5/utils/systemc,其实现了同步机制。


3 TLM对接

研究GEM5的目的是能够使用其实现的CPU,除此之外,都是基于SystemC实现的module,所以需要实现GEM5 CPU与SystemC module的对接,基于TLM实现。
参考mem/external_slave.cc中的StubSlavePort,设计GEM5 port与TLM的对接。


class sc_transactor :   public tlm::tlm_initiator_socket<>,
public tlm::tlm_bw_transport_if<>,
public ExternalSlave::Port


需要继承于ExternalSlave::Port,用于连接GEM5的CPU Port。同时,继承于tlm_initiator_socket,该Class的对象又是一个TLM Socket。



因为继承于ExternalSlave::Port,而其又继承于SlavePort,所以需要实现用于传递packet的方法:

/** The gem5 Port slave interface */
Tick recvAtomic(PacketPtr packet);
void recvFunctional(PacketPtr packet);
bool recvTimingReq(PacketPtr packet);
bool recvTimingSnoopResp(PacketPtr packet);
void recvRespRetry();
void recvFunctionalSnoop(PacketPtr packet);


3.1 recvAtomic

Tick recvAtomic(PacketPtr packet)


实现一个function级别的transaction的接收。该函数与TLM中的b_transaport对接,但是在slave端的b_transport实现中,不能使用wait(因为sendAtomic是GEM5环境下的调用,并不是SC环境,无法调用wait)。

3.2 recvFunction

void recvFunction(PacketPtr packet)


该方法用来在仿真开始前,load软件二进制代码到目标memory中。该函数与TLM中的transport_dbg对接,直接访问memory。

在0 ns,GEM system会把二进制代码load到memory中。仿真开始后,CPU会再从memory中fetch指令。

3.3 recvTimingReq

bool recvTimingReq(PacketPtr packet)


该方法用来发送timing级别的transaction,与TLM中的nb_transport_fw对接。

若前一个transaction还未收到END_REQ,那么当前的transaction就不能发送。会通过返回false告知GEM5不再发送新的请求,而是等待RetryReq。

3.4 recvTimingSnoopResp/recvFunctionalSnoop

因为GEM5只用来做CPU的模型,所以该snoop相关的接口都不需要实现,直接返回false。

3.5 recvRespRetry

void recvRespRetry()


在timing模式下,当返回一个resp给CPU时,若CPU无法立即接收,则会在能够接收的时候,通过调用recvRespRetry来通知slave再次返回resp。

在该方法中,通过调用sendTimingResp,再次返回resp。若返回值为true,则可以通过TLM的nb_transport_bw返回END_RESP phase给Slave。

3.6 nb_transport_bw

该方法是tlm_initiator_socket的方法,用来接收Slave返回的transaction(END_REQ、BEGIN_RESP)。

若返回的是END_REQ,则根据是否有一个新的Req被pending着来决定通知GEM5再次发送packet。(通过调用sendRetryReq来通知)

若返回的是BEGIN_RESP,则通过调用sendTimingResp来返回resp给GEM5。若GEM5返回false,表示其不能接收resp,则需要retry;若返回的是true,则表示GEM5能够接收该resp,则会返回slave END_RESP,用来终结一次transaction的全部握手。

4 Reference

[1] Coupling gem5 with IEEE1666 SystemC TLM2.0, Dipl.-Ing. Matthias Jung, Dienstag, 4.August 2015

[2] gem5_hipeac.pdf, Ali Saidi, Andreas Hansson
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  GEM5 SystemC TLM