流水线的数据冲突分为三类:WAR,RAW,WAW
https://wenku.baidu.com/view/e066926d48d7c1c708a14508.html
- WAR: write after read 相关性,又称先读后写相关性。比如下面的指令序列,第一条指令会读取x4,第二条指令会写x4。在流水线中,如果第二条指令比第一条指令先写x4,则第一条指令就会读出错误的值。
add x5, x4,x6
add x4, x3, x2
- WAW: write after write 相关性,又称先写后写相关性。比如下面的指令序列,两条指令都会写x5。在流水线中,如果第二条指令比第一条指令先写x5,就会引起逻辑错误。
add x5, x4,x6
add x5, x3, x2
- RAW:read after write相关性,又称先写后读相关性。比如下面指令序列,如果第二条指令,在第一条指令读取x4之前,第二条指令先写x4,就会引起逻辑错误。
add x5, x4,x6
add x4, x5, x2
由于蜂鸟E200系列是按序派遣,按顺序写回的微架构,在指令派遣时候就已经从通用寄存器数组中读取了源操作数。后续执行的指令写回regfile的操作不可能影响到前面指令的读取,所以不可能发生WAR相关性造成的数据冲突。
正在派遣的指令处在流水线的第二级,假设之前派遣的指令是单周期指令,则前序指令肯定已经完成了执行且将结果写回了Regfile。因此正在派遣的指令不可能会发生RAW数据冲突。但是假设之前派遣的指令是多周期指令,由于指令需要多个周期才能写回结果。因此正在派遣的指令可能会产生于前序相关的RAW相关性。
正在派遣的指令处在流水线的第二级,假设之前派遣的指令是单周期指令,则前序指令肯定已经完成了执行且将结果写回了Regfile。因此正在派遣的指令不可能会发生WAW数据冲突。但是假设之前派遣的指令是多周期指令,由于指令需要多个周期才能写回结果。因此正在派遣的指令可能会产生于前序相关的WAW相关性。