【分析解答】

第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照

# 【分析解答】

(1) 因为 PC 的增量是 2,且每条指令占 2 字节,所以编址单位是字节。
(2) 根据“大于”条件判断表达式,可以看出该 bgt 指令实现的是带符号整数比较。因为无符号数比较时,其判断表达式中没有溢出标志 OF。偏移地址 Imm8 为补码表示,说明跳转目标指令可能在 bgt 指令之前,也可能在 bgt 指令之后。计算跳转目标地址时,偏移量为  $\mathrm{Imm8} \times 2$ ,说明 Imm8 不是相对地址,而是相对指令条数。Imm8 的范围为  $-128 \sim 127$ ,故跳转目标地址的范围是  $\mathrm{PC} + 2 + (-128 \times 2) \sim \mathrm{PC} + 2 + 127 \times 2$ ,即跳转目标地址的范围是相对于 bgt 指令的前 254 个单元至后 256 个单元之间,用指令条数来衡量的话,就是相对于 bgt 指令的前 127 条指令至后 128 条指令之间。
(3) 实现 bgt 指令的数据通路如图 5.12 所示。

图5.12 bgt指令的数据通路

7. 如果图 5.4 给出的单周期数据通路对应的控制逻辑发生错误,使得控制信号 RegWr、RegDst、Branch、MemWr、ExtOp 中某一个在任何情况下总是为 0,则该控制信号为 0 时哪些指令不能正确执行?要求分别对每个控制信号进行讨论。

# 【分析解答】

若  $\mathrm{RegWr} = 0$ ,则所有需写结果到寄存器的指令(如 R-型指令、Load 类指令等)都不能正确执行,因为寄存器不发生写操作。

若  $\mathrm{RegDst} = 0$ ,则所有 R-型指令都不能正确执行,因为目的寄存器指定为 Rt 而不是 Rd。

若  $\mathrm{Branch} = 0$ ,则 Branch 类指令可能出错,因为永远不会发生跳转。

若  $\mathrm{MemWr} = 0$ ,则 Store 类指令不能正确执行,因为存储器不能写入所需数据。

若  $\mathrm{ExtOp} = 0$ ,则需要符号扩展的指令(如  $\mathrm{beq}$ 、  $\mathrm{lw / sw}$  等)发生错误,因为进行的是 0 扩展。

8. 如果图 5.4 给出的单周期数据通路对应的控制逻辑发生错误,使得控制信号 RegWr、RegDst、Branch、MemWr、ExtOp 中某一个在任何情况下总是为 1,则该控制信号为 1 时哪些指令不能正确执行?要求分别对每个控制信号进行讨论。

# 【分析解答】

若  $\mathrm{RegWr} = 1$ ,则所有不需写结果到寄存器的指令(如 sw、beq)都不能正确执行,因为


<!-- page: 147 -->

可能错误地将某个值写入了某个寄存器。

若 $\mathrm{RegDst} = 1$,则 $1\mathrm{w}$ 等部分 I-型指令不能正确执行,因为目的寄存器指定为 Rd 而不是 Rt。

若 $\mathrm{Branch} = 1$,则非 $\mathrm{Branch}$ 类指令可能出错,因为可能会发生不必要的跳转。

若 $\mathrm{MemWr} = 1$,则除 Store 类指令外其他指令都不能正确执行,因为会写入数据到存储器。

若 $\mathrm{ExtOp} = 1$,则需要零扩展的指令(如 ori)会发生错误,因为进行的是符号扩展。

9. 如果图 5.6 给出的多周期数据通路对应的控制逻辑发生错误,使得控制信号 PCWr、IRWr、RegWr、BrWr、PCSource、MemWr、MemtoReg、PCWrCond、R-type 中某一个在任何情况下总是为 0,则该控制信号为 0 时哪些指令不能正确执行?要求分别对每个控制信号进行讨论。

## 【分析解答】

若 $\mathrm{PCWr} = 0$,则所有指令都不能正确执行,因为无法正确地更新 PC。

若 $\mathrm{IRWr} = 0$,则所有指令都不能正确执行,因为 IR 中不能写入当前指令,也就无法进行正确的指令译码,因此后续的指令执行过程都不正确。

若 $\mathrm{RegWr} = 0$,则所有需要写结果到寄存器的指令(如 R-型指令、$1\mathrm{w}$ 等部分 I-型指令)都不能正确执行,因为寄存器不发生写操作。

若 $\mathrm{PCSource} = 00$,则除 $j$ 指令之外的其他指令都不能正确得到下条指令地址。

若 $\mathrm{MemWr} = 0$,则所有 Store 类指令执行错误,因为数据不能写入存储器中。

若 $\mathrm{MemtoReg} = 0$,则所有 Load 类指令执行错误,因为写入寄存器的是 ALU 输出而不是读出的存储单元的内容。

若 $\mathrm{PCWrCond} = 0$,则 Branch 类指令执行可能出错,因为永远不会发生跳转。

若 R-type = 0,则所有 R-型指令的执行可能出错,因为控制信号 ALUctr 的取值不是来自对 R-型指令进行解释的 ALU 局部控制器。

10. 如果图 5.6 给出的多周期数据通路对应的控制逻辑发生错误,使得控制信号 PCWr、IRWr、RegWr、BrWr、PCSource、MemWr、MemtoReg、PCWrCond、R-type 中某一个在任何情况下总是为 1,则该控制信号为 1 时哪些指令不能正确执行?要求分别对每个控制信号进行讨论。

## 【分析解答】

若 $\mathrm{PCWr} = 1$,则程序执行顺序失控,因为每个时钟都会更新 PC。

若 $\mathrm{IRWr} = 1$,则所有指令都可能出错,因为每个时钟周期都会写入 IR,因此写入的不是当前指令。

若 $\mathrm{RegWr} = 1$,则所有不需写结果到寄存器的指令(如 sw、beq)都不能正确执行,因为错误地将某个值写入了某个寄存器。

若 $\mathrm{PCSource} = 01$,则 $j$ 指令和 Branch 类指令不能正确得到下条指令地址。

若 $\mathrm{MemWr} = 1$,则除 Store 类指令外的所有指令执行错误,因为在存储器写入了不该写的信息。

若 $\mathrm{MemtoReg} = 1$,则除 Load 类指令外的所有指令执行错误,因为选择了错误的信息写入寄存器。


<!-- page: 148 -->

若 PCWrCond = 1,则除 Branch 类指令外的所有指令可能出错,因为可能会发生不必要的跳转。

若 R-type = 1,则所有非 R-型指令的执行可能出错,因为控制信号 ALUctr 的取值来自对 R-型指令进行解释的 ALU 局部控制器。

11. swap 指令的功能是实现两个寄存器内容的互换。在 MIPS 指令集中增加一条 swap 指令有两种方式,一种是采用伪指令(软件)方式,这种情况下,当执行到 swap 指令时,用若干已有指令构成的指令序列来代替实现;另一种做法是改动硬件实现 swap 指令,这种情况下,当执行到 swap 指令时,则直接在 swap 指令对应的数据通路(硬件)上执行。

(1) 写出 MIPS 中用伪指令方式实现 "swap rs, rt" 时的指令序列。

(2) 假定用硬件实现 swap 指令时会使每条指令的执行时间增加 10%,则 swap 指令在程序中占多大的比例才值得用硬件方式来实现?

(3) 采用硬件方式实现时,在不对寄存器堆进行修改的情况下,能否在单周期数据通路中实现 swap 指令?对于多周期数据通路的情况又怎样?

【分析解答】

(1) 若在伪指令 "swap rs, rt" 的指令序列中使用除 rs 和 rt 以外的额外寄存器,则额外寄存器的内容会被指令序列破坏,因此,伪指令的指令序列中一般不能用额外寄存器。伪指令 "swap rs, rt" 的指令序列包含以下三条指令,没有用到额外寄存器。

xor rs, rs, rt
xor rt, rs, rt
xor rs, rs, rt
(2) 假定 "swap rs, rt" 指令所占比例为 $x(0 \leqslant x \leqslant 1)$,其他指令比例为 $1 - x$,则用硬件实现该指令时,程序执行时间为原来的 $1.1 \times (x + 1 - x) = 1.1$ 倍。用软件实现该指令时,程序执行时间为原来的 $3x + 1 - x = 2x + 1$ 倍。因此,当 $1.1 &lt; 2x + 1$ 时,硬件实现才有意义,由此可知,$x &gt; 0.05$,即当 "swap rs, rt" 指令在程序中的比例大于 $5\%$ 时,才值得用硬件方式来实现该指令。 (3) 在单周期数据通路中,所有指令的执行都在一个时钟周期内完成,数据总是在时钟边沿被写入寄存器堆,即本条指令执行的结果总是下条指令开始(即下个时钟到来)时,才开始被写到寄存器堆中,因此一个时钟周期只能写一次寄存器。而 swap 指令执行过程中需要多次写寄存器,在不对寄存器堆进行修改的情况下,无法在单周期数据通路中实现 swap 指令;对于多周期数据通路,一个指令周期可以有多个时钟周期,因而可以多次写寄存器,因此,在不对寄存器堆进行修改的情况下,swap 指令可以在多周期数据通路中实现。 12. 已知 MIPS 中有一条跳转指令 jr(jump register),其指令格式如下。 [tbl-31.md](tbl-31.md) jr 指令的功能是读出 rs 寄存器的内容送 PC。若使图 5.4 所示的单周期数据通路也能执行 jr 指令,则如何修改单周期数据通路?需要增加什么控制信号? 【分析解答】 jr 指令采用 R-型指令格式,其中的 rt 和 rd 字段都是 0,即 rt = rd = $0。因为 MIPS 处 <!-- page: 149 --> 理器中寄存器 $0 的内容永远是全 0,它可被读出,但不能改变其值,写入信号对寄存器 $0 不起作用,因而,可以把 jr 指令看作结果送 PC 的加法指令,其功能是:R[rd] ← R[rs] + R[rt],PC ← R[rs] + R[rt]。因此,原 R-Type 指令的数据通路不需要改动,而只要增加 ALU 结果送 PC 的数据通路,并对控制信号做相应修改即可。具体修改如下。 (1)PC 的输入端再增加一个来源——ALU 输出,因此,在 PC 输入端需再加一个多路选择器 MUX,原先的输入作为 MUX 其中的一个输入,另一个输入为 ALU 输出。 (2)增加一个控制信号 JReturn,用于对新加 MUX 进行控制,执行 jr 指令时,JReturn = 1,选择 ALU 输出送 PC;执行其他指令时,JReturn = 0,选择原来的输入值送 PC。 (3)ALU 控制器中增加 func = 001000B 时相应的译码输出,其输出控制信号取值为 ALUctr = add。 13. 假设 MIPS 指令系统中有一条 I-型带符号整数比较指令“bgt rs, rt, Imm16”,其功能为:若 R[rs] &gt; R[rt],则 PC = PC + 4 + Imm16 × 4;否则,PC = PC + 4。 若 ALU 能产生 ZF(零)、SF(符号)和 OF(溢出)三个标志的输出,请在图 5.6 所示的多周期数据通路中增加实现 bgt 指令的数据通路,并给出指令在执行周期中相应的控制信号取值。 ## 【分析解答】 比较指令需要对两个寄存器 rs 和 rt 中的内容做减法运算(用 ALU 中的加法器实现),ALU 根据运算结果得到 ZF、SF 和 OF 三个标志信息。在此,rs 和 rt 中的内容被看成带符号整数,因此,判断 R[rs] &gt; R[rt] 的条件表达式为 $\overrightarrow{ZF} \cdot (\overrightarrow{SF} \oplus \overrightarrow{OF})$。图 5.6 中的多周期数据通路已能支持 beq 指令的执行,而 beq 指令和 bgt 指令的目标转移地址是一样的,因此,只要在图 5.6 中原先 beq 指令的条件判断逻辑基础上增加 bgt 指令的条件判断逻辑即可,修改后的数据通路如图 5.13 所示,其中带阴影部分是修改或增加的数据通路。 在多周期数据通路中,bgt 指令与 beq 指令一样,都需要三个时钟周期,前两个时钟周期为取指周期和译码/取数周期,它们在所有指令的执行过程中都是一样的,第三个时钟周期为执行周期,在此周期中,各控制信号的取值:beq = PCWr = MemWr = IRWr = RegWr = BrWr = R-type = 0,bgt = ALUSelA = 1,ALUSelB = 00,ALUOp = sub,PCSource = 10,其余任意。 14. 已知 MIPS 中有一条 lui(load upper immediate)指令,其指令格式如下。 [tbl-32.md](tbl-32.md) lui 指令的功能是将立即数 Imm16 送到 rt 寄存器的高 16 位,低 16 位补 0。若使图 5.6 所示的多周期数据通路也能执行 lui 指令,则如何修改该多周期数据通路?需要增加什么控制信号?该指令对应的时钟周期数是多少?除取指周期和译码/取数周期外的其他周期中控制信号的取值是什么? ## 【分析解答】 lui 指令采用 I-型指令格式,rs = $0。因此,该指令的功能可以描述成 R[rt] ← R[$0] + Imm16 × 2^16。因此,只要在图 5.6 中对原扩展器稍加修改,然后借助 I-型运算类指令数据通 <!-- page: 150 --> 图 5.13 增加了 bgt 指令的多周期数据通路 路就可实现 lui 指令。具体修改如下。 (1)修改原扩展器,使其具有高位零扩展、高位符号扩展和低位零扩展三种扩展功能。 (2)控制信号 ExtOp 从原来的 1 位扩展为 2 位,用于控制扩展器进行三种扩展操作。可以定义 $\mathrm{ExtOp} = 01$ 时进行高位零扩展;$\mathrm{ExtOp} = 10$ 时进行高位符号扩展;$\mathrm{ExtOp} = 11$ 时进行低位零扩展。 lui 指令的执行过程同 I-型运算类指令,因此,与 ori 指令类似,其时钟周期数为 4。第三个时钟周期各控制信号取值:ALUSelA = 1,ALUSelB = 10,ALUOp = add,ExtOp = 11,MemtoReg = RegDst = RegWr = PCWr = PCWrCond = IRWr = MemWr = BrWr = R-type = 0,其余任意;第四个时钟周期各控制信号取值:ALUSelA = RegWr = 1,ALUSelB = 10,ALUOp = add,ExtOp = 11,MemtoReg = RegDst = PCWr = PCWrCond = IRWr = MemWr = BrWr = R-type = 0,其余任意。 15. 假定图 5.6 所示的多周期数据通路中寄存器堆只有一个读口和一个写口,若要完成和原数据通路相同的功能,则需要对图中原数据通路进行哪些修改?与之对应的有限状态机又如何修改?每条指令的时钟周期数有什么变化? 【分析解答】 如果图 5.6 所示的多周期数据通路中寄存器堆改成只有一个读口,那么,原来可以同时读数据到 A 寄存器和 B 寄存器,现在只能先读一个到 A,再读一个到 B。 <!-- page: 151 --> 由于 A 和 B 两个寄存器共用一个读地址端口,所以在读地址端口的输入端要加一个多路选择器及其控制信号 RegRead,用于选择读地址口是 rs 还是 rt。可以定义当 RegRead = 0 时读口地址为 rs,当 RegRead = 1 时读口地址为 rt。 由于只有一个读数据端口,该端口的数据可能被送到 A,也可能被送到 B,所以读数据端口的输出同时连到 A 和 B 的输入端,并增加一个控制信号 AWr,可以定义当 $A W r = 1$ 时将端口数据送 A,在 $A W r = 0$ 时将端口数据送 B。因此,在数据通路中,AWr 信号直接连到 A 的“写使能”线,而将 AWr 信号取反后连到 B 的“写使能”线。 由于每个时钟周期只能读取一个操作数,修改后的数据通路不能像原先的数据通路那样,在第二个周期(译码/取数周期)中同时读取 rs 和 rt,必须修改相应的有限状态机。可以有以下三种修改方式。 (1) 将原来的译码/取数周期再分成两个周期,分别读 rs 到 A 和读 rt 到 B,并在其中一个周期中投机完成转移目标地址计算。这样,每条指令的执行都多了一个时钟周期。 (2) 在原来的译码/取数周期中先读 rs 到 A,对于 R-型和 Branch 类指令,再增加一个周期来读 rt 到 B;对于其他不需用到 rt 内容的指令,则无须增加新的周期。这样,对于每个 R-型和 Branch 类指令的执行,都会多一个时钟周期,而其他指令的时钟周期数不变。 (3) 在原来的译码/取数周期中先读 rt 到 B,这样,对于 R-型指令、Branch 类指令、Load/Store 类指令和 Ori 指令等都要再增加一个周期用于读 rs 到 A。 显然,上述三种方式中,第(2)种做法得到的综合 CPI 最小。 16. 某高级语言源程序中的一个 while 语句为“while (save[i] == k) i += 1;”,若对其编译时,编译器将 i 和 k 分别分配在寄存器 $s3 和 $s5 中,数组 save 的基址存放在 $s6 中,则生成的 MIPS 汇编代码段如下。 [tbl-33.md](tbl-33.md) 假定如图 5.4 所示的单周期数据通路和如图 5.6 所示的多周期数据通路中各主要功能单元的操作时间是:存储器为 $200\mathrm{ps}$;ALU 和加法器为 $100\mathrm{ps}$;寄存器堆(读或写)为 $50\mathrm{ps}$。在不考虑多路选择器、控制单元、PC、扩展器和线路等延迟的情况下,单周期和多周期处理器的时钟周期至少各为多少?若上述程序段共循环执行 8 次,则在单周期数据通路和多周期数据通路中执行各需要多少纳秒? ## 【分析解答】 单周期处理器的时钟周期至少为 $200 + 50 + 100 + 200 + 50 = 600\mathrm{ps}$;多周期处理器的时钟周期至少为 $200\mathrm{ps}$。对于单周期数据通路中的 8 次循环执行,第 $1\sim 4$ 条指令执行了 8 次,第 $5\sim 6$ 条指令执行了 7 次,因此,共用了 $(4\times 8 + 2\times 7)\times 600 = 27600\mathrm{ps} = 27.6\mathrm{ns}$。对于多周期数据通路中的 8 次循环执行,sll、add 和 addi 指令都需要 4 个时钟周期,bne 和 j 指令需要 3 个时钟周期,lw 指令需要 5 个时钟周期,因此,一共用了 $(4 + 4 + 5 + 3)\times 8\times 200 + (4 +$ <!-- page: 152 --> 3) × 7 × 200 = 35400ps = 35.4ns。 17. 时钟周期和 CPI 这两个重要参数对处理器性能起非常关键的作用,因而,在处理器设计中需要对这两个参数进行权衡。有些设计者偏向以增大 CPI 为代价换取较高的主频,而另外一些设计者则偏向以较低主频换取 CPI 值的降低。在不同指导思想下设计出以下两种不同处理器 M1 和 M2。 M1:多周期处理器,数据通路结构类似图 5.6,所不同的是,它将写寄存器与存储器读或 ALU 计算合在同一个时钟周期内进行,主频为 300MHz。 M2:多周期处理器,数据通路结构类似 M1,所不同的是,它进一步将有效地址计算和存储器操作合在同一个时钟周期内进行,因而延长了一个节拍内的关键路径,主频降低为 250MHz。 已知基准程序 CPUint 2000 中各类指令的频率是:Load 为 25%,Store 为 10%,Branch 为 11%,Jump 为 2%,ALU 为 52%。以基准程序 CPUint 2000 为标准,比较两种不同处理器的性能,说明哪个处理器性能更好。找到一种指令序列组合,使得用它来评测时某个处理器性能明显比另一个高。 ## 【分析解答】 参考图 5.6 所对应的有限状态转换图 5.7,对 M1 和 M2 进行分析,得到结果:Load、Store、Branch、Jump 和 ALU 这 5 类指令在 M1 中的 CPI 分别为 4、4、3、3、3,在 M2 中的 CPI 分别为 3、3、3、3、3。因此,M1 和 M2 的综合 CPI 分别为 $$ \mathrm{CPI}(M1) = 25\% \times 4 + 10\% \times 4 + 11\% \times 3 + 2\% \times 3 + 52\% \times 3 = 3.35 $$ $$ \mathrm{CPI}(M2) = 25\% \times 3 + 10\% \times 3 + 11\% \times 3 + 2\% \times 3 + 52\% \times 3 = 3 $$ 因此,M1 和 M2 的 MIPS 数分别为 $$ \mathrm{MIPS}(M1) = 300 / 3.35 = 89.55 $$ $$ \mathrm{MIPS}(M2) = 250 / 3 = 83.33 $$ M1 和 M2 分别对图 5.6 所示的数据通路做了不同的改变,显然,M1 的做法效果更好。但当所有指令都是 Load/Store 指令时,M2 的 CPI 还是 3,但 M1 的 CPI 变为 4,其 MIPS 数为 300/4 = 75。显然,这种情况下 M2 的性能比 M1 高。 18. 对于多周期 MIPS 处理器,若将数据访问过程分成两个时钟周期,则可使时钟频率从 480MHz 提高到 560MHz,但会增加 lw 和 sw 指令的时钟周期数。已知基准程序 CPUint 2000 中各类指令的频率是:Load 为 25%,Store 为 10%,Branch 为 11%,Jump 为 2%,ALU 为 52%。若以基准程序 CPUint 2000 为标准,则时钟频率提高后处理器的性能提高了多少?若将取指令过程再分成两个时钟周期,则可进一步使时钟频率提高到 640MHz,此时,时钟频率的提高是否也能带来处理器性能的提高?为什么?