0%

MIT 6.004:L09 指令集设计

整理自 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)

Example: Factorial I

N!=N(N1)1N!=N\cdot(N-1)\cdots 1。用 C 描述:变量 a 累乘结果,b 为下一乘数(初值 NN);循环中 a=a*bb=b-1

2. 例子:阶乘 II(Example: Factorial II)

Example: Factorial II

高层 FSM 描述:各态“输出”是对变量的运算公式,而非简单电平。状态序列对应 C 程序步骤;b 新值为 0 时进入 DONE。

实现:32 bit 寄存器存 a/b,2 bit 状态寄存器;逻辑判断 b==0,并实现乘、减一与选通写入。

3. 阶乘的 Datapath(Datapath for Factorial)

Datapath for Factorial

Datapath:存值寄存器 + 组合运算。START:a←1b←N;LOOP:a←a*bb←b-1;DONE:保持。MUX(WASEL/WBSEL)选择写入值。

4. 阶乘的控制 FSM(Control FSM for Factorial)

Control FSM for Factorial

Datapath 给出 Z(新 b 是否为 0)。控制 FSM:输入 Z,输出 WASEL/WBSEL;真值表含当前态 SS 与下一态 SS'

5. 控制 FSM 硬件(Control FSM Hardware)

Control FSM Hardware

乘/减一用组合电路;控制用寄存器+ROM:ZZ+2 bit 状态 → 3 输入,23=82^3=8 单元,每单元 6 bit(WASEL、WBSEL、下一态各 2 bit)。

6. 目前:专用硬件(So Far: Single-Purpose Hardware)

So Far: Single-Purpose Hardware

流程:高层 FSM → datapath → 控制 FSM。整体也是 FSM,但 datapath 寄存器也算“状态”则约 66 bit → 2662^{66} 行真值表不可行 → datapath 与控制 FSM 分离思考

通用化:更多存储、更丰富运算集(最小充分集出人意料地小;复杂运算常拆成加减乘序列)。架构乐趣在折衷。

7. 简单可编程 Datapath(A Simple Programmable Datapath)

A Simple Programmable Datapath

4 个数据寄存器;ASEL/BSEL 选操作数;OPSEL 选运算结果;WEN+WSEL 写回(寄存器带 load-enable)。控制 FSM 序列产生控制信号;Z 支持数据相关转移。

8. 阶乘的控制 FSM(A Control FSM for Factorial)

A Control FSM for Factorial

通用 datapath 每拍一运算 → 每轮循环需乘、减一、判零三态。通用机往往比专用电路更多周期、可能更多硬件

9. 新问题 → 新控制 FSM(New Problem → New Control FSM)

New Problem New Control FSM

同一硬件可做幂、除、开方等(寄存器 ≤4)。设计控制 FSM ≈ 编程:规定运算序列。

10. ENIAC 计算机(The ENIAC Computer)

The ENIAC Computer

早期数字计算机正是如此工作。图为 1943 宾大 ENIAC。

11. 给 ENIAC 编程(Programming The ENIAC)

Programming The ENIAC

ENIAC 支持循环、分支、子程序,但映射到机器常需数周;拨开关、插线需数日,再单步调试。急需更轻便的编程方式。

12. von Neumann 模型(The von Neumann Model)

The von Neumann Model

现代机多基于 1945 von Neumann 存储程序模型,三部分:

  1. CPU:datapath + 控制 FSM
  2. 主存:约 WWNN bit 字;CPU 发地址读写(延迟约数十 ns)
  3. I/O:与外界通信、非易失存储等

13. 关键思想:存储程序计算机(Key Idea: Stored-Program Computer)

Key Idea: Stored-Program Computer

指令与数据同存主存,皆为二进制。指令含 opcode、源/目的寄存器等字段;CPU 解释并执行,再取下一条。

如何区分指令与数据?看值本身不行——看用法:进 datapath → 数据;被控制逻辑取用 → 指令。

14. von Neumann 机解剖(Anatomy of a von Neumann Computer)

Anatomy of a von Neumann Computer
  • Datapath(肌肉):寄存器、ALU、访存通路
  • 控制单元(大脑):从主存取指令,译成 ASEL/BSEL/DEST/FN 等;含 PC(program counter) 指向下一条;接收状态以支持条件执行

32 个寄存器 → 选择信号各 5 bit;ALU 功能码可 6 bit。

15. 指令(Instructions)

Instructions

指令是基本工作单元。执行循环:按 PC 取指 → 译码控制 datapath → ALU 运算写回 → PC ← 下一指令地址。现代机能每秒数十亿条。

16. 指令集架构 ISA(Instruction Set Architecture)

Instruction Set Architecture

ISA = 指令字段含义 + 存储/运算的功能规格,是硬件与程序员的契约。可换软件;硬件可升级而软件不变(x86 从约 30 万 IPS 到约 50 亿 IPS)。

警告:ISA 中嵌入的技术约束(寄存器数、字宽、地址空间)成功后难改——旧软件要跑在新机器上,坏选择可能背几十年。

17. ISA 设计(ISA Design)

ISA Design

难题:支持哪些运算?多少寄存器?多大内存?编码偏紧凑还是译码简单?

定量方法:选代表性 benchmark → 用拟议 ISA 实现并模拟 → 按速度/能耗/面积/成本评估。原则:识别常见操作并优化它们(通用计算中算术与访存极常见)。本课机器称 Beta

18. Beta ISA:存储(Beta ISA: Storage)

Beta ISA: Storage

Beta 是 RISC:多数指令只访问内部寄存器;访存用独立 LD/ST,地址计算简单。同类:ARM、MIPS;x86 更复杂。

CPU 状态:32 bit PC32 个 32 bit 寄存器 R0–R31(指令中 5 bit 编号)。R31 恒为 0,写入无效。主存为 32 bit 字(4 字节),仅支持字访问,但用字节地址:相邻字地址差 4。常用 0x 十六进制。

19. 存储约定(Storage Conventions)

Storage Conventions

变量住在主存固定地址。算 y=x*37:LD x→R0,乘 37,ST 回 y。热数据尽量留在寄存器。模板:load → 计算 → storeload-store 架构

20. Beta ISA:指令(Beta ISA: Instructions)

Beta ISA: Instructions

三类:计算、LD/ST、分支。全部 32 bit 定长,占一字 → 译码简单;多数指令下一地址 = PC+4。

定长常不如变长紧凑,但变长译码复杂、能耗/性能代价高;当今内存相对充裕,Beta 选择定长以换小而快的执行引擎。

21. Beta ALU 指令(Beta ALU Instructions)

Beta ALU Instructions

字段:6 bit opcode,5 bit ra/rb 源,5 bit rc 目的;其余填 0。Opcode 固定在 [31:26]。

例:ADD,opcode 0b100000ADD(r1,r2,r3) → R3←R1+R2;编码 0x80611000。同一寄存器可兼源与目的(如 R1←R1+R1 即 ×2)。助记符比二进制好写。

22. 实现草图 #1(Implementation Sketch #1)

Implementation Sketch #1

ra/rb 选操作数(R31→常数 0);rc 选写回。Opcode→ALU 功能可用 64 项 ROM。PC 每指令 +4。RISC 好处:许多字段可直接作控制信号。

23. 是否支持常数操作数?(Should We Support Constant Operands?)

Should We Support Constant Operands

用定量法评估“第二操作数可为小常数”:腾出 16 bit 常数域。看实际执行(非静态出现次数):算术指令过半第二操作数为小常数;比较约 80%;地址计算亦常见 → 批准该特性(程序更小更快)。

24. 带常数的 Beta ALU 指令(Beta ALU Instructions with Constant)

Beta ALU Instructions with Constant

第二格式:rb 换为 16 bit 补码常数(3276832767-32768\sim 32767)。例:ADDC(r1,-3,r3)。16→32 bit 用符号扩展(复制符号位),纯布线即可。助记符加后缀 C;超 16 bit 常数须放主存再 LD。

25. 实现草图 #2(Implementation Sketch #2)

Implementation Sketch #2

多一个 MUX:BSEL=1 选符号扩展常数,否则选 rb。细节后几讲再展开。

26. Beta 的 Load / Store(Beta Load and Store Instructions)

Beta Load and Store Instructions

访存唯一途径。地址 = Ra + 符号扩展(const)(与 ADDC 同硬件)。LD:内存→Rc;ST:Rc→内存。ST 特殊:唯一需读 Rc;符号形式中 Rc 写在前;唯一不写寄存器堆的指令。

27. 使用 LD 与 ST(Using LD and 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?)

Can We Solve Factorial with ALU Instructions

顺序执行不够:需循环/跳过 → 条件分支。条件成立则 PC 改到 branch target;否则 PC+4。用于循环、if、过程调用等。

29. Beta 分支指令(Beta Branch Instructions)

Beta Branch Instructions

BEQ:先把 PC+4 写入 Rc(不需要可写 R31);若 Ra==0 则 PC 加 字偏移×4(PC-relative);否则 PC+4。偏移 0 = 下一条;1-1 = 分支自身。负偏移常用于循环回跳;正偏移用于 if 前跳。

BEQ(R31,…) 恒成立 → 无条件分支。BNE:Ra≠0 时跳转。

30. 现在能写阶乘了吗?(Can We Solve Factorial Now?)

Can We Solve Factorial Now

迭代阶乘:标号 L: 处 MUL、减一,BNEL。符号形式写标号,由汇编器算偏移。与早先高层 FSM 各态高度对应(datapath 相似时常见)。

31. Beta JMP 指令(Beta JMP Instruction)

Beta JMP Instruction

JMP:PC←Ra,并可选保存 PC+4 到 Rc。配合无条件分支:调用时 BEQ 跳到过程并保存返回地址;过程末 JMP 返回。同一过程可从多处调用(返回地址不同)。过程细节后讲。

32. Beta ISA 小结(Beta ISA Summary)

Beta ISA Summary
  • 32 个寄存器;程序与数据在主存;2322^{32} 字节地址空间;字访问、地址为 4 的倍数
  • 两种格式:opcode+三寄存器,或 opcode+两寄存器+符号扩展 16 bit 常数
  • 三类指令:ALU、LD/ST、分支与 JMP

下一讲:用这套简单运算表达任意可计算过程。