本次笔记内容:
P17 计算机组成原理(17)
P18 计算机组成原理(18)
本节课对应幻灯片:
- 组成原理21 Intructionsx86.pptx
 - 组成原理22 MIPS.pptx(老视频基本没用上)
 - 组成原理24 singlecycle.pptx(本节课末介绍了其中的单周期CPU)
 - 组成原理25 multicycle.pptx(本节课末介绍了其中的多周期CPU)
 
文章目录
- 指令系统设计的两种思路
 
- CISC
 - RISC
 
- x86 / Pentium 指令系统
 
- 指令格式
 - 寻址方式
 - 指令条数
 
- 数据移动指令
 - 算数指令
 - 逻辑指令
 - 二-十进制指令
 - 移位/循环移位指令
 - 测试/比较和转移指令
 - 字符串指令
 - 条件码指令
 - 其他指令
 
- 该指令系统特点
 
- MIPS 指令系统
 
- MIPS 指令集手册
 - 指令格式
 - MIPS数据传递指令 & 无条件转移指令
 - MIPS 指令系统特点
 - 指令格式与硬件
 
- MIPS指令:addu/subu
 
- 数据通路设计1
 
- MIPS指令:ori
 
- 数据通路设计2
 
- MIPS指令:Load/Store
 
- 数据通路设计3
 
- MIPS指令:BEQ
 
- 数据通路设计4
 
- MIPS指令:Jump
 
- 完整的数据通路设计
 
- 指令功能如何实现?
 - 指令的执行过程与控制
 - 指令的执行步骤
 - 单周期CPU
 - 多周期CPU
 - 指令流水线CPU
 
上节课说过,旧的视频和2019年秋的ppt不一样。上节ppt中有的内容而视频中没有的,这节课视频就应该会有提及:
- 具体的 CISC 与 RISC 介绍(P5);
 - x86指令系统(P40起),视频中会先介绍奔腾Pentium 指令系统。
 
指令系统设计的两种思路
CISC
Complex Instruction Set Computing (CISC)
早期的趋势:为了能够做复杂的操作,增加越来越多的指令
- 导致学习和理解上的困难
 - 导致硬件复杂(可能会变慢)
 
RISC
改变设计思路:Reduced Instruction Set Computing (RISC)
- 使用更简单,更小的指令集,会更加容易获得快速的硬件
 - 如果需要做复杂操作的话,让软件来做,组合几条简单的指令来完成工作
 
x86 / Pentium 指令系统
指令格式

指令字长:变长的
操作符字段:变长的
SIB是用于标记比例因子的:是否基于基址等等(基于历史原因,希望8位CPU程序放在32位程序上,也是可以运行的)
- 
OP:指令操作码,某些指令在操作码中还包含有操作数长度或立即数是否需扩充符号位(S) 等信息; - 
MOD/RM:与下一字节提供寻址信息。MOD/RM指出操作数在寄存器中还是在存储器中。该字节分成3个字段:Mod字段与R/M字段可以产生32个编码,分别表示8个寄存器和24种变址方法;Reg/op字段可以是寄存器号,或者作为3位附加的操作码;R/M字段是1个操作数所在寄存器或者与Mod字段一起指出寻址方式。 - 
SIB:当MOD/RM为某些值时,需SIB参与决定寻址方式。SIB分成3个字段,SS 指出变址寄存器的放大因子;Index 指出变址寄存器;Base 指出基址寄存器。 - 
Disp:当寻址方式指示用到disp(位移量)时,存在8位,16位或32位的位移量3种情况。 - 
lmm:对寻址方式是立即数,分为8位, 16位或32位3 种。 - 
前缀:指令前缀、段前缀、操作数前缀、地址长度前缀 
寻址方式
- 立即数
 - 寄存器
 - 直接 
E = Disp - 基址 
E = (B) B基址寄存器 - 基址 + 偏移量 
E = (B) + Disp - 比例变址 + 偏移量 
E = (I) * S + Disp,
I 变址寄存器,S为比例因子(1,2,4,8) - 基址 + 变址 + 偏移 
E = (B) + (I) + Disp - 基址 + 比例变址 + 偏移 
E = (B) + (I)*S + Disp - 相对 
指令地址 = (PC) +Disp 
指令条数
数据移动指令

算数指令

逻辑指令

二-十进制指令

比如金融行业的计算,用二进制计算易产生偏差;考虑直接用十进制计算。
移位/循环移位指令

测试/比较和转移指令

字符串指令

条件码指令

其他指令

该指令系统特点
- 指令格式复杂
 - 寻址方式多样
 - 通用寄存器较少
 - 兼容直到8086
 - 编译系统复杂
 - 指令流水实现复杂
 - 
典型 CISC 指令集 
x86指令系统其实有些过于复杂,但是其流水做的还是不错的。
奔腾(x86)指令系统太复杂了,因此提出更高效的 MIPS 指令系统。
MIPS 指令系统
MIPS 指令集手册
- https://www.cs.cornell.edu/courses/cs3410/2008fa/MIPS_Vol2.pdf (Instruction Set)
 - http://www.cs.cornell.edu/courses/cs3410/2008fa/MIPS_Vol1.pdf (Architecture)
 
指令格式

所有的指令都是 32 位宽度。
MIPS数据传递指令 & 无条件转移指令

MIPS 指令系统特点
- 指令格式简单;
 - 寻址方式较少;
 - 通用寄存器较多;
 - 指令数量较少;
 - 编译系统简单高效;
 - 容易实现流水操作;
 - 
典型的RISC指令集。 
指令格式与硬件

如上,MIPS只有三种指令格式。
本节课挑几条指令及其数据通路设计一下。
MIPS指令:addu/subu
看两条指令ADDU和SUBU:
addu rd rs rt
subu rd rs rt指令功能为:
R[rd] = R[rs] + R[rt]
R[rd] = R[rs] - R[rt]
两条指令操作码都是0,第6位才决定是加是减。我们通过操作码看出的是什么指令格式。
老师进行了提问,如何完成指令的功能(五个步骤):
- 取址(PC存放指令存放的地址,把这个地址送给地址总线,存储器过一段时间会得到该指令输出的内容);
 - 译码(看操作码MIPS的最高6位,然后看源操作数,rs与rt,rs与rt都是5位的,代表寄存器编号;此外,
控制器对OP译码与寄存器组读rs、rt、rd是同步的); - 运算;
 - 访存;
 - 写回。
 
下一条指令是 PC+4 ,去执行。这件事无需ALU来做,做一个简化的ALU来做(ADDer)就行。
数据通路设计1

经过前面的分析,设计如上。
MIPS指令:ori
或指令。
ori rt rs imm指令功能:
R[rt] = R[rs] OR ZeroExt(imm)
# imm 只有 16 位,但是寄存器上的数字是 32 位
# 因此对 imm 进行扩展,高 16 位补零
数据通路设计2

 这里没画多路选择器;蓝线表示imm直接零扩展,并参与到ALU的运算中。
MIPS指令:Load/Store
# load
lw rt rs imm
# Addr = R[rs] + SignExt(imm)
# R[rt] = MEM[Addr]如上,立即数imm是用补码表示的,进行符号位扩展。
分配 ALU 完成加法运算,然后把地址送给数据存储器,再放到寄存器组去。
# store
sw rt rs imm
# Addr = R[rs] + SignExt[imm]
# MEM[Addr] = R[rt]
数据通路设计3

对于这个数据通路:需要一个指令存储器和数据存储器。
MIPS指令:BEQ
beq rs rt imm
# if R[rs] = R[rt]
# then PC ← (PC + 4) + SignExt(imm)
# Else PC ← PC + 4实现指令跳转。

为了实现 PC+4 与 PC+4+立即数 ,再添加一个加法器,如下。
数据通路设计4

MIPS指令:Jump
J target
# PC[31:0] ← PC[31:28] || target[25:0] || [00]要跳转到一个指令地址(MIPS中是一个字),字地址特点最右边为两个0,因此target右边省略掉两个0;当前PC的高4为,用于补target的高4位。

完整的数据通路设计

 如图,针对上面几条指令的数据通路设计好了。接下来应该是设计其的时序安排。
指令功能如何实现?
硬件组成:
- ALU
 - MEM
 - Register File
 - ADDer
 - PC
 - Mux(多路选择器)
 
数据通路:
- 用于实现指令。
 
指令的执行过程与控制
对于冯·诺伊曼计算机,应搞懂其执行程序过程:
- 正确从程序首地址
开始(PC有一个正确的值); - 正确分步地执行每一条指令;
 - 还要形成下调待执行的指令地址。
 
指令的执行步骤
五大步。
- 读取指令(
IF),从存储器读来指令并形成下条指令地址 - 指令译码(
ID),指令译码,读寄存器堆为ALU准备数据 - 执行运算(
EXE),ALU执行数据运算或计算存储器地址 - 存储器读写(
MEM),完成存储器的读操作或者写操作 - 写回(
WB),写ALU的结果或存储器读出数据到寄存器堆 
单周期CPU
计算机一条指令的执行时间被称为指令周期,一个CPU时钟时间被称为CPU周期(在某些计算机中,还可再把一个CPU周期区分为几个更小的步骤,称其为节拍)。执行每条指令平均使用的CPU周期个数被称为CPI。
全部指令都选用一个CPU周期完成的系统被称为单周期CPU,指令串行执行,前一条指令结束后才启动下条指令。每条指令都用5个步骤的时间完成,控制各部件运行的信号在整个指令周期不变化。单周期CPU用于早期计算机, 系统性能和资源利用率很低,相对当前技术变得不再实用。

多周期CPU
将指令执行过程分解成多个步骤:
- 和单周期CPU基本相同
 - 每条指令占用它需要的步骤数
 
每个步骤占用一个时钟周期:
- 尽量平衡各步骤间的延迟
 - 尽量限制每个步骤使用单一的主要部件
 - 控制器仅需提供当前步骤所需要的控制信号
 
前提:
- 保存好下一步骤要用到的值:引入“新”的内部寄存器
 - 转到下一步骤执行:引入状态标记当前步骤;有限自动机
 

 对于一般计算机来讲,CPI可能会在4左右。
能不能在新条件下,实现 CPI=1 呢?
可以考虑指令流水线CPU。
指令流水线CPU
全部指令都是选用5个步骤完成,执行时间相同,但相邻指令的执行并不是完全串行的,执行时间有所重叠,例如每结東指令的一个执行步骤就启动下条指令,这被称为指令流水线技术,所有部件都高速运行,尖峰速度每个CPU时钟执行一条指令,系统性能和资源利用率更高,显著地提高系统的性能价格比,但计算机结构和控制器的设计、实现略显复杂。当前计算机中普遍使用这种方案。










