Appearance
数据通路与流水线:每一拍只问一件事——谁的输出接到了谁的输入(专题总纲)
Intro
这一类题的题面通常很吓人:一张画满方框和箭头的 CPU 内部结构图,旁边一堆写着 R1out、MARin、ALUop、MUX 的信号名。
但它问的东西非常窄。CPU 里只有三种部件:存东西的(寄存器、存储器)、算东西的(ALU、移位器)、选路的(三态门、多路选择器)。 而每一道题、每一小问,都在问同一件事:
这一拍,谁的输出被接到了谁的输入。
控制信号就是选路开关的状态。看懂这一点,那张图就不吓人了。
选路只有两种做法,认出是哪种,题就做了一半
| 做法 | 怎么选路 | 控制信号长什么样 |
|---|---|---|
| 单总线 | 所有部件挂同一条内总线,每个出口配一个三态门 | Xout(谁来驱动总线)、Xin(谁来接) |
| 多路选择器 | 每个输入端前面放一个 MUX,从几个来源里挑一个 | XSrc(这个端口这一拍取第几路) |
题面给的图里,如果某个方框有多条线进来、只有一条线出去,那八成就是 MUX。
单总线的一切设计,都从一句话推出来
一条总线,一拍只能跑一份数据。
这句约束单独看平平无奇,但整张图上那些"多余"的部件全是它逼出来的:
- ALU 要两个操作数,一拍只能送来一个 → 必须先用一个暂存器把第一个接住(图上常叫
A、T或Y),第二个再上总线,两个凑齐才能算。 - ALU 算完的瞬间,总线可能正被别人占着 → 结果不能直接扔上总线,得先进另一个暂存器(常叫
Z或AC)等着。 - 好几个部件都想往总线上送 → 每个出口配一个三态门,靠
Xout决定这一拍谁开、其余全关。
真题里「为什么要设置暂存器 Y / Z」这一问,标准答案就是上面这两条,一字不差。
拍数怎么数
由这句约束直接得到一个非常实用的推论:
这条指令要几拍 = 它要往总线上送几趟。
一趟一拍,数清楚就行。别去背「取指几拍、执行几拍」,那是结论不是方法。
⚠️ 一个限定:访存那一趟按题面给的存储周期算,不一定是 1 拍。 有的年份会写「从发出读命令到数据送进 MDR 需 5 个时钟周期」,那么取指就是 1(送地址)+ 5(等主存)+ 1(送 IR)= 7 拍,而不是 3 拍。数「趟」之前先看题面有没有给访存周期。
控制信号要几位
和指令字段划分是同一个动作:⌈log₂(这个信号要区分多少种情况)⌉。ALU 支持 7 种操作就是 3 位,移位器支持 3 种就是 2 位,立即数扩展只有零扩展和符号扩展两种就是 1 位。
流水线:把这些拍错开摆
流水线就是把这几拍错开摆:一条指令的取指、译码、执行、访存、写回,和相邻指令的拍交错排列,让不同的部件在同一时刻服务不同的指令。
所以流水线的全部问题也就一句话:错开之后,后面那条指令要用的东西,前面那条还没准备好。 冲突只有三种:
- 结构冲突:同一个部件被两条指令在同一拍抢;
- 数据冲突:要读的寄存器,前面那条还没写回。408 考的是按序发射、按序完成的五段流水线,这种结构下只会出现「写后读」(RAW)这一种;
- 控制冲突:转移指令还没算出结果,不知道下一条该取谁。
无阻塞时总周期数是
阻塞会连锁,这是最容易漏的一点:前一条卡在译码段出不去,后一条连取指都进不来——它前面的段被占住了。真题就考过这个连锁。
怎么下笔:先认部件,再逐拍列表
- 先认部件:图上哪些是存的、哪些是算的、哪些是选路的;选路用的是总线还是 MUX。
- 逐拍列表,一行一拍,两列:这一拍谁 out、谁 in。别在脑子里过,这类题的失分几乎全来自漏了某一拍。
- 信号位宽单独算:⌈log₂(种类数)⌉。
必错点:取指也占拍,PC 也是在那几拍里加的
写执行阶段写得很顺,一回头发现取指忘了写——这是最常见的丢分。取指本身要占拍、要访存,而且 PC 增量通常也在取指那几拍里完成。
但它具体怎么加,要看图,这一点不能想当然:
- 2026 年那张图走 ALU——一个输入端接 PC、另一个端接常数 2,题面明写「要求取指令周期完成 PC 增量」;
- 2009 年那张图有独立的
PC+1控制信号,不经 ALU,和访存那一拍并行完成; - 2015 年那道题的通行答案还专门解释:用 MUX 送常数 2 是「PC 自增的硬件捷径,不必让 ALU 跑一次」,省下一拍。
所以先在图上找 PC 的增量通路,再决定这几拍怎么写。
一条指令的答卷长什么样
这一类题的卷面格式是固定的——一行一拍,左边写微操作,右边写这一拍有效的控制信号。 下面这一版取自 2009 年那道题(该年的取指四拍是题面直接给的):
C1 MAR ← (PC) PCout, MARin
C2 MDR ← M(MAR) PC ← (PC)+1 MemR, MDRinE, PC+1
C3 IR ← (MDR) MDRout, IRin
C4 指令译码 无C2 那一行的 PC+1 千万别漏——这张图上 PC 有独立的加 1 通路,增量和访存在同一拍完成。 (换一张图就换一种画法:2026 年那道走 ALU,2015 年那道用 MUX 送常数当捷径。先看图,别背。)
执行阶段以「把 R0 加到 (R1) 指向的主存单元」为例,接着往下写:
C5 MAR ← (R1) R1out, MARin
C6 MDR ← M(MAR) MemR, MDRinE
C7 A ← (MDR) MDRout, Ain ← 暂存器接住第一个操作数
C8 AC ← (A) + (R0) R0out, Add, ACin ← 第二个操作数这一拍才上总线
C9 MDR ← (AC) ACout, MDRin
C10 M(MAR) ← (MDR) MDRoutE, MemW ← 写回也要开输出使能,光给 MemW 数据上不了总线C7、C8 两拍分开,正是「一条总线一拍只跑一份数据」的直接后果——看懂这两拍,暂存器为什么存在就不用背了。
⚠️ 两个容易漏的地方:MDRin 与 MDRinE 不是一回事(前者从内总线打入、后者从数据总线打入),写颠倒要扣分; 以及取指的拍数会随题面变——若题面写「从发出读命令到数据送进 MDR 需 5 个周期」,C2 就要展开成 5 拍, 取指一共 7 拍。这张表是格式模板,不是拍数答案。
真题的两种形态
第一组 · 单总线逐拍——给一条指令,写出它执行阶段的微操作序列和每一拍的有效控制信号;或者反过来,问某个暂存器、某个三态门为什么必须存在、某个控制信号至少要几位。
第二组 · 流水线——画时空图、判哪几条指令会阻塞、算总周期数。这一组常常和指令格式合考:先让你算出编址单位和相对寻址的目标地址,再问流水线的事。
(顺带一提:加速比和吞吐率这两个量,18 年大题里一次都没直接问过——它们在选择题里出现。大题问的是周期数和哪几条会停。)
交卷前扫一眼
先认部件(总线还是 MUX)· 逐拍两列写「谁 out、谁 in」· 别漏取指那几拍与 PC 增量 · 信号位宽 = ⌈log₂(种类数)⌉
配套内容
逐题精讲(建设中)——真题作答与 AI 判分入口见站内大题专题。
基础没打牢的,先回这几篇:
考纲要求、但这 7 道真题没有正面考过的(专题的巩固栏里配了题):
- 转发(旁路)技术——真题只考过「不转发要停几拍」,没正面考过加了转发之后停几拍
- 流水线不缩短单条指令的延迟,只提高吞吐率——段间寄存器开销
会让单条指令反而更慢