Rocket - core - ibuf vs. imem

https://mp.weixin.qq.com/s/mbWZQxAVnnHBGOVZmXa1Eg

 

简单介绍ibuf和imem的关系。

 

本文目录:

1. ibuf

2. imem

3. 连接关系

4. ibuf的作用

 

以下正文:

1. ibuf

ibuf是指令缓存,其io接口如下:

其中:

a. imem表示frontend的响应;

b. kill表示是否要废弃当前缓存;

c. pc表示当前指令的地址;

d. btb_resp是branch target buffer的预测结果;

e. inst是取得的指令;

 

2. imem

io.imem是一个FrontendIO的实例:

也就是说,io.imem是一个FrontendIO。从上面可知,ibuf.io.imem是一个FrontendResp的实例。FrontendIO中包含请求和响应,而FrontendResp中只包含响应。

 

3. 连接关系

这里主要以ibuf.io为主要对象,看其各个接口的连接。

 

1) ibuf.io.imem

ibuf.io.imem是一个FrontendResp的实例,主要用于从io.imem接收返回。

 

2) ibuf.io.kill

take_pc同时输出给io.imem.req和ibuf.io.kill。

对于io.imem.req.valid而言,表示要发起请求。

对于ibuf.io.kill而言,表示要清除缓存。

 

3) ibuf.io.pc

表示与ibuf.io.inst指令的地址。

 

4) ibuf.io.btb_resp

从io.imem接收的BTB预测结果。在mem阶段使用。

 

5) ibuf.io.inst

从Frontend返回的指令扩展而成的结构化数据,方便流水线使用。

 

4. ibuf的作用

 

由上文分析可以看出:

a. 流水线向imem发起取指请求;

b. imem将取得的指令交给ibuf;

c. 流水线向ibuf取出取指结果;

既然流水线向imem发起请求,那么ibuf不存在缓存指令的作用。这里衍生出两个问题:

a. ibuf的作用是什么;

b. 指令缓存在哪里;

 

1) ibuf的作用

从ibuf的位置来看,其作用为把imem返回的指令进行进一步的处理,方便流水线使用。

从ibuf的实现来看,ibuf的作用如下:

a. 扩展指令,包括普通指令和RVC指令;

b. 解析异常;

 

2) 指令缓存在哪里

从位置上看,指令缓存的位置在io.imem.req之后。因为io.imem.req是FrontendReq的实例,那么指令缓存在Frontend之中。从Frontend结构上看,这个模块是ICache:

 

 

posted @ 2022-02-19 17:53  wjcdx  阅读(178)  评论(0编辑  收藏  举报