LAB 5
简述
经过 lab 4 的讨论,lab 5其实蛮简单的了,我们现在实现的 19 个指令除了 load 指令,都可以在执行期得到写回的数据,于是除了 load 都可以直接向译码级前递,而 load 在执行级时,若和译码级的指令发生写后读,则暂停一拍。
还有一个问题,如果译码级和多级都发生写后读,我们应该选取最新的值,即离此条指令最近的一次写后读进行前递,即需要一个具有优先级四选一选择器,选择是三条前递路径中的还是当前寄存器堆读出的。
现在目标就很明确了,让我们动笔吧。
开冲
回写级
寄存器号 5 bit,寄存器数据 32 bit,开一条 37 bit 的数据通路即可。
assign ws_to_ds_fwd = {37{ws_valid}} & {37{ws_gr_we}} & {ws_dest,ws_final_result};
访存级
和上面类似的。
assign ms_to_ds_fwd = {37{ms_valid}} & {37{ms_gr_we}} & {ms_dest,ms_final_result};
执行级
这里就需要向前传递寄存器号 5 bit,寄存器数据 32 bit,和 1 bit 的当前指令是否是 load 指令,借此控制译码级是否阻塞