【取指过程】
【概述】
画圈的是有关取值的两个重要模块
IFU:Instruction Fetch Unit 取指单元
ITCM:紧耦合存储器,指配置一段较小容量(几十KB)的存储器(通常是静态存储器),用来存储指令,在物理上离处理器核很近而专属于处理器核。优点是实现非常简单,容易理解,且能保证实时性。
【IFU】
源代码的Hierarchy如下:
示意图:
E200处理器采用两级流水线,取指为第一级,执行、访存、写回、交付均在第二级。
在第一级需要利用BPU进行分支预测。
BPU分支预测三种情况:1、条件分支 2、直接跳转 3、间接跳转
PC:用于指令地址的生成,同时在一些PC相关的指令也会用到。
处理器产生一个PC,这个请求会给到地址判断和总线控制(ICB总线是和AMBA差不多的一款自定义的总线结构,自己看看就行),对读取PC的请求进行解析。指令可以存在ITCM里面,也可以存在总线上的Flash里,所以IR的来源是经过一个MUX来选择的。
指令进来以后,首先对这个指令进行简单的译码,指令译码之后,一部分用于下个PC的生成,同时放到IR里面进行寄存,送到执行单元里面进行进一步的执行,比如运算加减等等。
当前PC和下一个PC都会有寄存器记录下来。
如果BPU猜错了,就要flush流水线。
指令可以存在ROM里、QSPI-Flash里、ITCM里
ITCM有64k的空间,一些应用领域足够了
ROM的空间比ITCM要大一些,在RTL里,这个ROM是个假的
Hierarchy图示:
深红色的是指令可以存放的位置。
ifetch所有的地址访问都需要经过ift2icb模块的处理,这是一个总线公共的接口。
64k空间不够的时候,挂在Bus Interface上面。
一般的做法是把外部的搬到ITCM里面再运行,可以用多级存储体的结构来理解,一级cache、二级cache、三级cache、硬盘。
ITCM的端口是64位的,这意味着我们取出32位的指令一次可以取2条,16位的一次可以取4条。(当然也有可能出现跨边界的现象,必须取两次才能取完,用了一个状态机实现)。
模块代码解析:
【Mini-Decode】
这是一个纯组合逻辑的译码器,它是EXU中的Decoder的一个缩小版,略去了一些输出信号。作用是帮助BPU判断指令的类型,进行分支预测。
端口列表:
译码出来的信息有:
是否有rs1 rs2
rs1&#x