跳转至

第 4 章 中央处理器

依据:袁春风《计算机组成原理》(2016 年版)第 4 章及配套自考大纲。下文编号指大纲“考核内容与考核要求”;教材算例为学习辅助,不是真题。

复习导航:大纲要求与笔记位置

大纲条目 层次 位置 学完应能做到
1 程序执行概述 识记、领会 第 1 节 给出指令周期、数据通路、PC/IR/译码器/MAR/MDR 等含义,说明指令执行过程
2 数据通路基本结构和定时 识记、领会 第 2 节 区分操作元件与状态元件,说明互连与 D 触发器定时
3 数据通路基本工作原理 领会 第 3 节 说明控制信号与数据通路的关系,描述单总线与单周期的工作过程
4 流水线方式下指令的执行 识记、领会、简单应用 第 4 节 划分流水段,说明 CPI 为 1 的原因,计算指令吞吐率
5 控制器设计基本原理 识记、领会 第 5 节 说明硬连线与微程序控制器的设计过程和特点
6 指令流水线中的冒险处理 识记 第 6 节 区分结构、数据、控制冒险,说明转发与停顿
7 高级流水线基本原理 识记 第 7 节 说明超流水线、多发射、VLIW、超标量、乱序执行
8 异常和中断 识记、领会 第 8 节 区分内部异常与外部中断,说明硬件的响应过程

第 4 条兼有简单应用,需能划分流水段并计算吞吐率;第 6、7 条以识记为主,重点是术语所指的现象而非细节推导。

本章学习目标

第 3 章定义指令格式与功能,本章分析寄存器、ALU、总线和控制信号如何配合实现这些指令。

全章先分析单条指令的数据通路与控制(第 1–3、5 节),再讨论多条指令的流水线重叠、吞吐率和冒险处理(第 4、6、7 节),最后介绍异常与中断响应(第 8 节)。计算时重点检查:单总线同一时刻是否存在多个数据源,以及流水线的单条指令延迟与整体吞吐率是否被混淆。

1 程序执行概述(1,识记、领会)

CPU 主要由数据通路和控制部件(控制器)组成。数据通路负责存储、传送和处理数据;控制器根据操作码、时钟节拍和标志状态产生控制信号。指令处理可分为取指、译码、取数、执行、访存和写回等步骤,但并非每条指令都需要全部操作。例如,寄存器加法 add 不访问数据存储器,sw 不写回寄存器堆。

部件 职能
PC(程序计数器) 存放下一条待取指令的主存地址
IR 与译码器 IR 锁存刚取回的当前指令,译码器切开字段解读操作码与寄存器号
寄存器堆(GPRs) 提供两个读口、一个写口,高速读写源操作数与运算结果
ALU 完成算术逻辑运算、分支条件比较,以及 lw/sw 的有效地址加法
MAR / MDR CPU 通往主存的门户:MAR 锁存主存地址,MDR 暂存读写数据
控制器 生成多路选择信号、寄存器写使能、ALU 功能码和主存读写命令

指令周期是取出并执行一条指令的全过程,CPU 时钟周期(节拍)是组织硬件动作的时间单位。单周期 CPU 在一个较长时钟周期内完成指令,多周期 CPU 则用多个较短周期完成。流水线使多条指令的处理过程重叠:即使稳态下平均每拍完成一条指令(\(\text{CPI} \approx 1\)),基础五段流水线中单条指令仍需经过 5 个节拍。

2 数据通路基本结构和定时(2,识记、领会)

数据通路包含两类电路:操作元件(组合逻辑元件),如 MUX、加法器、ALU 和译码器,输出由当前输入决定;状态元件(存储元件),如 PC、IR 和寄存器,在规定时钟边沿锁存数据。时钟周期必须容纳“源寄存器 Clk-to-Q 延时+最长组合逻辑路径延时+目的寄存器建立时间”等定时要求,否则可能锁存错误数据。

单总线数据通路让多个部件共用内部总线,节省连线,但同一时刻只能有一个源驱动总线,因此取数、运算和写回通常需要多个节拍。双总线、三总线或单周期专用数据通路可提供更多并行通路。控制信号主要包括两类:多路选择器控制端选择数据来源,写使能信号(如 RegWr、MemW、IRin)决定是否更新目的状态元件。

单周期实现由最慢指令(通常为 lw)决定时钟周期;多周期实现按阶段复用硬件,周期较短,但 CPI 较高。比较时应计算“时钟周期×周期数”,不能仅凭 CPI 判断快慢;多周期是否更快,还取决于指令组成及各阶段延迟。

3 数据通路工作原理(3,领会)

将机器指令拆为寄存器传送等微操作,便可进一步确定控制信号。例如,带 MAR、MDR 的取指过程包括:MAR ← (PC),发出 MemR,等待 MDR ← M[MAR],再以 IR ← (MDR) 保存指令,并更新 PC(本例为 PC ← (PC) + 4)。哪些动作可并行,要依据数据通路、资源冲突和存储器时序判断。

到了单周期专用数据通路(教材图 4.11),四类典型 MIPS 指令的核心路径与写使能开关一表看清:

MIPS 指令 核心数据流 关键写操作与控制信号
add rd, rs, rt 寄存器堆读出 R[rs]、R[rt] → ALU 相加 → 结果选择器 写回 rd(RegDst=1, RegWr=1, MemtoReg=0)
lw rt, imm(rs) R[rs] + SignExt(imm) 送数据存储器地址端 → 读出主存字 主存数据写回 rt(Extop=1, MemR=1, MemtoReg=1, RegDst=0, RegWr=1)
sw rt, imm(rs) R[rs] + SignExt(imm) 送地址端,R[rt] 送写入数据端 只写数据存储器(MemW=1, RegWr=0)
beq rs, rt, imm ALU 做减法比 R[rs] 与 R[rt],分支加法器算 PC+4+(imm<<2) 相等(Zero=1)时改写 PC 为分支目标(PCSrc=1, RegWr=0)

在本章模型中,所有指令都要从指令存储器取指。sw 不读取数据存储器,但会向其中写入数据,不能据此说它“不访存”。IR 等寄存器是否独立设置,则取决于具体实现。

3.1 控制信号表怎么答(补充模板)

分析设计题通常要求列出微操作及其控制信号。可按以下三列记录,并先确认题图的数据通路和访存时序:

划分节拍时,先检查数据来源和依赖:同一时刻不能有两个源驱动同一总线;后一步若依赖本拍结束才锁存的结果,通常需要另一个节拍。多个目的寄存器可以在硬件允许、且确实需要相同数据时同时锁存总线值,因此不能将所有写使能都视为互斥。

以下以教材图 4.7 的单总线结构为依据,给出自编寄存器加法 R3 ← R1 + R2 的执行阶段。ALU 一路输入来自暂存器 Y,另一路来自内总线,结果存入 Z:

节拍 控制信号 功能
T1 R1out, Yin Y ← R1,保存第一个操作数
T2 R2out, add, Zin Z ← Y + R2,第二个操作数经总线送入 ALU
T3 Zout, R3in R3 ← Z,写入结果

三步不能合并:先保存第一个操作数,再让第二个操作数驱动总线进行加法,最后将 Z 写入目的寄存器。任一步都只有一个总线输出源;不能同时发出 R1out 和 R2out,再用未说明的“子周期”维持原节拍数。

上表仅计算执行阶段,不含取指和译码。完整指令需要多少节拍,还取决于题图是否有专用增量器、存储器是否需要等待,以及哪些独立操作可以并行。不要将 IF、ID、EX、MEM、WB 五个功能阶段直接当作单总线结构的五个时钟节拍,也不要套用固定的四拍或五拍。

4 流水线执行(4,识记、领会、简单应用)

指令流水线将指令处理划分为多个阶段,使不同指令在不同阶段重叠执行。基础 MIPS 五段流水线为 IF(取指)→ ID(译码/读寄存器)→ EX(执行/算地址)→ MEM(访存)→ WB(写回)。相邻阶段之间设置 IF/ID、ID/EX、EX/MEM、MEM/WB 流水段寄存器,在时钟边沿保存数据、目的寄存器号和后续控制信号。

在本节统一的五段流水线模型中,每条指令按相同阶段推进,即使某阶段不执行有效操作。例如,R 型运算不使用 MEM 读写数据,sw 和 beq 不在 WB 写寄存器,但时序分析仍需保留相应位置。

设流水线有 \(k\) 段,时钟周期为 \(\tau\),连续执行 \(n\) 条无冲突指令。第一条需 \(k\tau\),此后 \(n-1\) 条每隔 \(1\tau\) 完成一条,即理想稳态 \(\text{CPI} = 1\)。总耗时 \(T_{\text{pipe}}\) 与吞吐率 \(TP\) 为:

\[T_{\text{pipe}} = (k + n - 1)\tau, \qquad TP = \frac{n}{(k + n - 1)\tau}\]

若串行执行每条指令需 \(k\tau\),流水线加速比为 \(\dfrac{nk}{k + n - 1}\);当 \(n \to \infty\) 时,趋近段数 \(k\)。若有 \(s\) 个停顿周期,则增加 \(s\tau\),总时间为 \((k + n - 1 + s)\tau\)。各段延迟不同时,时钟周期 \(\tau\) 由最慢阶段的组合逻辑延迟加流水段寄存器开销决定。

算例:5 段流水线,\(\tau = 2\ \text{ns}\),10 条无冲突指令需要 \((5 + 10 - 1) = 14\) 个周期 \(= 28\ \text{ns}\),吞吐率 \(TP = 10 / 28\ \text{ns} \approx 3.57 \times 10^8\ \text{条/s}\)。串行执行每条 10 ns,共 100 ns,加速比约 \(100 / 28 \approx 3.57\)。流水线主要改善吞吐率,并不保证缩短单条指令延迟;寄存器开销与阶段不均衡反而可能使单条延迟增加。

5 控制器设计(5,识记、领会)

控制器根据指令和时序产生控制信号,教材对比以下两种实现:

  • 硬连线控制器(组合逻辑控制器):以操作码、节拍和标志位为输入,按“分析指令 → 列微操作与时序 → 求控制信号逻辑式 → 实现门电路”的过程设计。直接由逻辑电路产生信号,速度较快,但复杂指令下设计和修改困难,教材通常将其与较规整的 RISC 对照。
  • 微程序控制器:将机器指令所需的控制序列编为微程序,由若干微指令组成,存入控制存储器(CM/CS)。执行时按操作码找到微程序入口,再依次读取微指令、产生微命令。其结构规整,便于设计和修改复杂指令,教材通常与 CISC 对照;代价是读取控存带来的额外开销。

注意两个层次:控制存储器位于 CPU 控制器内部,保存微指令,不同于保存用户程序的主存;微指令又分水平型和垂直型,前者以位或小字段直接控制微命令,字长较宽、并行度较高,后者经过译码产生信号,编码较紧凑、并行度通常较低。

6 流水线冒险(6,识记)

指令不能按预定时序继续推进时,称为流水线冒险(Hazard)。按原因可分为以下三类:

类型 发生原因 处理方法
结构冒险(资源冲突) 两条指令在同一拍争抢同一个硬件部件(如第 1 条在 MEM 段读写数据,第 4 条在 IF 段取指,却共用一个单端口存储器) 把指令 Cache 与数据 Cache 分开(哈佛结构)、寄存器堆读写分占前半拍与后半拍,或插入停顿气泡
数据冒险(数据相关) 前面指令还没把结果算出来或写回去,紧跟着的指令就要读这个寄存器(五段顺序流水线里主要是写后读 RAW) 硬件转发(旁路 Forwarding)、硬件阻塞(停顿 Stall/插 nop)、编译器调整指令顺序
控制冒险(分支冲突) 遇上 beq/j 等转移指令,还没算出跳不跳、跳去哪,后面几拍已经顺着旧 PC 把不该跑的指令取进流水线了 硬件阻塞停顿、把分支比较提前到 ID 段、分支预测(静态/动态预测,猜错时冲刷已取指令)、延迟分支(延迟槽)

做数据冒险题(如本章习题 10、11、12)只需抠准两条时序线:

  1. 无转发时的停顿:教材规定寄存器堆在前半拍写回、后半拍读出,因此同拍的 WB 结果可被 ID 读取。两条相邻 R 型指令存在 RAW 相关时,在本模型中插入 2 条 nop,即可让使用者的 ID 与生产者的 WB 对齐。
  2. Load-Use 冒险:运算结果可从 EX/MEM 转发到下一条指令的 EX 输入,从而避免停顿;但 lw 的数据直到 MEM 末才产生,紧随其后的使用者此时已需要进入 EX,来不及转发。因此,本五段模型仍需停顿 1 个时钟周期,再由 MEM/WB 转发。也可由编译器安排一条无依赖指令填补空隙,见习题 12。

7 高级流水线(7,识记)

普通单发射流水线每周期至多完成一条指令,理想情况下 \(\text{CPI} \ge 1\)、\(\text{IPC} \le 1\)。提高性能可从加深流水线、缩短周期,或多发射、争取 \(\text{IPC} > 1\) 两个方向理解:

  • 超流水线(Superpipelining):将阶段进一步细分,以缩短时钟周期、提高主频。它本身不等于多发射,理想 \(\text{CPI}\) 仍为 1;阶段过多也会增加寄存器开销和分支预测失败后的清空代价。
  • 多发射(Multiple Issue):扩大每周期的发射宽度,在同一时钟周期内发射多条指令,使 \(\text{IPC} > 1\)(\(\text{CPI} < 1\))。按指令由谁挑选和组合,可分为两类:
  • 静态多发射与超长指令字(VLIW):由编译器在编译期分析依赖,将可并行操作组合为超长指令字,硬件按编排同时执行。
  • 动态多发射与超标量(Superscalar):硬件在运行时选择多条指令送往不同执行单元。常结合动态流水线调度(乱序执行 Out-of-Order Execution),使操作数已就绪的后续指令先执行,再通过重排序缓冲等机制按序提交,兼顾指令级并行(ILP)与精确异常。

8 异常和中断(8,识记、领会)

指令执行过程中可能发生异常或中断。两者都会转入相应处理程序,但来源和响应时机不同:

  • 内部异常(Exception):由当前指令执行引起,与指令同步。按处理结果和返回位置,教材分为三类:
  • 故障(Fault):指令执行中发现可处理的问题,如缺页。处理程序完成补救后,通常重新执行引发故障的指令。
  • 陷阱(Trap,自陷):由系统调用或调试等指令主动触发,通常在该指令执行后处理,并返回下一条指令(本例模型中为 \(\text{PC}+4\))。
  • 终止(Abort):由不可恢复的硬件或数据错误引起,当前程序无法继续执行,系统可能终止程序或采取其他恢复措施。
  • 外部中断(Interrupt):由 CPU 外部设备或时钟等事件触发,与当前指令执行进度无关,属于异步事件。在本章模型中,CPU 通常在当前指令结束后响应,处理完成后继续执行下一条指令。

应区分保存断点与保护现场。硬件先按体系结构保存返回地址及必要的处理器状态,并转入异常或中断入口;软件随后保存处理程序会使用的通用寄存器。具体保存到栈还是专用寄存器、保存哪些状态,依体系结构而定,例如 MIPS 的 EPC 保存异常相关返回地址,Cause 记录原因,不能把两者都当作通用 PSW。

8.1 中断响应三步(答题用)

这一小段按 2025 年 4 月简答第 23 题的采分点组织,共 7 分,写作时分三步、标上分值。

  1. 关中断,清中断允许触发器 IF——2 分。目的是让响应过程不被打断,否则断点还没存好,新请求就可能覆盖现场。
  2. 保护断点:把 PC 与 PSW(程序状态字)压栈或送入专用寄存器——2 分。这一步只存恢复执行所需的返回位置与状态,不负责保护通用寄存器。
  3. 识别中断源并转入中断服务程序入口——3 分。软件查询靠依次读状态,向量中断靠按中断类型号查中断向量表取出入口地址。

第 6 章 5.2 节从外设请求开始描述完整过程,其第 2、3 步对应本节的响应动作,第 4、5 步描述服务与返回。对应关系如下:

响应三步 对应第 6 章 5.2 节的五步 说明
① 关中断 第 2 步(按体系结构规定控制中断允许状态) 先屏蔽,再存现场
② 保护断点 第 2 步(保存必要的断点与状态) PC 与 PSW 入栈或进专用寄存器
③ 识别中断源并转入口 第 3 步(软件查询或向量机制确定服务程序) 向量中断按类型号查表得入口地址

本节三步描述的是中断响应,第 6 章五步覆盖从请求到返回的完整过程。题目若只问“中断响应”,应答响应动作;若问“中断处理全过程”,还需说明服务程序的现场保护、设备服务与返回。

9 考核要求

本章共 8 条考核条目:第 1、2、4、5、8 条兼有识记与领会,第 3 条为领会,第 6、7 条以识记为主,第 4 条还包含简单应用。复习可分三组:数据通路控制与关键路径定时(习题 3–6),流水线吞吐率、转发和 Load-Use 停顿(习题 7–12),以及两类控制器、内部异常与外部中断的对比。

10 教材本章习题

题目取自教材第 4 章“习题”(共 12 题),答案取自教材附录“部分习题解答”(收录第 3、4、5、6、7、8、9、10、11、12 题;其余请对照教材自行完成)。

10.1 概念与简答

1. 给出以下概念的解释说明。

  • 指令周期、数据通路、控制部件、执行部件
  • 程序计数器 PC、指令寄存器 IR、指令译码器 ID、控制信号
  • 操作元件、状态元件、硬连线控制器、微程序控制器
  • 微程序、控制存储器 CS、微指令、指令流水线
  • 指令吞吐率、流水段寄存器、流水线冒险、结构冒险
  • 数据冒险、控制冒险、流水线阻塞、转发(旁路)
  • 延迟损失时间片、静态多发射、动态多发射、超流水线
  • 超长指令字 VLIW、超标量流水线、动态流水线调度、乱序执行
  • 内部异常、外部中断、故障、陷阱
  • 陷阱指令、终止、断点、向量中断
  • 中断向量、中断向量表、中断类型号、向量地址
答案与解析

教材附录未收本题解答,请对照教材自行完成。

2. 简单回答下列问题。

(1)CPU 由哪些基本部件组成?CPU 的基本功能是什么?

(2)如何控制一条指令执行结束后能够接着执行另一条指令?

(3)通常一条指令的执行要经过哪些步骤?每条指令的执行步骤都一样吗?

(4)取指令部件的功能是什么?控制器的功能是什么?

(5)为什么按异步方式访问存储器时需要 WMFC 信号,而按同步方式访存时不需要 WMFC 信号?

(6)硬连线控制器和微程序控制器的特点各是什么?

(7)为什么 CISC 大多用微程序控制器实现,RISC 大多用硬连线控制器实现?

(8)流水线方式下,一条指令的执行时间缩短了还是加长了?程序的执行时间缩短了还是加长了?

(9)具有什么特征的指令集易于实现指令流水线?

答案与解析

教材附录未收本题解答,请对照教材自行完成。

10.2 数据通路与控制信号

3. 假定图 4.9 中总线传输延时和 ALU 延时分别是 20 ps 和 200 ps,寄存器建立时间为 10 ps,寄存器保持时间很小,可忽略不计,寄存器的锁存延时(Clk-to-Q time)为 4 ps,控制信号生成的延迟时间(Clk-to-signal time)为 7 ps,三态门接通时间为 3 ps,则从当前时钟到达开始算起,完成以下操作的最短时间是多少?

(1)将数据从一个寄存器传送到另一个寄存器。

(2)将程序计数器 PC 加 1。

答案与解析

参考答案: 单总线数据通路中,所有与内部总线相连的寄存器都有相应的 \(\mathrm{R}_{\mathrm{in}}\) 和/或 \(\mathrm{R}_{\mathrm{out}}\) 控制信号,以控制总线和寄存器之间的数据传送。总线和 ALU 输入端之间、Y 寄存器与 ALU 输入端之间都无需控制信号。ALU 输出与 Z 寄存器之间可以有控制信号 \(\mathrm{Z}_{\mathrm{in}}\),也可以没有。若没有 \(\mathrm{Z}_{\mathrm{in}}\),则每来一个时钟,ALU 的输出总是被写入 Z 寄存器。下面的定时就按这两条路径掰开算。

单总线数据通路中主要路径的定时如下:时钟边沿到达后,经过 Clk-to-Q time 的延时,寄存器中的内容被读出,同时,在指令译码器中的控制逻辑生成当前时钟周期内所需的控制信号,其延时为 Clk-to-signal time。随后,由生成的控制信号 \(\mathrm{Ri}_{\mathrm{out}}\) 接通三态门,并使寄存器数据在总线上传输。若当前时钟周期内不做 ALU 运算而是直接在寄存器之间传送,则总线上的数据在 \(\mathrm{Rj}_{\mathrm{in}}\) 的控制下直接被送到目的寄存器 Rj 的输入端,在下一个时钟边沿到来之前,总线上的数据必须继续稳定一段寄存器建立时间,以使寄存器 Rj 的输入在这段建立时间内保持不变;若当前时钟周期内有 ALU 运算,则还需 ALU 电路延时,最后 ALU 结果直接送 Z 寄存器,在下一个时钟边沿到来之前,ALU 的输出必须继续稳定一段寄存器建立时间,以使寄存器 Z 的输入在这段建立时间内保持不变。

这里有个容易漏掉的环节。算式里会出现 \(7+3+20+10\),题干给的那个 4 ps 似乎不见了,读者常以为是被谁吃掉了。其实时钟沿一来,两条路径同时起跑:

  • 控制通路:先等 Clk-to-signal time 把控制信号算出来(7 ps),\(\mathrm{Ri}_{\mathrm{out}}\) 再接通三态门(3 ps),共 \(7+3=10\) ps,此后数据才有资格上总线;
  • 数据通路:寄存器在 Clk-to-Q 之后就有输出,只花 4 ps。

寄存器输出早,不代表数据已经在总线上。它得等三态门开。所以“何时起步”取两者中更慢的那个:

\[t_{\text{起步}}=\max(\text{Clk-to-Q},\ \text{Clk-to-signal}+\text{三态门})=\max(4,\ 7+3)=10\ \text{ps}\]

4 ps 没有丢,它比 10 ps 短,被更长的控制通路盖住了。教材在讲数据通路定时时也点明过,Clk-to-signal 的时延一定大于 Clk-to-Q,正是这个道理:时钟一到,数据只算“就位”,门还得等控制信号来开。

(1)寄存器之间传送,起步 10 ps,再过总线 20 ps,目的寄存器入口处还要留 10 ps 建立时间:

\[T=\max(4,\ 7+3)+20+10=10+20+10=40\ \text{ps}\]

在寄存器之间传送只需要一个时钟周期。

(2)将 PC 中的内容加 1 送 PC,被分解成以下两个过程:PC 加 1 送 Z、Z 送 PC。第一个过程多了 ALU 的 200 ps:

\[T_{1}=\max(4,\ 7+3)+20+200+10=10+20+200+10=240\ \text{ps}\]

第二个过程就是把 Z 的内容送到 PC,又是寄存器之间的传送,\(T_{2}=40\) ps。两段串起来合计 \(240+40=280\) ps,共需要两个时钟周期才能完成该操作。

4. 右图给出了某 CPU 内部结构的一部分,MAR 和 MDR 直接连到存储器总线(图中省略)。

题 4 图见教材第 4 章(CPU 内部结构的一部分;图中 MAR 和 MDR 直接连到存储器总线)。

所有寄存器只能从总线 A 接受信息并只能发送信息到总线 B,在总线 A 和 B 之间的所有数据传送都需经过算术逻辑部件 ALU。ALU 的部分控制信号及其功能如下:

\[\mathrm{MOVa:F=A;}\quad\mathrm{MOVb:F=B;}\]
\[\mathrm{INCa}:\mathrm{F}=\mathrm{A}+1\;;\qquad\mathrm{INCb}:\mathrm{F}=\mathrm{B}+1\;;\]
\[\mathrm{DECa}:F=A-1\text{;}\quad\mathrm{DECb}:F=B-1\text{。}\]

其中 A 和 B 是 ALU 的输入,F 是 ALU 的输出。假定该 CPU 的指令系统中调用指令 CALL 占两个字,第一个字是操作码,第二个字给出子程序的起始地址,返回地址保存在主存的栈中,用 SP(栈指示器)指向栈顶,存储器按字编址,每次按同步方式从主存读取一个字,请写出读取并执行 CALL 指令所要求的控制信号序列(提示:当前指令地址已在 PC 中)。

答案与解析

参考答案: 因为采用同步方式读写内存,所以在 read 和 write 信号后不需加等待信号 WMFC。CALL 指令的长度有两个字,按字编址,每次从主存读取一个字,因此,CALL 指令需要读两次主存,其指令周期分为以下三个阶段。

(1)取指令操作码:将 PC 的内容作为地址访问存储器,取出指令的操作码,送指令寄存器 IR,同时 PC+1 送 PC,使指向指令的第二个字。该阶段至少需要 3 个时钟周期(节拍),每个时钟周期的控制信号及其注释如下。

PC_out, MOVb, MAR_in    PC 内容送总线 B,经 ALU 送总线 A,总线 A 送 MAR
Read, INCb, PC_in       读内存,PC 内容加 1 并送总线 A,总线 A 送 PC
MDR_out, MOVb, IR_in    MDR 内容送总线 B,经 ALU 送总线 A,总线 A 送 IR

(2)取子程序首地址:将 PC 的内容作为地址,取出指令的第二个字(即子程序入口地址)送 PC,以使下一个指令周期从子程序的第一条指令开始执行;同时,计算 PC+1 以得到返回地址,送 Y 寄存器。该阶段至少需要 3 个时钟周期。

PC_out, MOVb, MAR_in    PC 内容送总线 B,经 ALU 送总线 A,总线 A 送 MAR
Read, INCb, Y_in        读内存,PC 内容加 1 并送总线 A,总线 A 送 Y
MDR_out, MOVb, PC_in    MDR 内容送总线 B,经 ALU 送总线 A,总线 A 送 PC

(3)保存返回地址至栈中:将临时保存在 Y 寄存器的返回地址送到栈顶保存,并自动调整栈顶指针(假设栈从高地址向低地址增长,故 SP 的内容减 1)。该过程至少需要 3 个时钟周期。

SP_out, MOVb, MAR_in        SP 内容送总线 B,经 ALU 送总线 A,总线 A 送 MAR
Y_out, MOVb, MDR_in         Y 内容送总线 B,经 ALU 送总线 A,总线 A 送 MDR
Write, SP_out, DECb, SP_in  写内存,SP 送总线 B,SP 减 1 送总线 A,总线 A 送 SP

但每个节拍里各操作所需的时间并不相等。存储访问(read/write)最长,时钟周期只能以它为准,于是 CALL 指令的指令周期至少有 9 个时钟周期(节拍)。

如果将第一次 PC+1 的结果送到 Y 寄存器,第二阶段以 Y 的内容作为地址访问主存,并继续对 Y 寄存器加 1,结果送 PC,则也能实现 CALL 指令的功能。这种方式下,也是 9 个时钟周期。

5. 假定某计算机字长 16 位,CPU 内部结构如图 4.7 所示,CPU 和存储器之间采用同步方式通信,按字编址。指令采用定长指令字格式,由两个字组成,第一个字指明操作码和寻址方式,第二个字包含立即数 Imm16。若一次存储器访问所用时间为两个 CPU 时钟周期,每次存储器访问存取一个字,取指令阶段第二次访存将 Imm16 取到 MDR 中,请写出下列指令在指令执行阶段(不考虑取指令阶段)的控制信号序列,并说明需要几个时钟周期。

(1)将立即数 Imm16 加到寄存器 R1 中,此时,Imm16 为立即操作数。即: \(\mathrm{R} \left[ \mathrm{R} \, 1 \right] \leftarrow \mathrm{R} \left[ \mathrm{R} \, 1 \right] + \mathrm{Imm} \, 16\)

(2)将地址为 Imm16 的存储单元的内容加到寄存器 R1 中,此时,Imm16 为直接地址。

\[即 :R\left[R1\right]\leftarrow R\left[R1\right]+M\left[Imm16\right]\]

(3)将存储单元 Imm16 的内容作为地址所指的存储单元的内容加到寄存器 R1 中。此时,Imm16 为间接地址。即: \(\text{R}[ \text{R1}] \leftarrow \text{R}[ \text{R1}] + \text{M}[ \text{M}[\text{Imm16}] ]\)

答案与解析

参考答案: 为了明显表示 ALU 输出送 Z 寄存器,假定有控制信号 \(Z_{in}\)。根据题意可知,取指令阶段结束时,Imm16 已经被取到 MDR 中。一次存储器访问所用时间为两个 CPU 时钟周期,假设为 Read1 和 Read2。

(1)指令功能为 R[R1]←R[R1]+Imm16 时,执行阶段不需要访存操作,因此,可用以下 3 个时钟周期完成。

MDR_out, Y_in       Imm16 送总线,总线送 Y
R1_out, add, Z_in   R1 送总线,和 Y 相加,结果送 Z
Z_out, R1_in        Z 送总线,总线送 R1

(2)指令功能为 R[R1]←R[R1]+M[Imm16] 时,执行阶段需要一次访存操作,因此,至少需要以下 5 个时钟周期。其中 \(\mathrm{R1}_{\mathrm{out}}\) 和 \(\mathrm{Y}_{\mathrm{in}}\) 这两个控制信号可以在 Read1 周期就送出,并在 Read2 周期中保持不变,也可以到 Read2 周期时再送出。

MDR_out, MAR_in           Imm16 送总线,总线送 MAR
Read1, (R1_out, Y_in)     读内存,(R1 送总线,总线送 Y)
Read2, R1_out, Y_in       继续读内存,R1 送总线,总线送 Y
MDR_out, add, Z_in        M[Imm16] 送总线,和 Y 相加,结果送 Z
Z_out, R1_in              Z 送总线,总线送 R1

(3)指令功能为 R[R1]←R[R1]+M[M[Imm16]] 时,执行阶段需要两次访存操作,因此,至少需要以下 8 个时钟周期。对 \(\mathrm{R1}_{\mathrm{out}}\)、\(\mathrm{Y}_{\mathrm{in}}\) 这两个控制信号的处理同(2)中一样。

MDR_out, MAR_in           Imm16 送总线,总线送 MAR
Read1                     读内存
Read2                     继续读内存
MDR_out, MAR_in           M[Imm16] 送总线,总线送 MAR
Read1, (R1_out, Y_in)     读内存,(R1 送总线,总线送 Y)
Read2, R1_out, Y_in       继续读内存,R1 送总线,总线送 Y
MDR_out, add, Z_in        M[M[Imm16]] 送总线,和 Y 相加,结果送 Z
Z_out, R1_in              Z 送总线,总线送 R1

6. lw 和 sw 分别是 MIPS 指令系统中的装入指令和存储指令,4.3.2 节中描述了 lw 指令在 MIPS 单周期数据通路中的执行过程。已知某 sw 指令的机器码为 9E950000H,所在地址为 0083920CH,对于图 4.11 所示的 MIPS 单周期数据通路,请回答下列问题或完成下列任务。

(1)该 sw 指令中的 rs、rt 和立即数(imm16)字段的值各是多少?写出该 sw 指令的汇编表示。

(2)执行该指令前,程序计数器(PC)中的内容是什么?下个时钟(Clk)触发边沿到达之前,PC 的输入端是什么信息?

(3)该指令的取指过程结束时,寄存器组的 Ra 和 Rb 输入端分别是什么信息?扩展器的输入端是什么信息?指令译码器的输入端是什么信息?

(4)在对该指令译码后所生成的控制信号中,RegWr、Extop、RegDst、MemR、MemW、MemtoReg、PCSrc 的取值分别应该是什么?

(5)假定 20 号和 21 号寄存器中的内容分别为 00080020H 和 FFFFF000H,则该指令执行过程中,ALU 的输出是什么?下个时钟(Clk)触发边沿到达后,数据存储器和寄存器组中各自会发生什么变化?

答案与解析

参考答案: (1)将 9E950000H 展开成 32 位二进制并按 I 型格式 6 + 5 + 5 + 16 切分:100111 10100 10101 0000000000000000B(注意教材原书把 sw 的 op 记作 100111)。其中 op = 100111 代表 sw 指令,rs = 10100B = 20(即 $s4),rt = 10101B = 21(即 $s5),16 位立即数 imm16 = 0。故对应的汇编指令写作 sw $21, 0($20)(或 sw $s5, 0($s4))。

(2)执行该指令前,PC 里存的就是本条指令所在地址 0083920CH。执行期间,一路由加法器算顺序后继地址 PC + 4,另一路算分支目标地址 PC + 4 + imm16 × 4,两路送进 PC 前的多路选择器 MUX。由于本题 imm16 = 0(且 sw 置 PCSrc = 0),下个时钟触发边沿到达前,PC 输入端的值就是 0083920CH + 4 = 00839210H。

(3)取指结束时,指令各字段直接连往对应部件输入端:寄存器组的两个读地址端 Ra(接 rs)和 Rb(接 rt)分别为 10100 和 10101;扩展器输入端为 16 个 0(0000000000000000);指令译码器输入端(接 op)为 100111。

(4)sw 指令把寄存器 $rt 的内容写进主存,不改写任何通用寄存器,因此寄存器写使能 RegWr = 0,与写回相关的两个多路选择信号 RegDst 和 MemtoReg 均为任意值(无关项 X)。算有效地址时要对 16 位位移量做符号扩展,故 Extop = 1;不读数据存储器而只写数据存储器,故 MemR = 0、MemW = 1;执行完顺序走下一条指令,故 PCSrc = 0。

(5)这条指令做两件事:先把 20 号寄存器的内容与符号扩展后的立即数 0 相加,得到存储地址;再把 21 号寄存器的内容写进这个地址。立即数是 0,地址就等于 $20 的内容,所以 ALU 的输出是 00080020H,作为地址送到数据存储器的地址端 Adr。21 号寄存器的内容 FFFFF000H 送到数据存储器的数据输入端 \(\mathrm{D}_{in}\)。控制信号 MemW=1,下个时钟(Clk)触发边沿到达后就执行写操作。至于寄存器组那一侧,寄存器写使能信号 RegWr=0,什么也不会发生。

10.3 流水线性能与冒险

7. 假定在一个如图 4.12 所示的 5 级流水线处理器中,各主要功能单元的操作时间为:存储单元—200 ps;ALU 或加法器—150 ps;寄存器堆读口或写口—50 ps。回答下列问题。

(1)若执行阶段 EX 所用的 ALU 操作时间缩短 20%,则能否加快流水线执行速度?如果能的话,能加快多少?如果不能的话,为什么?

(2)若 ALU 操作时间增加 20%,对流水线的性能有何影响?

(3)若 ALU 操作时间增加 40%,对流水线的性能又有何影响?

答案与解析

参考答案: (1)ALU 操作时间缩短 20% 不能加快流水线指令速度。因为指令流水线的执行速度取决于最慢的功能部件所用时间,最慢的是存储器,只有缩短了存储器的操作时间才可能加快流水线速度。

(2)\(\mathrm{ALU}\) 操作时间延长 20% 时,变为了 180 ps,比存储器所用时间 200 ps 还小,因此,对流水线性能没有影响。

(3)ALU 操作时间延长 40% 时,变为了 210 ps,比存储器所用时间 200 ps 大,因此,在不考虑流水段寄存器延时的情况下,流水线的时钟周期从 200 ps 变为 210 ps,流水线执行速度降低了 \((210-200)/200 = 5\%\)。

8. 假定某计算机工程师想设计一个新的 CPU,一个典型程序的核心模块有一百万条指令,平均每条指令执行时间为 100 ps。请问:

(1)在非流水线处理器上执行该程序需要花多长时间?

(2)若新 CPU 采用 20 级流水线,执行上述同样的程序,理想情况下,它比非流水线处理器快多少?

(3)实际指令流水线中流水段之间的数据传送会有额外开销,这些开销是否会影响指令执行时间和指令吞吐率?

答案与解析

参考答案: (1)非流水线处理器上执行时间大约为 \(100\ \text{ps} \times 10^{6} = 100 \times 10^{-12} \times 10^{6}\ \text{s} = 100 \times 10^{-6}\ \text{s} = 100\ \mu\text{s}\)。

(2)平均每条指令耗时 \(100\ \text{ps}\),最复杂指令的耗时必定不小于 \(100\ \text{ps}\)。切分到 20 级流水线上且忽略流水段寄存器延时,理想情况下每个时钟周期至少为 \(100 / 20 = 5\ \text{ps}\),\(10^6\) 条指令总执行时间约为 \(5\ \text{ps} \times 10^{6} = 5\ \mu\text{s}\),比非流水线方式快约 \(100 / 5 = 20\) 倍。

(3)都会受影响:每两段之间插入流水段寄存器带来的锁存与建立时间开销,一方面拉长了每个流水段的时钟周期(导致指令吞吐率下降),另一方面让单条指令走完全部流水段的总耗时变得更长(即单条指令执行时间延长)。

9. 假定最复杂的一条指令所用的组合逻辑分成 6 部分,依次为 A~F,其延迟分别为 80 ps、30 ps、60 ps、50 ps、70 ps、10 ps。在这些组合逻辑块之间插入必要的流水段寄存器就可实现相应的指令流水线,寄存器延迟为 20 ps。理想情况下,以下各种方式所得到的时钟周期、指令吞吐率和指令执行时间各是多少?应该在哪里插入流水段寄存器?

(1)插入一个流水段寄存器,得到一个两级流水线。

(2)插入两个流水段寄存器,得到一个三级流水线。

(4)指令吞吐率最大的流水线。

答案与解析

参考答案: (1)两级流水线的最佳切分点在 C 和 D 之间:前一段(A、B、C)组合逻辑延时为 \(80 + 30 + 60 = 170\ \text{ps}\),后一段(D、E、F)组合逻辑延时为 \(50 + 70 + 10 = 130\ \text{ps}\)(教材原式写作 \(50+60+20\);按题干 D、E、F 三段延时应为 \(50+70+10\),结果同为 \(130\ \text{ps}\))。时钟周期由最长段决定,加上流水段寄存器延时 \(20\ \text{ps}\) 得 \(170 + 20 = 190\ \text{ps}\);理想指令吞吐率为 \(1 / 190\ \text{ps} \approx 5.26\ \text{G}\) 条/秒,单条指令在流水线中的执行时间为 \(2 \times 190\ \text{ps} = 380\ \text{ps}\)。

(2)三级流水线的两个寄存器分别插在 B 和 C 之间、D 和 E 之间:第一段(A、B)延时为 \(80 + 30 = 110\ \text{ps}\),第二段(C、D)延时为 \(60 + 50 = 110\ \text{ps}\),第三段(E、F)延时为 \(70 + 10 = 80\ \text{ps}\)(教材原式写作 \(60+20\);按题干 E、F 两段应是 \(70+10\),结果同为 \(80\ \text{ps}\))。时钟周期取最长段加寄存器延时 \(110 + 20 = 130\ \text{ps}\),指令吞吐率为 \(1 / 130\ \text{ps} \approx 7.69\ \text{G}\) 条/秒,单条指令执行时间为 \(3 \times 130\ \text{ps} = 390\ \text{ps}\)。

(4)要想吞吐率最大,时钟周期必须压到最短;而单个功能块最长延时已经是 \(80\ \text{ps}\)(A 段),加上寄存器延时 \(20\ \text{ps}\),时钟周期最短只能压到 \(80 + 20 = 100\ \text{ps}\)。为此只需让每一段的组合逻辑延时都不超过 \(80\ \text{ps}\) 且段数尽可能少:把 E(\(70\ \text{ps}\))和 F(\(10\ \text{ps}\))合为一段(恰好 \(80\ \text{ps}\)),其余 A、B、C、D 各占一段,即在 A 与 B、B 与 C、C 与 D、D 与 E 之间插入 4 个流水段寄存器构成五段流水线(各段组合逻辑延时依次为 \(80\ \text{ps}、30\ \text{ps}、60\ \text{ps}、50\ \text{ps}、80\ \text{ps}\))。此时时钟周期为 \(100\ \text{ps}\),最大指令吞吐率为 \(1 / 100\ \text{ps} = 10\ \text{G}\) 条/秒,单条指令执行时间为 \(5 \times 100\ \text{ps} = 500\ \text{ps}\)。

题干只列了(1)(2)(4)三个小问,编号里缺(3),就按这三问归纳。三个方案摆在一起,取舍立刻露出来。段切得越细,时钟周期越短,吞吐率越高;可是每切一刀就多一组流水段寄存器,单条指令要穿过更多段,延迟反而变长。两段的方案每条指令只走 380 ps,吞吐率 5.26 G 条/s;五段的方案周期压到 100 ps、吞吐率 10 G 条/s,单条却要 500 ps。段数与单条延迟是一对反向指标,谁也占不全。要吞吐还是要单条延迟,看程序是成千上万条指令排着队跑,还是只有一条非等不可。

10. 假定采用“取指、译码/取数、执行、访存、写回”五段流水线方式,并保证在一个时钟的前半周期进行寄存器写,在后半周期进行寄存器读。对于以下 MIPS 指令序列(其中 t1~t2、s0~s3 都是 MIPS 寄存器名):

addu $s2, $s1, $s0  # R[ $s2] ← R[ $s1] + R[ $s0]
addu $t2, $s2, $s2  # R[ $t2] ← R[ $s2] + R[ $s2]
lw   $t1, 0($t2)    # R[ $t1] ← M[ R[ $t2] + 0]
add  $s3, $t1, $t2  # R[ $s3] ← R[ $t1] + R[ $t2]

请回答以下问题。

(1)哪些指令对之间发生数据相关?

(2)若不采用转发技术,则需要在发生数据相关的指令前加入几条 nop 指令才能使这段程序避免数据冒险?增加的 nop 指令条数是原指令条数的多少倍?完成所有指令的执行需要多少时钟周期?CPI 为多少?

(3)如果采用转发技术,是否可以完全解决数据冒险?为什么?

答案与解析

参考答案: (1)发生数据相关的指令对是:第 1 条和第 2 条指令之间关于 $s2,第 2 条和第 3 条指令之间关于 $t2,第 2 条和第 4 条指令之间关于 $t2,第 3 条和第 4 条指令之间关于 $t1(教材复原件原文至此中断,“关”后缺字,据上下文与第 3 条答案补为“关于 $t1”,缺字系 OCR 所致)。

(2)题设五段流水线支持“前半周期写寄存器、后半周期读寄存器”,不采用转发时,相邻两条存在 RAW 相关的指令中间必须隔开 2 条 nop 指令,才能让前一条指令在 WB 段前半拍写入的值被后一条指令在 ID 段后半拍读出。因此需要在第 2、3、4 条指令前各插入 2 条 nop,合计插入 6 条 nop 指令,是原指令条数(4 条)的 \(6 / 4 = 150\%\)(即 1.5 倍)。整段程序共执行 \(4 + 6 = 10\) 条指令,耗时 \((5 - 1) + 10 = 14\) 个时钟周期,有效 \(\text{CPI} = 14 / 4 = 3.5\)。

(3)不能完全解决。第 1 与第 2、第 2 与第 3、第 2 与第 4 条指令之间的 ALU 运算结果可以靠硬件转发零停顿拿到;但第 3 条 lw 与第 4 条 add 之间关于 $t1 构成了 Load-Use 数据相关(lw 要到 MEM 段末才读出 $t1,而 add 在同一拍的 EX 段开头就要用),光靠转发仍必须阻塞 1 个时钟周期。

11. 假设一个程序的 MIPS 指令序列为“lw, add, lw, add, …”。add 指令仅依赖它前面的 lw 指令,而 lw 指令也仅依赖它前面的 add 指令,寄存器写口和寄存器读口分别在一个时钟周期的前、后半个周期内独立工作。回答下列问题。

(1)在采用转发技术的五段流水线中执行该程序,其 CPI 为多少?

(2)在不采用转发技术的五段流水线中执行该程序,其 CPI 为多少?

答案与解析

参考答案: (1)采用转发技术时,add 算出的结果能直接从 EX/MEM 转发给后面紧跟着的 lw,无须停顿;而每条 lw 与紧随其后的 add 之间存在 Load-Use 数据冒险,必须阻塞 1 个时钟周期。因此每跑完一对 lw + add(2 条指令)共占 \(2 + 1 = 3\) 个时钟周期,平均 \(\text{CPI} = 3 / 2 = 1.5\)。

(2)不采用转发技术时,由于每两条相邻指令都存在 RAW 相关,每条指令后面都得插入 2 个阻塞周期(或 2 条 nop),相当于每条有效指令平均占用 \(1 + 2 = 3\) 个时钟周期,故 \(\text{CPI} = 3\)。

10.4 综合应用

12. 假定在一个采用转发技术的五段流水线中执行以下 MIPS 程序段,应怎样调整指令序列使其性能达到最好?

lw   $3,200($7)   # R[$3] ← M[R[$7]+200]
add  $6,$4,$7     # R[$6] ← R[$4]+R[$7]
sub  $3,$4,$6     # R[$3] ← R[$4]+R[$6]
lw   $2,300($8)   # R[$2] ← M[R[$8]+300]
beq  $2,$8,loop   # if R[$2] = R[$8] goto loop
答案与解析

参考答案: 先说清一件事。题干给的是 5 条指令,教材附录这道题的解答却排出 7 条,多出 lw $2, 100($6) 和 add $2, $2, $3,文字里还提到“第 6 和第 7 条指令”。附录那一段对应的是另一个程序段,与本题题干对不上。下面按题干的 5 条重做,附录答案不采信。

(题干注释把 sub 写成了加法,这里按指令名 sub 理解,不影响下面的依赖关系。)

先做依赖分析。转发能把 EX/MEM、MEM/WB 里的结果直接送到后继指令的 EX 入口,所以只剩 load-use 处理不了:load 的数据要到 MEM 段末才出来,那时后继指令的 EX 已经开动。

指令对 依赖 类型 转发够不够
I1 → I3 两条都写 $3 WAW(写后写) 顺序流水线天然保序,不用停
I2 → I3 I3 读 $6,I2 写 $6 RAW(写后读) 够。差一条指令,走 EX/MEM 转发
I4 → I5 I5 读 $2,I4 写 $2 RAW,且是 load-use 不够,还要停 1 个周期

I1 写 $3、I3 也写 $3,中间没人读 $3,只是 WAW;I4 与 I1、I2、I3 都不相干。真正的等待只有一处:I4 到 I5 之间的 load 延迟槽。

填槽的办法是把与 I2、I3 无关的 I4(lw $2,300($8))提到 I2 前面。这样一来,夹在 load 和它的使用者之间的就是 I2、I3 两条互不相干的指令:

I1  lw   $3,200($7)    # R[$3] ← M[R[$7]+200]
I4  lw   $2,300($8)    # R[$2] ← M[R[$8]+300]   ← 提前
I2  add  $6,$4,$7      # R[$6] ← R[$4]+R[$7]
I3  sub  $3,$4,$6      # R[$3] ← R[$4]-R[$6]
I5  beq  $2,$8,loop    # if R[$2]=R[$8] goto loop

语义一动没动:$3 最后仍由 I3 写入,$6 仍来自 I2,$2 仍是 I4 取回的那份,beq 判的还是它。I1 也仍排在 I3 前面,那条 WAW 的先后顺序保住了。

省了多少?原序列里 I4 后面紧跟 I5,转发只能把数据从 MEM/WB 绕回来,仍要空转 1 个周期,5 条指令走完 \(5+5-1+1=10\) 个周期。调整后相邻指令之间不再有 load-use,\(5+5-1=9\) 个周期走完。省下 1 个周期,吞吐率相应抬高。

11 自编客观题(补充)

以下 15 题按 2024 年 10 月、2025 年 4 月两卷客观题考点自编,不是教材原题;只作检索式回忆用。

11.1 单项选择题

1. CPU 响应中断时先关中断,被屏蔽的是

  • A. 全部内部异常

  • B. 可屏蔽的外部中断请求

  • C. 不可屏蔽中断 NMI

  • D. 正在执行的指令

答案与解析

参考答案: B。中断允许触发器只挡可屏蔽的外部请求,NMI 与内部异常不受它控制。

2. 与硬连线控制器相比,微程序控制器的主要优点是

  • A. 执行速度更快

  • B. 不需要控制存储器

  • C. 指令周期更短

  • D. 规整、易修改

答案与解析

参考答案: D。取微指令要多访问一次控制存储器,速度反而慢,但改指令只需改微程序。

3. 微程序控制器中,微指令存放在

  • A. 主存

  • B. 通用寄存器堆

  • C. 控制存储器

  • D. Cache

答案与解析

参考答案: C。控制存储器在控制器内部,只存微指令,不等于存放用户程序的主存。

4. 中断响应过程中,硬件首先要做的是

  • A. 关中断,清中断允许触发器

  • B. 保存全部通用寄存器

  • C. 执行中断服务程序

  • D. 恢复断点并返回

答案与解析

参考答案: A。先屏蔽新请求,断点才不会被覆盖;保存通用寄存器属于进入服务程序之后的现场保护。

5. 下列事件中,与当前指令异步的是

  • A. 译码时发现非法操作码

  • B. 取数时发生缺页

  • C. 设备传送完成后发出的中断请求

  • D. 整数除零

答案与解析

参考答案: C。设备请求来自 CPU 之外,到达时刻不确定;其余三项都由当前指令引起,属内部异常。

6. 理想 k 段流水线执行 n 条指令,稳态 CPI 约为

  • A. k

  • B. n/k

  • C. 1

  • D. k+n-1

答案与解析

参考答案: C。理想稳态下每个周期完成一条指令,CPI 为 1;单条指令仍需经过 k 段,延迟为 \(k\tau\)。相较非流水实现是否更长,还取决于阶段划分与流水寄存器开销。

7. 统一编址的单端口存储器既存指令又存数据,取指与取数争用同一部件,这类冒险是

  • A. 结构冒险

  • B. 数据冒险

  • C. 控制冒险

  • D. 异常

答案与解析

参考答案: A。争用同一硬件资源属于结构冒险,处理办法是分离或增加资源,必要时停顿。

8. 五段流水线中 lw 紧接使用其结果的 add,采用转发后通常仍需

  • A. 不停顿

  • B. 停顿 3 个周期

  • C. 冲刷整条流水线

  • D. 停顿 1 个周期

答案与解析

参考答案: D。load 的数据到 MEM 段末才可用,后继指令的 EX 已经开动,转发只能省掉其余的等待。

9. 多周期实现与单周期实现相比,主要变化是

  • A. CPI 变大,时钟周期变短

  • B. CPI 变小,时钟周期也变短

  • C. 两者都不变

  • D. CPI 变大,时钟周期也变长

答案与解析

参考答案: A。分阶段复用硬件把周期压短,代价是一条指令要占多个时钟;比性能要看周期数乘周期长度。

10. CISC 多用微程序控制器、RISC 多用硬连线控制器,主要原因是

  • A. 微程序便于实现复杂指令,硬连线便于规整指令快速译码

  • B. RISC 指令少所以不需要控制器

  • C. 微程序一定比硬连线快

  • D. 硬连线无法产生写使能信号

答案与解析

参考答案: A。复杂指令用微程序写省事,规整格式用逻辑电路直接产生信号更快。

11.2 填空题

11. 一条机器指令对应一个 ___,它由若干条微指令组成,存放在控制存储器中。

答案与解析

参考答案: 微程序

12. 在指令执行结束后报告、处理完返回后继指令的内部异常称为 ___。

答案与解析

参考答案: 陷阱(trap、自陷)

13. 中断响应的第三步是识别中断源,并把中断服务程序的 ___ 送入 PC。

答案与解析

参考答案: 入口地址(由中断向量表取得)

14. 由逻辑电路直接产生控制信号的控制器称为 ___ 控制器,它速度快但设计修改困难。

答案与解析

参考答案: 硬连线

15. CPU 由数据通路和 ___ 两大部分组成,后者依据指令、时序和状态产生控制信号。

答案与解析

参考答案: 控制部件(控制器)

12 闭卷复习与跨章联系(补充)

一、闭卷自答(合上书逐题口述)

  1. 指令周期与时钟周期怎么区分?PC、IR、译码器、MAR、MDR 各起什么作用?
  2. 操作元件与状态元件怎么分?单总线数据通路为什么常需多节拍,多总线换来什么?
  3. 控制信号从哪里产生、作用到哪些部件?单周期与多周期实现各以什么换什么?
  4. 五段流水线怎么划分?理想稳态 CPI 为何是 1,单条指令却仍需经过五段?与非流水实现比较延迟时,还需知道哪些条件?
  5. 硬连线与微程序控制器各按什么步骤设计?水平型与垂直型微指令差别在哪?
  6. 结构、数据、控制冒险各由什么引起、怎么处理?超流水线、多发射、VLIW、超标量、乱序执行各指什么?
  7. 内部异常与外部中断怎么区分?中断响应三步是什么,为什么第一步先关中断?

二、本章易错

  1. sw 需要取指并写数据存储器;它不读数据存储器,也不写回寄存器堆。区分“访存”与“读数据”,才能正确填写控制信号(第 3 节)。
  2. 不同异常的返回点不同:故障(如缺页)修复后返回当前故障指令重跑,陷阱(自陷)和外部中断返回下一条指令,终止则直接退出,不能一律写 PC + 4(第 8 节)。
  3. 硬件转发能消掉相邻 ALU 指令间的 RAW 气泡,但消不掉 lw 紧跟使用者的 Load-Use 冒险(仍需停顿 1 拍或靠编译器重排指令填槽,第 6 节)。

三、本章骨架

板块 内容 一句话抓手
数据通路与定时(第 1—3 节) 部件职能、单总线与单周期、控制信号 同时只能有一个源驱动同一总线;多个目的端能否同时写入,依题图与数据需求判断
流水线与冒险(第 4、6、7 节) 五段划分、吞吐率、三类冒险、多发射 总时间按段数加条数减一再加停顿算;load-use 停 1 拍
控制器与异常中断(第 5、8 节) 硬连线与微程序、异常分类、响应三步 微程序规整而慢;响应先关中断再存断点

四、跨章指路

  1. 本章把指令格式(见第 3 章)落实为硬件动作:指令格式决定控制信号的取值,数据通路决定这些信号作用于哪些部件。
  2. 存储层次(见第 5 章)解释了 MEM 段为何可能耗时多周期,I/O 中断机制(见第 6 章)与本章的异常处理共用同一套响应流程。
  3. 计算题的关键是分清“周期数”与“延迟”:吞吐率的提高来自重叠执行,单条指令的延迟并未因此缩短。