发射过程中的流水线

  • 非数据捕捉结构的流水线
    • 此种数据结构中,issue queue中的指令,要被FU执行,需要等到一下几个条件都成立:
      • 这条指令所有的源操作数都准备好了;
      • 这条指令能够从发射队列中被选中,即需要经过仲裁电路的允许才能够进行发射;
      • 需要能够从寄存器、payload RAM或者旁路网络(bypassing network)中获得源操作数的值。
    • 这三个条件是顺序发生的;
    • wakeup: 源寄存器从没有准备好的状态,变成准备好的状态;
      • 实现方式:通过bypass网络,或者PRF, 通知IQ中的每个源寄存器;发射过程中的流水线_第1张图片
      • 发射过程,最典型的流水线划分,就是wakeup和select;
    • wakeup的提前 
      • 通过处理器中的旁路网络(bypassing network),能够使唤醒的过程提前。发射过程中的流水线_第2张图片
      • 当指令 B 到达执行阶段(execute)的时候,可以从旁路网络中得到指令A 的结果,此时指令B就可以顺利地进入到FU中执行了;
      • 发射过程中的流水线_第3张图片
      • 需要注意的是上述的这个过程,是在一个周期之内先使用仲裁电路从发射队列中选择出一条合适的指令(这是仲裁阶段的工作),然后再将发射队列中相关的寄存器置为准备好的状态(这是唤醒阶段的工作),这里是有先后顺序的;
      • 即:selcet和wakeup组成了一个原子操作;
      • 如果分成两个周期,则:
      • 发射过程中的流水线_第4张图片
      • 在一般的指令集中,不同的指令需要的执行周期数是不一样的,普通的加减法、逻辑运算等比较简单的操作,需要一个周期就可以了,而乘除法这样的操作需要多个周期,还有比较特殊的 load 操作,其执行的周期数取决于 D-Cache(或 StoreBuffer)是否命中等,对这些情况都需要进行处理;
      • 例如,乘法指令,如果还是提前1cycle进行唤醒:
      • 发射过程中的流水线_第5张图片
      • 发射过程中的流水线_第6张图片
  • 数据捕捉结构的流水线
  •  发射过程中的流水线_第7张图片
    • 发射过程也需要分为仲裁(Select)和唤醒(Wake-up)两个流水段,只不过指令在被仲裁电路选中之后,不需要去读取物理寄存器了,而是直接读取payload RAM即可以得到操作数。
    • 发射过程中的流水线_第8张图片
    • 有的数据从payload ram中读取,有的数据从bypass 网络中获取;
    • 图 8. 19 中将指令的选择和读取 payload RAM 放到了一个流水段,在这个阶段还负责将FU的计算结果“捕捉”到payload RAM中,很显然在这个周期做了很多事情;
      • 尤其是这个周期需要对payload RAM既进行读取、又进行写入,这个多端口的payload RAM会导致处理器的周期时间变得过大。
      • 同时,当FU的个数比较多时,FU结果的旁路网络也会占用不菲的硬件资源和过多的时间,因此可以进一步对流水线进行细分:将payload RAM放在下一个周期发射过程中的流水线_第9张图片

   

你可能感兴趣的:(risc-v,risc-v)