我正在尝试了解 MIPS 管道内衬以及与之相关的危害。我无法想象MIPS 指令中的结构性危险是什么样的。
我已经读到这是两个(或更多)指令需要同时使用给定硬件资源的情况。而且我之前已经看到过以时钟周期显示的示例。但是谁能提供一个简单的 MIPS 指令集示例供我查看?我很难在网上找到一个。只需查看大量有关数据危害的示例,这不是我想要的。谢谢!
我正在尝试了解 MIPS 管道内衬以及与之相关的危害。我无法想象MIPS 指令中的结构性危险是什么样的。
我已经读到这是两个(或更多)指令需要同时使用给定硬件资源的情况。而且我之前已经看到过以时钟周期显示的示例。但是谁能提供一个简单的 MIPS 指令集示例供我查看?我很难在网上找到一个。只需查看大量有关数据危害的示例,这不是我想要的。谢谢!
你很难遇到这个问题,因为它通常在硬件架构中解决......
这里有两个例子:
假设在阶段 5 (WB) 期间对寄存器文件 (RF) 进行了写入,同时在阶段 2 (ID) 上对 RF 上的同一寄存器进行了读取。这是一个结构性风险,因为两条指令试图在相同的时钟周期访问相同的资源(将读取什么值?)。这可以解决(在硬件中),例如,通过将 RF 访问分成两个时钟相位,在 HIGH 上写入并在 LOW 上读取。此外,如果您考虑一下,结构性风险就是为什么 RF 中有单独的 2 个读端口和 1 个写端口。
假设正在从内存中获取一条指令(阶段 1,IF),并且在阶段 4 (MEM) 上对内存进行了另一次读/写。同样,在同一周期访问相同的资源。这是通过分离数据和指令存储器(哈佛体系结构)来解决的。这对您来说可能很明显,但您可以查找普林斯顿建筑并查看统一记忆的示例。
因此,如果我们以第一个示例为例:任何带有加载(lw)命令的指令集到与在其他两条指令之后的 R 类型命令(如 add)相同的寄存器中都可以解决问题:
lw $8, 100($9)
add $10, $11, $12
add $10, $11, $12
add $10, $8, $12
希望有帮助。
这可能有效,但我不是 MIPS 的大佬:
add $t0, $t1, $t2
sw $t3, 0($t4)
sub $t5, $t6, $t7
sub $t8, $t9, $t0
sw $t0, 0($s0)