目录
MIPS单周期处理器
一、CPU的介绍
CPU的功能就是正确地执行指令,得到正确的结果
指令执行的三个主要过程是:1. 取指 2. 取数 3. 执行
指令功能的形式化描述:
- ← \leftarrow ←:数据传送方向
- R[a]:寄存器 a
- M[a] : 主存中地址为a的单元
- PC :程序计数器
- f(data) : 表示对数据data进行f操作
如:R[c] ← \leftarrow ← R[a] op R[b] // 寄存器a与寄存器b进行op运算结果送寄存器c
CPU设计的一般方法:
- 分析指令系统需求:用于确定需要哪些部件,大致框架
- 数据通路构建:分类型依次构建通路,最后整合所有通路
- 控制器设计:分析每个指令的控制信号
二、MIPS模型机的指令集
三、数据通路部件
组合部件
时序部件
理解寄存器的读写机制非常重要,关乎后续流水线CPU的学习。
由上图可以看出,在每个时钟下降沿的前后,寄存器的输入端需要维持一段时间的稳定输入,这样才能改变寄存器的状态,从而在此周期的剩下时间内保持正确的输出。
对于寄存器的输入而言,是时序相关的,即依赖于时钟信号起作用;而对于寄存器的输出而言,是时序无关的,在一个周期的大部分时间内是恒定的值。
以寄存器-组合电路-寄存器为例介绍时钟周期,理解了这个,对于更加复杂的数据通路只需要做拆分即可。
以寄存器1的输出作为组合电路的输入,信号在组合电路中传递,需要一定的时间,而往往不同指令在数据通路中的路径不同,因此所需要的传递时间也不同。因此下一个下降沿需要在最长的信号传递时间之后到达,寄存器2的输入才能是正确的值。
上面一种在流水线CPU中非常常见,往往是两个流水线寄存器之间包含若干组合电路构成一个流水级。
下面一种的典型例子是PC寄存器的自增电路,PC的值每隔一个时钟周期加4,因此其中的组合逻辑只需要实现简单的加4功能,而不需要实现整个ALU的功能,因此PC+4不适合复用ALU。
四、单周期数据通路设计
注意事项
- 所有指令都在一个时钟周期内完成
- 哈佛体系结构:指令和数据分开存储
1. 取指和PC自增数据通路
取指:instruction = IM[PC]
PC自增:PC
←
\leftarrow
← PC + 4
需要的部件:PC寄存器、指令存储器IM、加法器Adder
PC自增适用于大多数非跳转、分支的指令,此时PC
←
\leftarrow
← PC + 4的目的是为了使PC指向下一条指令的位置,因为MIPS中指令都是定长32位的,即4个字节,因此每条指令之间的地址(以字节编址)相差4。
2. R型指令数据通路(以add为例)
R[rd]
←
\leftarrow
← R[rs] + R[rt]
需要的部件(除了取值自增之外):寄存器堆、ALU
将rs和rt寄存器的值取出,交给ALU计算结果,然后写回rd寄存器,这里需要注意的是写寄存器的操作依赖于时钟信号,因此这里的写入操作需要在下一个时钟周期的开始才能完成。
3. LW指令数据通路
R[rt]
←
\leftarrow
← DM[ R[rs] + Signext(imm16) ]
需要的部件(除了取值自增之外):寄存器堆,ALU,符号扩展单元Signext,数据存储器DM
先计算数据的地址,使用基址寻址,然后将DM的输出传给寄存器堆的输入,同样在下一个时钟周期的开始将新的值写入寄存器。LW指令用到了最多的部件,因此LW指令数据通路最长,执行时间也最长。
4. SW指令数据通路
DM[ R[rs] + Signext(imm16) ]
←
\leftarrow
← R[rt]
需要的部件(除了取值自增之外):寄存器堆,ALU,符号扩展单元Signext,数据存储器DM
与LW相反,SW是将寄存器的值写入数据存储器中,但是都有计算数据存储地址的步骤,因此与LW使用ALU和Signext的方式一样。
5. Beq指令数据通路
If (R[rs] – R[rt] =0) then PC
←
\leftarrow
← (PC + 4) + Signext(imm16)<<2
else PC
←
\leftarrow
← PC + 4
需要的部件(除了取值自增之外):寄存器堆,ALU,加法器Adder,符号扩展Signext,移位器
beq指令根据rs寄存器和rt寄存器的值是否相等来决定是否跳转,跳转到以下一条指令为基址的一定偏移处。你是否还记得这里为什么需要将偏移值进行符号扩展之后再左移两位?(●’◡’●)
6. 数据通路合并
根据不同类型的数据通路的表格分析有哪些部件的输入来源会产生冲突,解决冲突的方法就是添加多选一电路,这样即可有效地利用相同的部件。
五、单周期控制器设计
不是很重要,看看就行,可以记一下有几个Mux,每个Mux的输入来源。
六、单周期性能分析
不同指令的执行时间长短不同,对于时钟周期固定的CPU来说,执行周期=最长指令的执行周期,对于时钟周期可变的CPU来说,执行周期=各类型指令执行周期的加权平均。
CPU执行时间
比较简单,不详细介绍