文章目录
前言
上一章基本概念与ISA结构里面提到了微架构(Micro Architecture)。他的意思就是一个能运行一个指令集的机器的具体结构。
在这一章,我们将了解两种在简单的实现方式:
- 单周期设计 (Single Cycle)
- 多周期设计 (Multi-Cycle)
指令的执行过程
在具体确定微架构之前,有必要了解一下指令是如何执行的。
大致可以看出有5个步骤:
- 取指令
- 分析指令
- 取数据
- 做操作
- 写回结果
在这里有一个比较模糊的步骤就是做操作,比较大小是一个操作,除法是一个操作,傅里叶变换也是一个操作。这里可以发现操作的复杂程度变化会很大,直接用一个步骤来代替似乎有失偏颇,但是为了抽象我们在这里认为这是一个步骤。
单周期设计
简而言之就是所有操作都在一个时钟周期内完成。也就是说这整个cpu除了寄存器堆(Register File) ,程序计数器(Program Counter),和必要的flag 之外没有别的寄存器了。
这种设计早已被淘汰了:
- 因为做操作这个地方时间长短不确定。依照这个微架构的定义,所有指令的执行时间都得等于执行时间最长的指令,显然不经济。
- 这里如果需要支持复杂的操作,如:除法,由于没有办法保存中间结果,操作单元的面积会非常大,原本可以重复利用的硬件都无法利用。
多周期设计
解决上面问题的方法很简单,我们只需要把原本一个周期实现的所有步骤按照时间顺序分配到多个周期就行。复杂的操作我就让他想执行几个周期就执行几个周期。这样一来每个周期的工作量少了,周期就可以快一些,同时硬件单元也能被复用,解决了计算机早期发展缺资源的问题。
下面依照不同的指令类型,划分一下每个周期的任务:
步骤 | R-type | 分支(Branch) | 跳转(Jump) | 读取(Load) | 储存(Store) |
---|---|---|---|---|---|
1 | 取指(Fetch) | 取指(Fetch) | 取指(Fetch) | 取指(Fetch) | 取指(Fetch) |
2 | 译码(Decode) | 译码(Decode)&计算新地址 | 译码(Decode) | 译码(Decode) | 译码(Decode) |
3 | 计算(Execute) | 计算(Execute) | 计算(Execute) | 计算(Execute) | 计算(Execute) |
4 | 写回(Write Back) | / | / | 访存(Acess Memory) | 访存(Acess Memory) |
5 | / | / | / | 写回(Write Back) | / |
所有指令在步骤1就进行了计算,这里是为了取得下一条指令的地址。如果把所有需要用到操作都放在步骤3,那么计算单元就需要多复制几份,以应对同时来的多个计算请求。放在步骤1提前执行就可以避免掉资源的复制。同时Branch类指令在步骤2也进行了计算,同样也是避免了复制资源。
这样一来控制信号也就需要一个状态机来提供去触发各种不一样的动作。