图5.10 单周期操作与多周期操作的调度

 
图5.11 链式操作的调度


  
对应于以上3种操作类型,操作的调度也分为3类:
  (1)单周期操作调度:将单周期操作赋于某一控制步的调度称为单周期操作调度。
  一般情况下,操作被调度到一个控制步内,意味着相应的功能单元要在该控制步内实现该操作并将输出变量存入寄存器中。也就是说,功能单元的延时和互连线路上的延时不能超过控制步的时间段。
  (2)多周期操作调度:将多周期操作赋于某一控制步的调度称为多周期操作调度。
  图5.10(b)中的乘法操作(1)是多周期操作,对应的乘法操作功能单元需要多个控制步(现在是2个)才能完成该操作 ,因而在非流水线工作方式下该功能单元至少2个控制步才能使用1次。图中的加法操作(2和3)是单周期操作,对应的加法操作功能单元可以在一个控制步中完成该操作,因而每个控制步皆可使用该功能单元一次。
  (3)链式操作调度:将链式操作赋于某一控制步的操作称为链式操作调度。
  数据相关性要求一个变量的生产者(操作)必须在其消费者(操作)之前调度执行。因此,当生产者与消费者被调度到不同的控制步内时,必须使用一个寄存器来存放该变量,直到它不再被引用。若某个操作的输出变量仅被其直接后继操作引用了一次,则可以将这两个操作调度到同一个控制步中。即将这两个功能单元串在一起,在同一控制步内分别完成这两个操作。这样作的好处是可以省去存放该变量的寄存器,但是其前提是这两个功能单元延时之和不能超过控制步时间段的值。
  如图5.11所示,操作2为生产者,操作3为消费者,操作2的输出变量仅被操作3引用一次。若控制步的时间段允许,可将操作2与操作3调度到同一控制步中,分别用减法器和加法器实现,而无需为该变量分配寄存器。
  4. 调度中控制结构的处理
  调度中必须考虑控制结构。硬件描述语言所提供的控制结构一般可以归结为两种:
  ·循环结构;
  ·条件分枝结构(即if…then…else结构)。
  处理循环结构的方法通常为:
  (1)将循环体作为一个基本块单独进行调度,然后再进行整体调度。
  (2)将循环体展开、折叠后,构成流水线方式或非流水线方式,然后再统一与其他操作一起调度。
  处理条件分枝结构的方法通常为:
  (1)在if…then…else语句中,将if语句体和else语句体分别作为两个单独的基本块进行调度。然后将调度好的两个基本块合并,再进行总体调度。
  (2)将条件分枝中 的操作(称为分枝操作)与其他操作(不属于条件分枝的操作,即非分枝操作)同时进行调度。