整理自 MIT OCW 6.004 Computation Structures(Spring 2017)L09 注解幻灯片。
源网页:9.1 Annotated Slides | Designing an Instruction Set
讲师:Chris Terman。图片直接引用 OCW 原站链接。
L09:指令集设计(Designing an Instruction Set)
从专用阶乘硬件出发,抽象出可编程 datapath 与控制 FSM,引入 von Neumann 存储程序模型,并定量设计本课的 Beta RISC ISA:寄存器、定长指令、ALU/访存/分支。
1. 例子:阶乘 I(Example: Factorial I)
。用 C 描述:变量 a 累乘结果,b 为下一乘数(初值 );循环中 a=a*b,b=b-1。
2. 例子:阶乘 II(Example: Factorial II)
用高层 FSM 描述:各态“输出”是对变量的运算公式,而非简单电平。状态序列对应 C 程序步骤;b 新值为 0 时进入 DONE。
实现:32 bit 寄存器存 a/b,2 bit 状态寄存器;逻辑判断 b==0,并实现乘、减一与选通写入。
3. 阶乘的 Datapath(Datapath for Factorial)
Datapath:存值寄存器 + 组合运算。START:a←1,b←N;LOOP:a←a*b,b←b-1;DONE:保持。MUX(WASEL/WBSEL)选择写入值。
4. 阶乘的控制 FSM(Control FSM for Factorial)
Datapath 给出 Z(新 b 是否为 0)。控制 FSM:输入 Z,输出 WASEL/WBSEL;真值表含当前态 与下一态 。
5. 控制 FSM 硬件(Control FSM Hardware)
乘/减一用组合电路;控制用寄存器+ROM:+2 bit 状态 → 3 输入, 单元,每单元 6 bit(WASEL、WBSEL、下一态各 2 bit)。
6. 目前:专用硬件(So Far: Single-Purpose Hardware)
流程:高层 FSM → datapath → 控制 FSM。整体也是 FSM,但 datapath 寄存器也算“状态”则约 66 bit → 行真值表不可行 → datapath 与控制 FSM 分离思考。
通用化:更多存储、更丰富运算集(最小充分集出人意料地小;复杂运算常拆成加减乘序列)。架构乐趣在折衷。
7. 简单可编程 Datapath(A Simple Programmable Datapath)
4 个数据寄存器;ASEL/BSEL 选操作数;OPSEL 选运算结果;WEN+WSEL 写回(寄存器带 load-enable)。控制 FSM 序列产生控制信号;Z 支持数据相关转移。
8. 阶乘的控制 FSM(A Control FSM for Factorial)
通用 datapath 每拍一运算 → 每轮循环需乘、减一、判零三态。通用机往往比专用电路更多周期、可能更多硬件。
9. 新问题 → 新控制 FSM(New Problem → New Control FSM)
同一硬件可做幂、除、开方等(寄存器 ≤4)。设计控制 FSM ≈ 编程:规定运算序列。
10. ENIAC 计算机(The ENIAC Computer)
早期数字计算机正是如此工作。图为 1943 宾大 ENIAC。
11. 给 ENIAC 编程(Programming The ENIAC)
ENIAC 支持循环、分支、子程序,但映射到机器常需数周;拨开关、插线需数日,再单步调试。急需更轻便的编程方式。
12. von Neumann 模型(The von Neumann Model)
现代机多基于 1945 von Neumann 存储程序模型,三部分:
- CPU:datapath + 控制 FSM
- 主存:约 个 bit 字;CPU 发地址读写(延迟约数十 ns)
- I/O:与外界通信、非易失存储等
13. 关键思想:存储程序计算机(Key Idea: Stored-Program Computer)
指令与数据同存主存,皆为二进制。指令含 opcode、源/目的寄存器等字段;CPU 解释并执行,再取下一条。
如何区分指令与数据?看值本身不行——看用法:进 datapath → 数据;被控制逻辑取用 → 指令。
14. von Neumann 机解剖(Anatomy of a von Neumann Computer)
- Datapath(肌肉):寄存器、ALU、访存通路
- 控制单元(大脑):从主存取指令,译成 ASEL/BSEL/DEST/FN 等;含 PC(program counter) 指向下一条;接收状态以支持条件执行
32 个寄存器 → 选择信号各 5 bit;ALU 功能码可 6 bit。
15. 指令(Instructions)
指令是基本工作单元。执行循环:按 PC 取指 → 译码控制 datapath → ALU 运算写回 → PC ← 下一指令地址。现代机能每秒数十亿条。
16. 指令集架构 ISA(Instruction Set Architecture)
ISA = 指令字段含义 + 存储/运算的功能规格,是硬件与程序员的契约。可换软件;硬件可升级而软件不变(x86 从约 30 万 IPS 到约 50 亿 IPS)。
警告:ISA 中嵌入的技术约束(寄存器数、字宽、地址空间)成功后难改——旧软件要跑在新机器上,坏选择可能背几十年。
17. ISA 设计(ISA Design)
难题:支持哪些运算?多少寄存器?多大内存?编码偏紧凑还是译码简单?
定量方法:选代表性 benchmark → 用拟议 ISA 实现并模拟 → 按速度/能耗/面积/成本评估。原则:识别常见操作并优化它们(通用计算中算术与访存极常见)。本课机器称 Beta。
18. Beta ISA:存储(Beta ISA: Storage)
Beta 是 RISC:多数指令只访问内部寄存器;访存用独立 LD/ST,地址计算简单。同类:ARM、MIPS;x86 更复杂。
CPU 状态:32 bit PC;32 个 32 bit 寄存器 R0–R31(指令中 5 bit 编号)。R31 恒为 0,写入无效。主存为 32 bit 字(4 字节),仅支持字访问,但用字节地址:相邻字地址差 4。常用 0x 十六进制。
19. 存储约定(Storage Conventions)
变量住在主存固定地址。算 y=x*37:LD x→R0,乘 37,ST 回 y。热数据尽量留在寄存器。模板:load → 计算 → store → load-store 架构。
20. Beta ISA:指令(Beta ISA: Instructions)
三类:计算、LD/ST、分支。全部 32 bit 定长,占一字 → 译码简单;多数指令下一地址 = PC+4。
定长常不如变长紧凑,但变长译码复杂、能耗/性能代价高;当今内存相对充裕,Beta 选择定长以换小而快的执行引擎。
21. Beta ALU 指令(Beta ALU Instructions)
字段:6 bit opcode,5 bit ra/rb 源,5 bit rc 目的;其余填 0。Opcode 固定在 [31:26]。
例:ADD,opcode 0b100000,ADD(r1,r2,r3) → R3←R1+R2;编码 0x80611000。同一寄存器可兼源与目的(如 R1←R1+R1 即 ×2)。助记符比二进制好写。
22. 实现草图 #1(Implementation Sketch #1)
ra/rb 选操作数(R31→常数 0);rc 选写回。Opcode→ALU 功能可用 64 项 ROM。PC 每指令 +4。RISC 好处:许多字段可直接作控制信号。
23. 是否支持常数操作数?(Should We Support Constant Operands?)
用定量法评估“第二操作数可为小常数”:腾出 16 bit 常数域。看实际执行(非静态出现次数):算术指令过半第二操作数为小常数;比较约 80%;地址计算亦常见 → 批准该特性(程序更小更快)。
24. 带常数的 Beta ALU 指令(Beta ALU Instructions with Constant)
第二格式:rb 换为 16 bit 补码常数()。例:ADDC(r1,-3,r3)。16→32 bit 用符号扩展(复制符号位),纯布线即可。助记符加后缀 C;超 16 bit 常数须放主存再 LD。
25. 实现草图 #2(Implementation Sketch #2)
多一个 MUX:BSEL=1 选符号扩展常数,否则选 rb。细节后几讲再展开。
26. Beta 的 Load / Store(Beta Load and Store Instructions)
访存唯一途径。地址 = Ra + 符号扩展(const)(与 ADDC 同硬件)。LD:内存→Rc;ST:Rc→内存。ST 特殊:唯一需读 Rc;符号形式中 Rc 写在前;唯一不写寄存器堆的指令。
27. 使用 LD 与 ST(Using LD and ST)
y=x*37 三条:LD(0x1008,r31,r?) 等。地址适合 16 bit 常数时直接编入;更大地址当大常数存内存。低内存放不下全部大常数时,可用后讲的 LDR(load relative)。
28. 仅用 ALU 能解阶乘吗?(Can We Solve Factorial with ALU Instructions?)
顺序执行不够:需循环/跳过 → 条件分支。条件成立则 PC 改到 branch target;否则 PC+4。用于循环、if、过程调用等。
29. Beta 分支指令(Beta Branch Instructions)
BEQ:先把 PC+4 写入 Rc(不需要可写 R31);若 Ra==0 则 PC 加 字偏移×4(PC-relative);否则 PC+4。偏移 0 = 下一条; = 分支自身。负偏移常用于循环回跳;正偏移用于 if 前跳。
BEQ(R31,…) 恒成立 → 无条件分支。BNE:Ra≠0 时跳转。
30. 现在能写阶乘了吗?(Can We Solve Factorial Now?)
迭代阶乘:标号 L: 处 MUL、减一,BNE 回 L。符号形式写标号,由汇编器算偏移。与早先高层 FSM 各态高度对应(datapath 相似时常见)。
31. Beta JMP 指令(Beta JMP Instruction)
JMP:PC←Ra,并可选保存 PC+4 到 Rc。配合无条件分支:调用时 BEQ 跳到过程并保存返回地址;过程末 JMP 返回。同一过程可从多处调用(返回地址不同)。过程细节后讲。
32. Beta ISA 小结(Beta ISA Summary)
- 32 个寄存器;程序与数据在主存; 字节地址空间;字访问、地址为 4 的倍数
- 两种格式:opcode+三寄存器,或 opcode+两寄存器+符号扩展 16 bit 常数
- 三类指令:ALU、LD/ST、分支与 JMP
下一讲:用这套简单运算表达任意可计算过程。