我不确定以下属性如何影响5阶段MIPS设计(IF,ID,EX,MEM,WB)的管道执行。我只需要清理一下。
当我们读取/写入mem时,1个内存端口是否意味着我们无法获取或写入(即lw上的MEM阶段,sw无法进入IF或其他MEM)? 如果没有转发,这意味着指令不会进入ID阶段,直到WB阶段之后或之前,它依赖于前一条指令? Idk分支摊位意味着什么
答案 0 :(得分:2)
一个常见的假设是你可以写一个周期的上半部分,读取一个周期的后半部分。
让我们说 I1 是你的第一条指令而 I2 是你的第二条指令,而 I2 正在使用 I1 < / strong>正在修改。
只有1个内存端口。 这意味着您无法在管道的两个不同阶段同时读取或写入内存。 例如,如果 I1 处于 MEM 阶段,则另一条指令不能处于 IF 阶段时间,因为两者都需要内存访问。
无数据转发。数据转发反映了在 I 的 EX 阶段结束时,您转发了数据到 ID 周期 I2 。 因此,无转发意味着管道必须等待 I1 的 WB 阶段转到 ID I2 的阶段。通过假设,您可以与上一条指令的 WB 阶段同时进入 ID 阶段,因为 WB 会写入内存在周期的前半段, ID 将在周期的后半段从内存中读取。
分支停止直到EX阶段结束。这是一种常见的假设,不使用分支预测技术。它只是说明分支后的指令必须等到EX阶段的结束才能启动 ID 阶段。回想一下,只有在分支指令的 EX 阶段才知道要执行的下一条指令的地址。
答案 1 :(得分:0)
注释:IF和MEM访问内存的不同部分。一个是数据存储器(.data
),另一个是指令存储器(.code
或.text
)。通过这种方式进行设计,以便在IF和MEM期间访问内存不会引起结构性停顿。
.data
使用的区域就是堆栈使用的区域,而堆栈通常位于.data
扇区的“末端”。这就是为什么如果在将数据保存到堆栈之前不从堆栈指针地址中减去,则会有覆盖程序代码的风险。由于MIPS允许您手动指定堆栈地址,因此有些人选择将堆栈放在末尾之前,以免出现问题,如果他们知道自己将有空间并且不会覆盖MEM中的变量。例如,将堆栈放置在WinMIPS64中的0x300而不是0x400处。我不确定这是否是好的做法。但是我听说有人这样做。