(12 分)现有 4 级流水线,分别完成取指、指令译码并取数、运算、回写四步操作。假设完成各部操作的时间依次为 100ns、100ns、80ns、50ns。请问:
(1)流水线的操作周期应设计为多少?
(2)若相邻两条指令如下,发生数据相关,而且在硬件上不采取措施,那么第 2 条指令要推迟多少时间进行?
(3)如果在硬件设计上加以改进,至少需要推迟多少时间?
[tag_link]
【解析】
(1) 流水线操作的时钟周期 t 应按四步操作中的最长时间来考虑,所以 t = 100 ns 。
(2) 两条指令在流水线中执行情况如下表所示: 指令 时钟 1 时钟 2 时钟 3 时钟 4 时钟 5 时钟 6 时钟 7 ADD 取指 指令译码并取数 运算 写回 SUB 取指 指令译码并取数 运算 写回 ADD 指令在时钟 4 时将结果写入寄存器堆 (R1),但 SUB 指令在时钟 3 时读寄存器堆 (R1)。本来 ADD 指令应先写入 R1,SUB 指令后读 R1,结果变成 SUB 指令先读 R1,ADD 指令后写 R1,因而发生两条指令间数据相关。如果硬件上不采取措施,第 2 条指令 SUB 至少应推迟 2 个操作时钟周期( 2 × 100 ns ),即将 SUB 指令中的指令译码并取数阶段推迟到 ADD 指令的写回阶段之后才能保证不会出错。如下表所示: 指令 时钟 1 时钟 2 时钟 3 时钟 4 时钟 5 时钟 6 时钟 7 ADD 取指 指令译码并取数 运算 写回 SUB 取指 指令译码并取数 运算 写回
(3) 如果硬件上加以改进,可只延迟 1 个操作时钟周期(100ns)。因为在 ADD 指令中,运算阶段就已经得到结果了,因此可以通过数据旁路技术在运算结果一得到的时候将结果快速送入寄存器 R1,而不需要等到写回阶段完成。流水线中执行情况如下图所示: 时钟 1 2 3 4 5 6 7 ADD 取指 指令译码并取数 运算(并采用数据旁路技术写入寄存器 R1) 写回 取指 SUB 取指 指令译码并取数 运算 写回