GEM5与SystemC混合仿真的实现

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

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值