Skip to content

cpu设计学习

· 6 min

一、CPU组成#

  1. 取指单元,一个周期信号来临时,从指令内存的PC位置中取一条指令到IR寄存器中
  2. 译码单元,将IR寄存器的值进行译码并且将译码后的执行信号传递给执行单元
  3. 执行单元,进行ALU的计算或者访存地址的计算
  4. 访存单元,将解码或者偏移后的地址传递给内存控制器,进行内存访问
  5. 回写单元,将需要回写的数据从ALU写回到通用寄存器

以上就是CPU的大致组成。

  1. 每一条指令都必须经过取指和译码,取指和译码称为前端,其中可能还包括了分支预测等等阶段,属于取指和译码中的子阶段。
  2. 译码阶段有点像x86的译码,分析一整条指令,并且得到指令的控制信息,有可能不需要访存或者不需要回写阶段,就不生成这两个周期的控制信息。如果是有更多级流水线,也就是有更多的子阶段,具体要执行哪些阶段也是由译码阶段得出。甚至说有一些单条指令需要多次访存的情况,也需要译码时进行处理从而得到控制信息。
  3. 所有的硬件单元运作时,都是根据控制信息来运行的,如果是流水线cpu,那么每一个模块执行每一条指令时的控制信息可能都是不同的。有的cpu可能会有一个集中式的控制模块,实时的给到每一个模块控制信息。但是更常用的方法是控制流的思路,将控制信息随着指令在模块中的执行阶段向后流动。

对一个risc架构的CPU来说,只有load和store指令可以访存,也就意味着访存模块对大多数的指令来说都是没有意义的,可以尝试访存分离设计。#

二、流水线#

1.简单流水线#

最简单的流水线,就是分别实现最基础的取指译码执行访存回写,以一个单独受控制的模块为一个流水线阶段,5个模块,对应了5个阶段,最多可以实现5级流水线。

对流水线CPU来说,每两个模块之间会有一个流水线寄存器,用来传递指令的控制信息和暂存信息,并且保证模块之间的时序同步。流水线寄存器还应该用来存储指令的地址,用来实现精确异常处理,实时记录现在的每一个模块正在执行的那条指令的地址。

时序同步:每个模块内部都是组合逻辑,根据上游的流水线寄存器的更新来更新结果,在clk到来时同时进行信息的锁存。换句话说在clk来临时,是流水线寄存器的时序逻辑在锁存结果,锁存后直到下一个clk到来,是模块内的组合逻辑电路运行直到结果稳定的过程。

简单5级流水线的模块设计如下。

InstructionFetch取指#

Input

2.数据相关(数据依赖)#

在执行阶段进行数据的计算,在回写阶段才进行数据的重新写回寄存器。

在前一条指令执行阶段时,后一条指令正好是译码阶段,此时去寄存器寻址就是错误的。

数据相关的解法#

3.控制冒险#

三、缓存#

四、多发射#

五、乱序执行#

六、分支预测#

七、多级流水线#