第11题
第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
## 第11题
处理器根据自身的时钟信号来对指令的执行进行定时,但是,并不是每来一个时钟信号就开始执行一条新的指令,例如,在多周期处理器中,一条指令的执行需要分解成多个阶段进行,每个阶段在一个时钟周期内完成一个特定的功能,每来一个时钟开始执行一个阶段性操作。因此,选项A的说法是错误的。
每来一个时钟开始进行阶段性操作,因此,必须确定时钟的哪一刻算开始,通常这个开始点或是时钟信号的上升沿或是下降沿,称为触发边沿。触发器或寄存器等状态元件总是在触发边沿开始改变状态。
为了保证每个阶段的操作都能在一个时钟周期内完成,时钟周期必须足够长,以保证数据在最长延迟的组合逻辑电路中能够传输完成。因此,时钟周期以相邻状态单元之间最长组合逻辑延迟为基准确定。
## 第12题
数据通路就是指令执行过程中数据流动所经过的路径及其路径上的部件,这些部件或者是组合逻辑元件或者是时序逻辑元件,前者称为操作元件,后者称为状态元件,因此,数据通路就是由若干操作元件和状态元件连接而成的。数据通路的功能由控制部件送出的控制信号决定。数据通路中一个重要的操作元件为ALU,用于执行各类算术和逻辑运算;另一个重要的元件为通用寄存器,属于状态元件。
综上所述,选项D中的说法是错误的。
## 第13题
取指令阶段是指令周期中的第一个阶段,主要完成从指令存储器中取出指令的功能。因此,取指令操作的时延主要由存储器的取数时间决定。
如果是定长指令字,那么指令长度是固定的,无须对指令译码即可确定指令长度,因此,在取指令的同时,可以对PC进行增量处理以计算出顺序执行时下条指令的地址。
对于单周期数据通路,一条指令执行的结果总是在下一个时钟周期开始时写入状态元件,而在指令执行过程中没有任何状态元件被写入信息,否则一个指令周期不可能在一个时钟周期内完成。选项C的意思是,在单周期处理器的指令周期中,取指令阶段需要先将指令取出后放在指令寄存器(是一种状态元件)中,然后再从指令寄存器中取出来执行,显然,这种说法是错误的。
PC在单周期数据通路中不需要“写使能”控制信号,因为单周期处理器中每个时钟周期等于一个指令周期,因此,每个时钟周期都要改变PC的值,从而无须“写使能”信息来区分何时需要写PC、何时无须写PC。
<!-- page: 139 -->
## 第14题
多周期数据通路中,每条指令的CPI可能不同,复杂指令的CPI比简单指令的CPI更大,而单周期数据通路中每条指令的CPI都是1,因此,比多周期处理器的CPI更小。可见,选项A的说法是错误的。
## 第15题
MIPS架构的R型指令的功能是,对两个通用寄存器中的内容进行相应的算术、逻辑运算等操作,其结果再保存到某个通用寄存器中。因此,其数据通路中一定会有一个具有读口和写口的通用寄存器组、一个ALU用于对寄存器读出数据进行运算,也一定存在一条路径使ALU输出被送到某个寄存器,通用寄存器堆的“写使能”控制信号一定为“1”,使得运算结果能写入某个通用寄存器。因此,选项D是正确的。
## 第16题
MIPS架构的lw/sw指令的功能是,将某寄存器和偏移量(16位立即数符号扩展成32位)相加的结果作为存储地址,lw指令将该地址中的内容取出,送到另一个寄存器中;sw指令则将另一个寄存器的内容存储到该地址中。因此,其数据通路中,一定有一个符号扩展部件用于偏移量的扩展,而且ALU的控制信号一定为“addu”(ALU做加法),寄存器堆的“写使能”信号在lw指令执行时为“1”,在sw指令执行时为“0”,数据存储器的“写使能”信号在lw指令执行时为“0”,在sw指令执行时为“1”。因此,选项D是正确的。
## 第17题
MIPS架构的beq指令的功能是,根据指令指定的两个寄存器内容是否相等(通过做减法来比较是否相等),确定是否跳转到指定的跳转目标地址执行。因此,其单周期数据通路设计中,ALU的两个输入都来自寄存器堆,ALU的控制信号一定为“subu”(即ALU做减法),并且一定有一个加法器用于计算跳转目标地址。因为跳转目标地址的计算需要将PC的内容和偏移量(16位立即数符号扩展为32位)相加,所以数据一定会流经符号扩展部件。因此,①、②、③的叙述是正确的,即正确选项为A。
## 第18题
根据题目的描述可知,取数load是最复杂的指令,在该单周期数据通路中,应该以load所用时间作为时钟周期。因此,在不考虑多路复用器、控制单元、PC、符号扩展单元和传输线路等延迟的情况下,该计算机时钟周期为取指令时间(3ns)+寄存器堆的读取时间(1ns)+ALU运算时间(2ns)+存储器取数时间(3ns)+寄存器堆写时间(1ns)=10ns。选项C是正确的。
## 5.6 分析应用题
1. 某计算机主频为 $800\mathrm{MHz}$,其CPU采用三级时序(机器周期—节拍—脉冲)进行定时,为单脉冲节拍方式,每个机器周期的基本宽度为4个节拍。该机每个指令周期平均有5个机器周期,并平均访问2次主存,采用非缓存(即无cache)访问。请回答下列问题:
(1) 若采用异步方式访问内存,每个“存储器读”机器周期平均需8个节拍,每个“存储器写”机器周期平均需6个节拍,则执行一条指令的平均时间为多少?MIPS数为多少?平均CPI为多少?
<!-- page: 140 -->
(2) 若采用同步方式访问内存,每个“存储器读”机器周期需在基本宽度的基础上再插入 4 个“等待”状态,每个“存储器写”机器周期无须“等待”状态,则执行一条指令的平均时间为多少?MIPS 数为多少?平均 CPI 为多少?(提示:一个“等待状态”即是一个节拍)
## 【分析解答】
早期的计算机中没有 cache,CPU 访存时,由于主存速度慢,无法像访问寄存器或 cache 那样能在一个节拍内存取好数据,因此,需要 CPU 等待若干节拍才能完成存储访问。因而“存储器读”和“存储器写”机器周期比基本的无访存操作机器周期长。
(1) CPU 和主存之间采用异步方式通信时,CPU 每次发送读或写命令后,便在随后的每个节拍内采样主存送来的“存储操作完成”(MFC)信号,以便在主存数据准备好时,到存储器数据寄存器(MDR)中取数据。由题意可知,在异步方式下,每条指令的平均时钟周期(节拍)数为 $(5 - 2)\times 4 + 2\times ((8 + 6) / 2) = 26$,所以 $\mathrm{CPI} = 26$。执行一条指令的平均时间为 $26\times 1 / (800\times 10^{6}\mathrm{Hz}) = 0.325\mathrm{ns}$。MIPS 数约为 $800 / 26 = 31$。
(2) CPU 和主存之间采用同步方式通信时,CPU 每次发送读或写命令后,便按照同步通信协议,等待一个固定长度的时间(若干节拍)后,到存储器数据寄存器(MDR)中取数据。由题意可知,在同步方式下,每条指令的平均时钟周期(节拍)数为 $(5 - 2)\times 4 + 2\times ((4 + 4 + 4) / 2) = 24$,所以 $\mathrm{CPI} = 24$。执行一条指令的平均时间为 $24\times 1 / (800\times 10^{6}\mathrm{Hz}) = 0.3\mathrm{ns}$。MIPS 数约为 $800 / 24 = 33$。
2. 某计算机字长 16 位,采用 16 位定长指令字结构,部分数据通路结构如图 5.8 所示。假设 MAR 的输出一直处于使能状态。加法指令“ADD (R1),R0”的功能为 $\mathrm{M}[\mathrm{R}[\mathrm{R}1]]\leftarrow \mathrm{M}[\mathrm{R}[\mathrm{R}1]] + \mathrm{R}[\mathrm{R}0]$。
图 5.8 题 2 中的数据通路
<!-- page: 141 -->
表 5.2 给出了上述指令取指和译码阶段每个节拍(时钟周期)的功能和有效控制信号,请按表中描述方式列出指令执行阶段每个节拍的功能和有效控制信号,并说明需要多少节拍。
表 5.2 题 2 中取指令阶段的控制信号
[tbl-28.md](tbl-28.md)
【分析解答】
加法指令“ADD (R1), R0”的执行阶段每个节拍的功能和控制信号如表 5.3 所示。
表 5.3 题 2 中指令执行阶段的控制信号
[tbl-29.md](tbl-29.md)
从表 5.3 可以看出,在 C6 节拍中同时进行了存储器读和寄存器之间传送,这样,该指令的执行阶段共有 5 个节拍。当然,也可将存储器读和寄存器之间传送操作安排在不同的节拍内进行,这样得到表 5.4。此时,执行阶段共有 6 个节拍。
表 5.4 题 2 中指令执行阶段的控制信号
[tbl-30.md](tbl-30.md)
3. 假定在如图 5.9 所示的单总线数据通路中,总线传输延迟和 ALU 运算时间分别是 20ps 和 200ps,寄存器建立时间为 10ps,寄存器保持时间为 5ps,寄存器的锁存延迟 (Clk-to-Q time) 为 4ps,控制信号的生成延迟 (Clk-to-signal time) 为 7ps,三态门接通时间为 3ps,则
<!-- page: 142 -->
图 5.9 单总线数据通路
从当前时钟到达开始算起,完成以下操作的最短时间是多少?各需要几个时钟周期?
(1) 将数据从一个寄存器传送到另一个寄存器。
(2) 将程序计数器 PC 加 1。
## 【分析解答】
图 5.9 所示的数据通路中,所有与内部总线相连的寄存器都有相应的 $\mathrm{R}_{\mathrm{in}}$ 和/或 $\mathrm{R}_{\mathrm{out}}$ 控制信号,以控制总线和寄存器之间的数据传送。总线和 ALU 输入端之间、Y 寄存器与 ALU 输入端之间都无须控制信号。ALU 输出与 Z 寄存器之间可以有控制信号 $\mathrm{Z}_{\mathrm{in}}$,也可以没有。若没有 $\mathrm{Z}_{\mathrm{in}}$,则每来一个时钟,ALU 的输出总是被写入 Z 寄存器。以下说明中,为了明显表示 ALU 输出送 Z 寄存器,假定有控制信号 $\mathrm{Z}_{\mathrm{in}}$。
图 5.10 给出了单总线数据通路中主要路径的定时。时钟边沿到达后,经过 Clk-to-Q time 的延时,寄存器中的内容被读出,同时,在指令译码器中的控制逻辑生成当前时钟周期内所需的控制信号,其延时为 Clk-to-signal time。随后,由生成的控制信号 Rious 接通三态门,并使寄存器数据在总线上传输。若当前时钟周期内不做 ALU 运算而是直接在寄存器之间传送,则总线上的数据在 $\mathrm{Rj}_{\mathrm{in}}$ 的控制下直接被送到目的寄存器 $\mathrm{Rj}$ 的输入端,在下一个时钟边沿到来之前,总线上的数据必须继续稳定一段寄存器建立时间,以使寄存器 $\mathrm{Rj}$ 的输入在这段建立时间内保持不变,如图 5.10(a) 所示;若当前时钟周期内有 ALU 运算,则还需 ALU 电路延时,最后 ALU 结果直接送 Z 寄存器,在下一个时钟边沿到来之前,ALU 的输出必须继续稳定一段寄存器建立时间,以使寄存器 Z 的输入在这段建立时间内保持不变,如图 5.10(b) 所示。
(1) 由图 5.10(a) 可知,寄存器之间进行传送的时间延迟至少为 $7 + 3 + 20 + 10 = 40 \mathrm{ps}$。在这个寄存器数据传送过程中,只需要在一个寄存器中保存信息,因此只需要一个时钟周期就可完成该操作。
(2) 将 PC 中的内容加 1 送 PC,被分解成以下两个过程:PC 加 1 送 Z、Z 送 PC。对于第一个过程,由图 5.10(b) 可知,其延迟至少为 $7 + 3 + 20 + 200 + 10 = 240 \mathrm{ps}$;第二个过程实现的是寄存器之间的传送,因此延迟至少为 40ps。因为在该操作过程中保存了两次信息,所以需要两个时钟周期才能完成该操作。
4. 假定某计算机字长 16 位,CPU 内部结构如图 5.9 所示,CPU 和存储器之间采用同步
<!-- page: 143 -->
(a)当前周期内不执行ALU运算
(b)当前周期内执行ALU运算
图5.10 单总线数据通路中主要路径的定时
方式通信,按字编址。采用定长指令字格式,指令由两个字组成,第一个字指明操作码和寻址方式,第二个字包含立即数Imml6。若一次存储访问所用时间为两个时钟周期(用read1和read2分别表示两个时钟周期内的操作控制信号),每次存储访问存取一个字,取指令阶段第二次访存将Imml6取到MDR中,请写出下列指令在执行阶段(不考虑取指令过程)的控制信号序列,并说明需要多少个时钟周期。
(1) 将 Imml6 加到寄存器 R1 中, 此时 Imml6 为立即操作数, 即 $\mathrm{R}[\mathrm{R}1] \leftarrow \mathrm{R}[\mathrm{R}1] + \mathrm{Imml6}$ 。
(2) 将存储单元 Imml6 中的内容加到寄存器 R1 中, 此时 Imml6 为直接地址, 即 $\mathrm{R}[\mathrm{R}1] \leftarrow \mathrm{R}[\mathrm{R}1] + \mathrm{M}[\mathrm{Imml6}]$ 。
(3) 将存储单元 Imml6 中的内容作为地址访问主存, 将读出的内容再作为地址访问主存, 然后将读出的内容加到寄存器 R1 中, 此时 Imml6 为间接地址, 即 $\mathrm{R}[\mathrm{R}1] \leftarrow \mathrm{R}[\mathrm{R}1] + \mathrm{M}[\mathrm{M}[\mathrm{Imml6}]]$ 。
## 【分析解答】
图5.9所示的数据通路中,所有与内部总线相连的寄存器都有相应的 $\mathbf{R}_{\mathrm{in}}$ 和/或 $\mathbf{R}_{\mathrm{out}}$ 控制信号,以控制总线和寄存器之间的数据传送。总线和ALU输入端之间、Y寄存器与ALU输入端之间都无须控制信号。ALU输出与Z寄存器之间可以有控制信号 $Z_{\mathrm{in}}$ ,也可以没有,
<!-- page: 144 -->
此时每来一个时钟,ALU的输出总是被写入Z寄存器。为了明显表示ALU输出送Z寄存器,这里假定有控制信号 $Z_{\mathrm{in}}$。
另外要说明的是,以下给出的是指令执行阶段的控制信号,因此,在执行阶段的开始,取指令阶段已经结束,此时指令的第二个字(Imml6)已经从存储器中取出并被存放在MDR中。
(1) 指令功能为 $\mathrm{R}[\mathrm{R}1] \leftarrow \mathrm{R}[\mathrm{R}1] + \mathrm{Imml6}$ 时,执行阶段不需要访存操作。因此,可用以下3个时钟周期完成。
$$
\begin{array}{l}
\mathrm{MDR}_{\text{out}}, Y_{\mathrm{in}} \\
\mathrm{R1}_{\text{out}}, \text{add}, Z_{\mathrm{in}} \\
Z_{\text{out}}, R1_{\mathrm{in}} \\
\end{array}
$$
(2) 指令功能为 $\mathrm{R}[\mathrm{R}1] \leftarrow \mathrm{R}[\mathrm{R}1] + \mathrm{M}[\mathrm{Imml6}]$ 时,执行阶段需要一次访存操作,因此,至少需要以下5个时钟周期。其中,$\mathrm{R1}_{\mathrm{out}}, \mathrm{Y}_{\mathrm{in}}$ 这两个控制信号可以与 Read1 控制信息同时送出,并在 Read2 操作阶段保持不变,也可以延迟到与 Read2 同时送出。
$$
\begin{array}{l}
\mathrm{MDR}_{\text{out}}, \mathrm{MAR}_{\text{in}} \\
\mathrm{Read1}, (\mathrm{R1}_{\text{out}}, Y_{\text{in}}) \\
\mathrm{Read2}, R1_{\text{out}}, Y_{\text{in}} \\
\mathrm{MDR}_{\text{out}}, \text{add}, Z_{\text{in}} \\
Z_{\text{out}}, R1_{\text{in}} \\
\end{array}
$$
(3) 指令功能为 $\mathrm{R}[\mathrm{R}1] \leftarrow \mathrm{R}[\mathrm{R}1] + \mathrm{M}[\mathrm{M}[\mathrm{Imml6}]]$ 时,执行阶段需要两次访存操作,因此,至少需要以下8个时钟周期。对 $\mathrm{R1}_{\mathrm{out}}, \mathrm{Y}_{\mathrm{in}}$ 这两个控制信号的处理同(2)中一样。
$$
\begin{array}{l}
\mathrm{MDR}_{\text{out}}, \mathrm{MAR}_{\text{in}} \\
\mathrm{Read1} \\
\mathrm{Read2} \\
\mathrm{MDR}_{\text{out}}, \mathrm{MAR}_{\text{in}} \\
\mathrm{Read1}, (\mathrm{R1}_{\text{out}}, Y_{\text{in}}) \\
\mathrm{Read2}, R1_{\text{out}}, Y_{\text{in}} \\
\mathrm{MDR}_{\text{out}}, \text{add}, Z_{\text{in}} \\
Z_{\text{out}}, R1_{\text{in}} \\
\end{array}
$$
5. 图 5.11 给出了某 CPU 内部结构的一部分,MAR 和 MDR 直接连到存储器总线(图中省略)。在两个总线之间的所有数据传送都需经过算术逻辑部件 ALU。ALU 的部分功能及其控制信号如下。
$$
\begin{array}{l}
\mathrm{MOV}_{a}: F = A; \quad \mathrm{MOV}_{b}: F = B; \\
a + 1: F = A + 1; \quad b + 1: F = B + 1 \\
a - 1: F = A - 1; \quad b - 1: F = B - 1 \\
\end{array}
$$
其中,A 和 B 是 ALU 的输入,F 是 ALU 的输出。假定调用指令 CALL 占两个字,第一个字是操作码,第二个字给出子程序的起始地址,返回地址保存在主存的栈中,用 SP(栈顶指针寄存器)指向栈顶,按字编址,每次按同步方式
图 5.11 题 5 图示
<!-- page: 145 -->
从主存读取一个字。请写出读取并执行CALL指令所要求的控制信号序列(提示:当前指令地址在PC中),并说明至少需要多少个时钟周期。
## 【分析解答】
因为采用同步方式读写内存,所以在read和write信号后不需加等待信号WMFC。CALL指令有两个字,按字编址,每次从主存读取一个字,因此,CALL指令需要读两次主存,一次是读取指令中的操作码,另一次是读取指令中给出的子程序首地址。其指令周期分为以下三个阶段。
(1)读取指令操作码:将PC的内容作为地址访问存储器,取出指令的操作码,送指令寄存器IR,同时 $\mathrm{PC} + 1$ 送PC,以指向指令的第二个字,至少需要3个时钟周期(节拍)。
$\mathrm{PC}_{\mathrm{out}}$ , MOVb, MARin
Read, b + 1, PCin
$\mathrm{MDR}_{\mathrm{out}}$ , MOVb, IRin
(2)取子程序首地址:将PC的内容作为地址,取出指令的第二个字(即子程序入口地址)送PC,以使下一个指令周期从子程序的第一条指令开始执行。同时,计算PC+1以得到返回地址,送Y寄存器,至少需要3个时钟周期。
$\mathrm{PC}_{\mathrm{out}}$ , MOVb, MARin
Read, b + 1, Yin
$\mathrm{MDR}_{\mathrm{out}}$ , MOVb, PCin
(3)保存返回地址至栈中:将临时保存在 Y 寄存器的返回地址送到栈顶保存,并自动调整栈顶指针。至少需要 3 个时钟周期。
$\mathrm{SP}_{\mathrm{out}}$ , MOVb, MARin
$\mathrm{Y}_{\mathrm{out}}$ , MOVb, MDRin
Write, $\mathrm{SP}_{\mathrm{out}}, \mathrm{b} - 1, \mathrm{SP}_{\mathrm{in}}$
显然,上述每个节拍中执行的操作所需要时间不等,其中,存储访问(read/write)时间最长,时钟周期以最长的存储访问时间为准,CALL指令的指令周期至少有9个时钟周期(节拍)。
如果将第一次 $\mathrm{PC} + 1$ 的结果送到Y寄存器,第二阶段以Y的内容作为地址访问主存,并继续对Y寄存器加1,结果送PC,则也能实现CALL指令的功能。这种方式下,也是9个时钟周期。
6. 某计算机字长16位,标志寄存器Flag中的ZF、SF和OF分别是零标志、符号标志和溢出标志,采用双字节定长指令字。假定bgt(大于零跳转)指令的第一字节指明操作码和寻址方式,第二字节为偏移地址Imm8,用补码表示。指令功能是:若($\mathrm{ZF} + (\mathrm{SF}\oplus \mathrm{OF}) = 0$),则 $\mathrm{PC} = \mathrm{PC} + 2 + \mathrm{Imm8}\times 2$;否则,$\mathrm{PC} = \mathrm{PC} + 2$。
请回答下列问题并完成相应任务。
(1)该计算机的编址单位是多少?
(2)bgt指令执行的是带符号整数比较,还是无符号整数比较?偏移地址Imm8的含义是什么?跳转目标地址的范围是什么?
(3)画出实现bgt指令的数据通路。
<!-- page: 146 -->