第三章 单周期MIPS处理器的设计
- add, sub, addi, subi, lw, sw, beq, j 每条指令在单周期处理器中的执行逻辑
- 上述指令的指令编码、代码、功能以及在单周期中的数据通路,条件分支指令的地址计算、单周期各功能部件的控制信号值判断
- 中断和异常的处理时机
3.1 一个基本MIPS的实现
MIPS指令集
要实现的MIPS的指令集
存储器访问指令
- 取字:𝑙𝑤 𝑟𝑡 , 𝑎𝑑𝑑𝑟𝑒𝑠𝑠
- 存字:s𝑤 𝑟𝑡 , 𝑎𝑑𝑑𝑟𝑒𝑠𝑠
算术逻辑指令:𝑎𝑑𝑑、𝑠𝑢𝑏、𝑎𝑛𝑑、𝑜𝑟、𝑠𝑙𝑡
分支指令:𝑏𝑒𝑞、𝑗
一条指令的执行步骤
- 取指令:根据PC寄存器的值取出要执行的指令,然后PC内容加4。
- 取操作数:根据指令中操作数字段,选择读取1或2寄存器、或立即数送ALU(运算器)。
- 分析指令:将指令中的操作码送控制器,分析指令的功能,产生相应的控制信号。
- 执行指令:ALU根据控制器产生的控制信号完成指令规定的操作。
分析指令
分析MIPS指令非常规整,分3类:
- 存储访问
sw、lw - 算术逻辑
add、sub等:操作均为寄存器
addi、subi等:有一个操作数为立即数 - 分支
beq、j等
★MIPS指令格式
MIPS硬件的设计
计算机5大组成部件:
- 控制器
- 数据通路
- 输入
- 输出
- 存储器
![]()
一个MIPS子集
硬件的设计:
-
从存储器中取出指令
-
执行指令规定的操作
设计时需要考虑的因素:
-
代价
-
速度
-
功耗
设计步骤
- 分析指令集;
- 数据路径的需求;
- 选择数据部件;
- 时钟建立方法;
- 按要求形成数据路径;
- 为每条指令确定控制信号;
- 形成产生控制信号的控制逻辑。
MIPS指令集需求
存储器
- 取出指令
- 读写操作数
寄存器(32位)
- 读数据(根据指令中的rs或rd)
- 写数据(根据指令中的rd或rt)
PC
符号扩展部件
ALU
加4运算器
数据路径部件
组合逻辑部件
- 加法器
- ALU
- 多路选择器
- 符号扩展器
存储部件
- 寄存器
- 寄存器堆
- 存储器
3.2 逻辑设计惯例
时钟方法(Clocking Methodology)
什么时候可以从存储单元中读数据
什么时候可以将数据写入存储单元
典型时钟方法
- 电平触发(高电平触发、低电平触发)
- 边沿触发(上升沿、下降沿)
操作时序
时序的安排对硬件逻辑设计非常重要
数据通路中的组合部件
32位运算器—ALU
32位2选1选择器—MUX
16-32符号扩展器—EXTND
数据通路中的存储部件—寄存器堆(Register file)
2个输出(组合逻辑)
- A输出由Ra给出地址
- B输出由Rb给出地址
1个写端口(时序逻辑)
- 写使能Wn=1时,当时钟边沿到来时,将Data端口送来的数据写入Rw指定的寄存器。
3.3 建立数据通路★
一条指令执行的过程
- 从存储器中取指令
- 分析指令
- 执行指令
- 写结果,形成下一条指令的地址
3.3.1 数据通路
取指令(Instruction Fetch)
数据通路:
- 从PC寄存器中读出地址 PC
- 在指令存储器中读出指令 MEM[PC]
- PC指向下一条指令:PC = PC + 4
R型指令
汇编指令:𝑎𝑑𝑑 𝑟𝑑 , 𝑟𝑠 , 𝑟𝑡
功能:𝑅[𝑟𝑑]←𝑅[𝑟𝑠]+𝑅[𝑟𝑡](把 rs 寄存器的数据 R[rs] 和 rt 寄存器的数据 R[rt] 相加,存入 rd 寄存器)
数据通路:
数据传输指令:Load指令(I型指令)
汇编指令:𝑙𝑤 𝑟𝑡 ,𝑜𝑓𝑓𝑠𝑒𝑡(𝑟𝑠)
功能:𝑅[𝑟𝑡]←𝑀[𝑅[𝑟𝑠]+𝑜𝑓𝑓𝑠𝑒𝑡]
数据通路:
数据传输指令:Store指令(I型指令)
汇编指令:𝑠𝑤 𝑟𝑡 ,𝑜𝑓𝑓𝑠𝑒𝑡(𝑟𝑠)
功能:𝑀[𝑅[𝑟𝑠]+𝑜𝑓𝑓𝑠𝑒𝑡]←𝑅[𝑟𝑡]
数据通路:
分支指令(I型指令)
分支指令:beq、bne
汇编指令:𝑏𝑒𝑞 𝑟𝑠 ,𝑟𝑡 ,𝑜𝑓𝑓𝑠𝑒𝑡
功能:𝑖𝑓 𝑅[𝑟𝑠]==𝑅[𝑟𝑡] 𝑡ℎ𝑒𝑛 𝑃𝐶=𝑃𝐶+4+𝑠𝑖𝑔𝑛_𝑒𝑥𝑡𝑒𝑛𝑑(𝑜𝑓𝑓𝑠𝑒𝑡)≪2
数据通路:
3.3.2 数据路径合并
目标:把各种功能的数据路径合并
- 取指令
- R型指令
- Load/Store指令
- 分支指令
基本方法:使用多路选择器。
ALUSrc:选择ALU(下方)的输入
- R型指令:寄存器堆的B输出
- Load/Store型指令:符号扩展输出(立即数)
M2Reg:选择寄存器堆Data的输入
- R型指令:ALU的输出
- Load指令:存储器的输出
- Store指令:不需要(因为不需要写回寄存器堆)
RegDst:选择寄存器堆Rw的输入
- R型指令:指令的rd字段
- Load指令:指令的rt字段
- Store指令:不需要(因为不需要写回寄存器堆)
R型指令与Load/Store指令在ALU控制码上的区别
If Op = 000000 then
Operation = (接着分析func)
Else if Op = 100011 then
Operation = Load
Else
Operation = Store
End if
R型指令与Load/Store指令合并结果
3.3.3 单周期执行
数据路径
| RegDst(寄存器B) | ALUSrc | M2reg(写回寄存器堆的值) | PCSrc | Memory We 存储器写使能 | Memory Re 存储器读使能 | RegWR 寄存器堆写使能 | |
|---|---|---|---|---|---|---|---|
| 执行R型指令 | 右(rd) | 上(寄存器B值) | 下(ALU输出) | 上(不跳转) | 0 | 0 | 1 |
| 执行Load(lw)指令 | 左(rt) | 下(符号扩展后的立即数) | 上(读存储器内容) | 上(不跳转) | 1 | 0 | 1 |
| 执行Store(sw)指令 | 任意(值同Load,但是用不上) | 下(符号扩展后的立即数) | 任意(值同Load,但是用不上) | 上(不跳转) | 0 | 1 | 0 |
| 执行分支指令 | 任意 | 上(寄存器B值) | 任意 | 上(跳转条件不成立) 下(跳转条件成立) |
0 | 0 | 0 |
执行指令:𝑎𝑑𝑑 𝑟𝑑 , 𝑟𝑠 , 𝑟𝑡
执行指令:lw rt, offset(rs)
执行指令:𝑏𝑒𝑞 𝑟1 , 𝑟2 , 𝑜𝑓𝑓𝑠𝑒𝑡(𝑟1=𝑟2)
执行指令:𝑏𝑒𝑞 𝑟1 , 𝑟2 , 𝑜𝑓𝑓𝑠𝑒𝑡(𝑟1≠𝑟2)
需要产生的控制信号
读写信号
- Regwrite:寄存器堆写信号
- MemRead:存储器读信号
- MemWrite:存储器写信号
选择信号
- RegDst:目的寄存器选择信号
- M2reg:存储器内容输出到寄存器堆
- ALUSrc:ALU源操作数选择
- PCSrc:PC源的选择
操作码
- Operation:ALU操作码
控制信号的真值表
- 确定每条指令的控制信号
- 0
- 1
- X(与该指令无关)
- 构建控制信号的真值表
控制器单元结构
ALU的功能
ALUOp:
- R型:10
- 数据传输指令:00(加)
- 分支指令:01(减)
3.3.4 时钟周期的长度
最长的延迟决定了时钟周期的长度
关键路径:load指令
Instruction memory → register file → ALU → data memory → register file
(为什么不加寄存器堆读取PC的延迟??)
如果还要包括浮点或更复杂指令的指令集,单周期无法胜任
违背了设计原则:加快最常见情况的速度
可通过流水线技术改进性能
延迟时间计算??
不同单元有不同的延迟时间,对一条指令而言,关键路径上各单元的延迟时间决定了该指令的最小延迟。假设各单元的延迟时间如下表所示:
| 指令存储器 | 加 | 多选器 | ALU | 寄存器堆 | 数据存储器 | 控制 | |
|---|---|---|---|---|---|---|---|
| a | 400ps | 100ps | 30ps | 120ps | 200ps | 350ps | 100ps |
对MIPS的AND指令、LD指令、BEQ指令的关键路径分别是什么?
如果仅需支持ALU指令(add,and等),处理器的时钟周期是多少?
如果仅需支持lw指令,时钟周期多少?
| PC(寄存器堆,读取) | 指令存储器Memory | 寄存器堆(读取) | 多选器RegDst | 多选器ALUSrc(凡是用立即数的指令都不需要加选择器的延迟) | ALU | 多选器M2Reg | 控制(只有跳转指令需要) | 多选器PCSrc | 数据存储器 Memory(只有访存指令需要) | 寄存器堆(写回) | 合计 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 200 | 400 | 200 | / | 30 | 120 | 30 | 100 | / | 350 | 200 | ||
| AND | √ | √ | √ | √ | √ | √ | √ | 1180ps | ||||
| LD | √ | √ | √ | √ | √ | √ | √ | 1500ps | ||||
| BEQ | √ | √ | √ | √ | √ | √ | √ | √ | 1280ps |
因为各个老师各个PPT说的不一样,所以无法很好地总结,暂且记为:
-
立即数指令算1个多选器,其他指令算2个多选器的时间
- 立即数+ALUSrc到ALU的延迟 比 寄存器堆到ALU的延迟小,所以ALUSrc不是关键路径,不用算
-
只有分支指令算控制的时间
-
只有访存指令算数据存储器的时间
-
写回寄存器堆都要算(可能是因为都要修改PC)???
- 但是有的题和答案没有算beq这种不需要写回的指令的写回寄存器堆延迟??
-
读PC和写PC要不要算???
- 要算的话是不是一开始要加上一个寄存器堆的延迟
- 不算的话beq这种不需要写回的指令的写回寄存器堆延迟就不要加上了
-
多选器RegDst不用算,因为要写回才需要,多选器不会造成延迟等待,不是关键路径
-
分支指令上面一整条(包括2个加法器、多选器PCSrc等)的时间都没有下面这条路径长,不是关键路径
例题
假设指令存储器延迟是300ps,加法器延迟是80ps,ALU延迟是100ps,寄存器堆延迟200ps,数据存储器延迟300ps,忽略多路选择器、符号扩展器等模块的延迟。试计算“LW R2,20(R1)” 指令的关键路径延迟是多少?(1分)
答案:200 + 300 + 200 + 100 + 300 =1100ps(1分)
指令存储器 300 + 寄存器堆 200 + ALU 100 + 数据存储器 300 + 寄存器堆 200
(为什么不加寄存器堆读取PC的延迟??)
(为什么不加寄存器堆读取PC的延迟??)
(为什么LW算了两个多选器??)
(为什么不加寄存器堆读取PC的延迟??)
(为什么不加寄存器堆读取PC的延迟??)
(为什么不加写回寄存器堆的延迟??)
3.4 中断机制
3.4.1 中断基本概念
中断:在运行过程中,如果发生某种随机事态,CPU暂停执行现行程序,转去执行为某个随机事态服务的中断处理程序,处理完毕后再自动恢复原程序的执行。
中断的实质:程序切换
方法:保存断点,保护现场;恢复现场,返回断点。
时间:一条指令结束时切换。保证程序的完整性。
中断的特点:随机性
- 随机发生的事态(按键、故障)
- 有意调用,随机请求与处理的事态(调用打印机)
- 随机插入的事态(软中断指令插入程序任何位置)
中断与转子的区别
两者有本质上的区别:
- 子程序的执行由程序员事先安排,而中断服务程序的执行则是由随机中断事件触发。
- 子程序的执行受主程序或上层程序控制,而中断服务程序一般与被中断的现行程序无关。
- 一般不存在同时调用多个子程序的情况,但可能发生多个外设同时向CPU发出中断服务请求的情况。
中断与异常的区别
区别一:
- 中断:系统停止当前正在运行的程序而转向其他服务,可能是因为优先级高的请求服务了,或者是因为人为安排中断。中断是属于正常现象。
- 异常:是由于软件错误而引起的。
区别二:
- 中断是CPU所具备的功能——硬件
- 异常是软件运行过程中的一种开发过程中没有考虑到的程序错误——软件
中断的典型应用
(1)管理中、低速I/O操作,实现主-外并行工作
(2)以软中断方式来处理系统调用,如磁盘存取
(3)故障处理
(4)实时处理,Real-Time Processing:对各事件以足够快的速度进行处理,并在允许的时间尺度内作出反应。
(5)人机对话
(6)多机通信
中断系统的软硬件组织
(1)软件:中断服务程序、中断向量表
(2)硬件
- 接口方面:请求、屏蔽、传递、判优等逻辑
- CPU方面:对中断请求的响应逻辑
3.4.2 中断优先级的判断
(1)响应条件
- 有未被屏蔽中断请求到达;
- CPU处于开中断模式;
- 中断源优先级比当前程序的优先级更高。
(2)硬件判优
[例] 通过中断控制器判优
中断控制器 (如8259) 集中解决请求信号的接收、屏蔽、判优、编码等问题。
中断请求→8259(对未屏蔽的请求判优,生成相应中断号)→硬件产生向量地址→转入相应服务程序执行
单周期处理机
单周期处理机是在一条指令执行的过程中检测异常事件,当异常事件发生时处理机在该指令结束时转向异常事件处理程序,处理完毕后再返回到用户程序。
当发生异常时:
- 处理机保存当前处理机状态,如当前PC值,处理机状态寄存器的内容,等等。
- 由硬件向PC写入异常事件处理程序的入口地址,以实现程序的转移。