我正在阅读计算机组织和设计中的第 4.7 节:关于数据转发的硬件/软件接口。在书中给出的示例中,有寄存器文件转发。(这正是它在书中示例中出现的方式)
为什么需要注册文件转发?寄存器中的数据在时钟的前半部分写入,在时钟的后半部分读取,所以不转发应该是安全的。
只是为了澄清上面链接中给出的示例:左侧阴影Reg
意味着它被写入,右侧 - 被读取。
谢谢 !
我正在阅读计算机组织和设计中的第 4.7 节:关于数据转发的硬件/软件接口。在书中给出的示例中,有寄存器文件转发。(这正是它在书中示例中出现的方式)
为什么需要注册文件转发?寄存器中的数据在时钟的前半部分写入,在时钟的后半部分读取,所以不转发应该是安全的。
只是为了澄清上面链接中给出的示例:左侧阴影Reg
意味着它被写入,右侧 - 被读取。
谢谢 !
您需要注册文件转发以防止停顿。
如果仔细观察,第二条指令 ( and $12, $2, $5
) 需要使用 register $2
,但在前一条指令 ( sub $2, $1, $3
) 中计算的值将在时钟周期 5 中写回到寄存器文件中。因此,如果不是因为寄存器文件转发,第二条指令必须停止,直到寄存器$2
被写回。转发在指令 1 的 ALU 运算结果和指令 2 的 ALU 运算的第一个参数之间用一条天蓝色线表示。
同样,第三条指令 ( or $13, $6, $2
) 也需要使用 $2 才能被第一条指令实际写回寄存器文件。因此,再次,为了防止停顿,寄存器转发用于使用第一条指令的结果作为第三条指令的参数。
另一方面,第四条指令add $14, $2, $2
(操作说明。
由于接受的答案实际上并没有回答手头的问题,我会在这里尝试一下。如果您的设计在前半部分写入数据并在后半部分读取数据,那么您就不会有问题。但是,实际的“寄存器”将在时钟的正沿写入数据,因此上述情况不正确。在两条指令读写同一个寄存器的情况下,数据必须在同一个周期内从寄存器文件的写输入转发到读输出。