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: