Skip to content

数据通路与流水线:每一拍只问一件事——谁的输出接到了谁的输入(专题总纲)

Intro

这一类题的题面通常很吓人:一张画满方框和箭头的 CPU 内部结构图,旁边一堆写着 R1outMARinALUopMUX 的信号名。

但它问的东西非常窄。CPU 里只有三种部件:存东西的(寄存器、存储器)、算东西的(ALU、移位器)、选路的(三态门、多路选择器)。 而每一道题、每一小问,都在问同一件事:

这一拍,谁的输出被接到了谁的输入。

控制信号就是选路开关的状态。看懂这一点,那张图就不吓人了。

选路只有两种做法,认出是哪种,题就做了一半

做法怎么选路控制信号长什么样
单总线所有部件挂同一条内总线,每个出口配一个三态门Xout(谁来驱动总线)、Xin(谁来接)
多路选择器每个输入端前面放一个 MUX,从几个来源里挑一个XSrc(这个端口这一拍取第几路)

题面给的图里,如果某个方框有多条线进来、只有一条线出去,那八成就是 MUX。

单总线的一切设计,都从一句话推出来

一条总线,一拍只能跑一份数据。

这句约束单独看平平无奇,但整张图上那些"多余"的部件全是它逼出来的:

  • ALU 要两个操作数,一拍只能送来一个 → 必须先用一个暂存器把第一个接住(图上常叫 ATY),第二个再上总线,两个凑齐才能算。
  • ALU 算完的瞬间,总线可能正被别人占着 → 结果不能直接扔上总线,得先进另一个暂存器(常叫 ZAC)等着。
  • 好几个部件都想往总线上送 → 每个出口配一个三态门,靠 Xout 决定这一拍谁开、其余全关。

真题里「为什么要设置暂存器 Y / Z」这一问,标准答案就是上面这两条,一字不差。

拍数怎么数

由这句约束直接得到一个非常实用的推论:

这条指令要几拍 = 它要往总线上送几趟。

一趟一拍,数清楚就行。别去背「取指几拍、执行几拍」,那是结论不是方法。

⚠️ 一个限定:访存那一趟按题面给的存储周期算,不一定是 1 拍。 有的年份会写「从发出读命令到数据送进 MDR 需 5 个时钟周期」,那么取指就是 1(送地址)+ 5(等主存)+ 1(送 IR)= 7 拍,而不是 3 拍。数「趟」之前先看题面有没有给访存周期。

控制信号要几位

和指令字段划分是同一个动作:⌈log₂(这个信号要区分多少种情况)⌉。ALU 支持 7 种操作就是 3 位,移位器支持 3 种就是 2 位,立即数扩展只有零扩展和符号扩展两种就是 1 位。

流水线:把这些拍错开摆

流水线就是把这几拍错开摆:一条指令的取指、译码、执行、访存、写回,和相邻指令的拍交错排列,让不同的部件在同一时刻服务不同的指令。

所以流水线的全部问题也就一句话:错开之后,后面那条指令要用的东西,前面那条还没准备好。 冲突只有三种:

  • 结构冲突:同一个部件被两条指令在同一拍抢;
  • 数据冲突:要读的寄存器,前面那条还没写回。408 考的是按序发射、按序完成的五段流水线,这种结构下只会出现「写后读」(RAW)这一种;
  • 控制冲突:转移指令还没算出结果,不知道下一条该取谁。

无阻塞时总周期数是 n+k1n 条指令、k 段),有阻塞就在这个基线上加 stall。

阻塞会连锁,这是最容易漏的一点:前一条卡在译码段出不去,后一条连取指都进不来——它前面的段被占住了。真题就考过这个连锁。

怎么下笔:先认部件,再逐拍列表

  1. 先认部件:图上哪些是存的、哪些是算的、哪些是选路的;选路用的是总线还是 MUX。
  2. 逐拍列表,一行一拍,两列:这一拍谁 out、谁 in。别在脑子里过,这类题的失分几乎全来自漏了某一拍。
  3. 信号位宽单独算:⌈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 两拍分开,正是「一条总线一拍只跑一份数据」的直接后果——看懂这两拍,暂存器为什么存在就不用背了

⚠️ 两个容易漏的地方:MDRinMDRinE 不是一回事(前者从内总线打入、后者从数据总线打入),写颠倒要扣分; 以及取指的拍数会随题面变——若题面写「从发出读命令到数据送进 MDR 需 5 个周期」,C2 就要展开成 5 拍, 取指一共 7 拍。这张表是格式模板,不是拍数答案。

真题的两种形态

第一组 · 单总线逐拍——给一条指令,写出它执行阶段的微操作序列和每一拍的有效控制信号;或者反过来,问某个暂存器、某个三态门为什么必须存在、某个控制信号至少要几位。

第二组 · 流水线——画时空图、判哪几条指令会阻塞、算总周期数。这一组常常和指令格式合考:先让你算出编址单位和相对寻址的目标地址,再问流水线的事。

(顺带一提:加速比和吞吐率这两个量,18 年大题里一次都没直接问过——它们在选择题里出现。大题问的是周期数和哪几条会停。)

交卷前扫一眼

先认部件(总线还是 MUX)· 逐拍两列写「谁 out、谁 in」· 别漏取指那几拍与 PC 增量 · 信号位宽 = ⌈log₂(种类数)⌉

配套内容

逐题精讲(建设中)——真题作答与 AI 判分入口见站内大题专题

基础没打牢的,先回这几篇:

考纲要求、但这 7 道真题没有正面考过的(专题的巩固栏里配了题):

  • 转发(旁路)技术——真题只考过「不转发要停几拍」,没正面考过加了转发之后停几拍
  • 流水线不缩短单条指令的延迟,只提高吞吐率——段间寄存器开销 d 会让单条指令反而更慢

真题练习