第 4 章家庭作业:4.58~4.59

第 4 章家庭作业:4.58~4.59

家庭作业 4.58(★★★)我们的流水线化的设计有点不太现实,因为寄存器文件有两个写端口,然而只有 popq 指令需要对寄存器文件同时进行两个写操作。因此,其他指令只使用一个写端口,共享这个端口来写 valEvalM。下面这个图是一个对写回逻辑的修改版,其中,我们将写回寄存器 ID(W_dstEW_dstM)合并成一个信号 w_dstE,同时也将写回值(W_valEW_valM)合并成一个信号 w_valE

家庭作业 4.58 修改后的写回逻辑

用 HCL 写执行这些合并的逻辑,如下所示:

## Set E port register ID
word w_dstE = [
    ## writing from valM
    W_dstM != RNONE : W_dstM;
    1 : W_dstE;
];

## Set E port value
word w_valE = [
    W_dstM != RNONE : W_valM;
    1 : W_valE;
];

对这些多路复用器的控制是由 dstE 确定的——当它表明有某个寄存器时,就选择端口 E 的值,否则就选择端口 M 的值。

在模拟模型中,我们可以禁止寄存器端口 M,如下面这段 HCL 代码所示:

## Disable register port M
## Set M port register ID
word w_dstM = RNONE;

## Set M port value
word w_valM = 0;

接下来的问题就是要设计处理 popq 的方法。一种方法是用控制逻辑动态地处理指令 popq rA,使之与下面两条指令序列有一样的效果:

iaddq $8,%rsp
mrmovq -8(%rsp),rA

(关于指令 iaddq 的描述,请参考练习题 4.3。)要注意两条指令的顺序,以保证 popq %rsp 能正确工作。要达到这个目的,可以让译码阶段的逻辑对上面列出的 popq 指令和 iaddq 指令一视同仁,除了它会预测下一个 PC 与当前 PC 相等以外。在下一个周期,再次取出了 popq 指令,但是指令代码变成了特殊的值 IPOP2。它会被当作一条特殊的指令来处理,行为与上面列出的 mrmovq 指令一样。

文件 pipe-lw.hcl 包含上面讲的修改过的写端口逻辑。它将常数 IPOP2 声明为十六进制值 E。还包括信号 f_icode 的定义,它产生流水线寄存器 D 的 icode 字段。可以修改这个定义,使得当第二次取出 popq 指令时,插入指令代码 IPOP2。这个 HCL 文件还包含信号 f_pc 的声明,也就是标号为 “Select PC” 的块(图 4-57)在取指阶段产生的程序计数器的值。

修改该文件中的控制逻辑,使之按照我们描述的方式来处理 popq 指令。可以参考实验资料获得如何为你的解答生成模拟器以及如何测试模拟器的指导。

家庭作业 4.59(★★)比较三个版本的冒泡排序的性能(家庭作业 4.47、4.48 和 4.49)。解释为什么一个版本的性能比其他两个的好。