姓名:安培赟 学号:22021211917
每条指令在存储器空间中所处的地址称为 它的指令PC (Program Counter)。
取指 (lnstruction Fetch)是指处理器核将指令从存储器中读取出来的过程(按照其指令PC值对应的存储器地址〉。
取指的终极目标是以最快的速度且连续不断地从存储器中取出指令供处理器核执行,核心要点是“快”和“连续不断”。
三种取指情况:
1、对于非分支跳转指令,处理器需要按顺序执行这些指令,指令PC值逐条指令连续增加 。
2、对于分支跳转指令,处理器执行了这条指令后,如果该跳转指令的条件成立需要发生跳转,则会跳转至另外一个不连续的PC值处。
3、指令的编码长度可以不相等。
CPU设计对取值的要求:
1、对于非分支跳转指令,能够连续不断地按顺序将其从存储器中快速读取出来,即便是地址不对齐的32位指令,也最好能够连续不断地每个周期读出 一条完整指令。
2、对于分支跳转指令,能够快速地判定其是否需要跳转。如果需要跳转,则从新的PC地址处快速取出指令,即便是地址不对齐的32位指令,也最好能够一个周期读出一条完整指令 。
如何快速取指?
首先需要保证存储器的读延迟越小越好。为了能够使得处理器核以最快的速度取指,通常使用ITCM和I-Cache的方法。
1、ITCM(Instruction Tightly Coupled Memory)指令紧耦合存储器
用于存储指令,且在物理上离处理器核很近而专属于处理器核。
实现非常简单,容易理解,且能保证实时性。
使用地址区间寻址,因此无法像缓存(Cache)那样映射无限大的存储器空间。
保证足够小的访问延迟,无法将容量做到很大,ITCM只能用于存放容量大小有限的关键程序指令。
2、I-Cache (Instruction Cache)指令缓存
利用软件程序的时间局部性和空间局部性,将容量巨大的外部指令存储器空间动态映射到容量有限的指令缓存中,可以将访问指令存储器的平均延迟降低到最小。
缓存的容量是有限的,因此访问缓存存在着相当大的不确定性 。一旦缓存不命中(Cache Miss),则需要从外部的存储器中存取数据,造成较长的延迟。
大多数极低功耗处理器应用的场景都应用于实时性较高的场景,因此更加倾向于使用延迟确定的ITCM 。
如何处理非对齐指令?(包含压缩指令或者其他拓展指令时)
ITCM 和 I-Cache 的存储单元往往使用 SRAM ,而 SRAM 的读端口往往具有固定宽度。
如何才能使得处理器对于非对齐的指令都能一个周期将其取出?
1、普通指令非对齐
可以使用剩余缓存(Leftover Buffer) 保存上次取指令后没有用完的比特位,供下次使用。
2、分支跳转指令非对齐
special:对于分支跳转指令而言,如果跳转的目标地址与 32 位地址边界不对齐,且需要取出一 个 32 位的指令字,上述剩余缓存也无济于事了。
多体(Bank)化的SRAM 进行指令存储。
以常见的奇偶交错方式为例,使用两块 32 位宽的 SRAM 交错地进行存储,两个连续的32位指令字将会被分别存储在两块不同的SRAM中。这样对于地址不与 32 位 对齐的指令,则一个周期可以同时访问两块SRAM取出两个连续的 32 位指令字,然后各取其一部分进行拼接成为真正需要的 32 位指令。
如何处理分支指令?
分支指令类型:
1、无条件跳转/分支(Unconditional Jump/Branch)指令
(无需判断条件) 一定会发生跳转的指令,而按照跳转的目标地址计算方式
1、无条件直接跳转/分支(Unconditional Direct Jump/Branch)指令
跳转的目标地址从指令编码中的立即数可以直接计算而得。jal(jump and link )指令
2、无条件间接跳转/分支( Unconditional Indirect Jump/Branch)指令
指跳转 的 目标地址 需要从寄存器索引的操作数中计算出来。jalr( jump and link-register)指令
2、带条件跳转/分支(Conditi onal Jump /Branch)指令
需要判断条件而决定是否发生跳转的指令 , 同样按照跳转的目标地址计算方式
1、带条件直接跳转/分支(Conditional Direct Jump/Branch )指令
跳转 的目标地址从指令编码 中的立即数可以直接计算而得。RISC-V 架构有6条
2、带条件间接跳转/分支(Conditional Indirect Jump/Branch )指令
跳转的目标地址需要从寄存器索引的操作数中计算出来。RISC-V 架构无