在寄存器-寄存器型(R-R型)指令和寄存器-存储器型(R-S型)指令的执行过程中可能发生数据相关。看下面两条指令:
  k: OP R1, A2 ;R1=(R1) OP (A2)
  k+1: OP R1, R2 ;R1=(R1) OP (R2)
  如果发生:R1(k)=R1(k+1)称为R1数据相关。如果发生:R1(k)=R2(k+1)
称为R2数据相关
  发生数据相关的情况与寄存器本身的结构和所采用的控制时序等也有关系。解决数据相关的方法有如下几种:
  方法一,如果通用寄存器是用D型触发器构成的,而且在通用寄存器到运算器之间不设置缓冲寄存器或锁存器,则不会发生通用寄存器数据相关。如图8.21所示,因为D型触发器允许在同一节拍中实现寄存器之间的循环传送。
图8.21 一种典型的运算器结构

  实际上,在一个节拍中就可以完成从通用寄存器中通过两个多路选择分别读两个操作数到运算器,操作数在运算器完成运算,并把运算结果再写回到通用寄存器中。
  方法二,设置专用数据通路。在许多处理机中,由于把运算结果写到寄存器堆或写入主存储器需要的时间比较长,运算与写结果必须分为两个时钟周期,因此,在图8.21所示的数据通路中间需要加入锁存器或缓冲寄存器。
图8.22 设置专用数据通路解决通用寄存器数据相关

  由于在运算型指令中把运算结果写到通用寄存器中的指令很多,占运算型指令的大多数,发生通用寄存器数据相关的概率相当高;因此,在许多处理机中为了减少因为通用寄存器数据相关造成的速度损失,用硬件设置一条专用路径来解决这种数据相关。
  如图8.22所示,在运算器的输出端到锁存器的输入端之间建立一条专用的数据通路。当出现上述两种数据相关时,运算结果在送入通用寄存器堆的同时,还要通过这条专用的数据通路送回到运算器的锁存器中;当然,这时要封锁通用寄存器到锁存器的数据通路。这样,无论出现R1数据相关还是R2数据相关,只要在本条指令执行的末尾,把发生数据相关的操作数送到运算器的锁存器中,则下条指令不必再推后执行,就象没有发生数据相关时一样。