答:当一条指令修改后面指令会用到的信息时,就有可能出现数据冒险。可能修改的信息包括:寄存器、条件码、存储单元、程序计数器。
(1)寄存器:因为寄存器读口和寄存器写口被看成两个不同的功能单元,寄存器读口在译码/取数阶段被使用,寄存器写口在最后的回写阶段被使用,因而有可能发生前面指令写入新值之前后面指令就已经读出其内容的情况,这就发生了数据冒险。
(2)条件码:前面的运算类指令可能修改条件码,后面的分支指令根据条件码进行分支转移。一般情况下,在后面的分支指令进行条件测试时,前面运算类指令已经把新的条件码写到程序状态字寄存器了。所以,不会发生数据冒险。
(3)存储单元:因为规定同一个部件在一条指令执行过程中只能用一次,并且总是在同一个流水段使用,即:数据存储器的读和写都发生访存流水段,因而,到后面指令读一个内存单元时,前面写数据的指令肯定已经完成写操作了。所以,不会发生数据冒险。
(4)程序计数器:正常情况下PC的值按顺序增量,但在执行转移类指令时,PC的值由指令给出。当取下一条指令时,上一条转移类指令已经把新的PC值写到PC中,则不会发生冒险,否则发生控制冒险。 |