对图5.32中结点着色后,寄存器的分配结果列在表5.6中。

                              
  表5.6 例子diffeq的寄存器分配表

变量 a x d y u o3 o4 o5 o6 o7 o8 o10
颜色号 1 2 3 4 5 6 7 6 6 7 7 5
寄存器 R1 R2 R3 R4 R5 R6 R7 R6 R6 R7 R7 R5
 
  在功能单元和寄存器分配完成后,根据数据传输的要求即可完成互连线路的分配。互连线路分配的关键在于如何分配多路器和总线。多路器的分配过程如下:
  对于每个功能单元和寄存器的各个输入端口,重复以下步骤:
  · 若连线个数m大于1,分配一个输入端数为m的多路器;
  · 将m根连线分别连接在多路器的m个输入端上;
  · 将多路器的输出端连接在功能单元或寄存器的输入端口上。
  我们继续使用前面的例子diffeq。假定硬件资源约束条件为:2个乘法器、1个加法器和1个实现{+,< }的功能单元,使用列表调度算法的调度结果,前面已经得到功能单元分配方案(图5.29)和寄存器分配方案(表5.6)。在此基础上进行互连线路(多路器)的分配,得到diffeq的数据通路,示于图5.33。


图5.33
例子diffeq列表调度结果的数据通路

  调度完成后,已经以FSM的方式描述了控制器的状态及状态转换;而分配完成后,则进一步规定了控制器(在每一个状态下)的输出。此后,便可以FSM的方式设计控制器。控制器的输出包括:
  · 功能单元在每个控制步中执行哪种操作;
  · 哪些寄存器加载;
  · 每个多路器的哪个输入端数据被选中, 等等。
  表5.7给出了例子diffeq控制器(以FSM形式给出)的输出信号说明。

  如果希望由控制器综合软件产生例子diffeq的控制器,表5.7实际上就是控制器综合软件的输入。

  表5.7 例子diffeq的控制输出信号
输入 输出
当前状态 Ctrl 次状态 {+,<} R1 R2 R3 R4 R5 R6 R7 M1 M2 M3 M4 M5 M6
S0 X S1 + 0 1 0 0 0 X X 0 2 1 0 0 0
S1 0 结束 < X X X X X X X 0 0 X X X X
S1 1 S2 < 0 0 0 0 0 1 1 0 0 X X X X
S2 X S3 X 0 0 0 0 0 X X X X 0 1 1 1
S3 X S4 X 0 0 0 0 0 1 1 X X X X X X
S4 X S5 X 0 0 0 0 1 X X X X 1 0 1 2
S5 X S6 X 0 0 0 X 0 1 1 X X X X X X
S6 X S0 + 0 0 0 1 1 X X 1 1 X X X X
表中符号说明:
信号:      X 任意项;
功能单元{+,<}:  + 选择加法操作; < 选择比较操作;
寄存器:     0 保持;     1 加载;
多路器:     0 左端;     1 右端;     2 中间
  互连线可以用多路器实现也可以用总线实现,可以实现同样的功能但造价不同。总线分配一般是在多路器的分配前或分配后,根据某些规则(经验)将相关的连线合并成总线。限于篇幅,有关内容从略。
  基于图着色的分配方法把功能单元分配和寄存器分配作为两件独立的任务进行,分别达到需求量最小。其不足之处是:无法考虑功能单元分配和寄存器分配之间的相互影响,更无法全面考虑功能单元、寄存器以及互连线路的分配的全局优化。