任务:从发射队列中选择出 n 个 ready 的指令送到功能单元中
最优目标: oldest-first
对于压缩式发射队列:
仲裁电路实现简单,只需选择发射队列最下面的 n 个 entry
对于非压缩式发射队列:
对于分布式发射队列:采用 1-of-M 仲裁
每周期从发射队列的 M 个 entry 中选出 1 条指令送到功能单元
- 识别出发射队列中的哪些指令是 oldest 的?
- 需要指令的年龄信息:可以利用 ROB 的地址
- ROB 本质是 FIFO ,存在读写指针翻转的问题
- 给 ROB 的每个 entry 增加一位位置位表明是否翻转
- 当位置位相同时, ROB 的地址值越小,对应的指令越旧
- 当位置位不同时, ROB 的地址值越大,对应的指令越旧
- 指令的年龄信息需要写入发射队列(即发射队列每个 entry 需要 Age field )
- 屏蔽掉未 ready 的指令?
- 发射队列中每个 entry 增加一位 ready 位
- 仲裁电路根据 ready 位和年龄信息进行比较
- 如何比较年龄信息选出最 oldest 的指令?
- 多级比较电路:对于容量为 N 的发射队列,需要的比较电路级数为 $log_2N$
- 如何根据仲裁电路选出的年龄值,在发射队列中找到相应的指令?
- 方法1: 用年龄值和发射队列的所有 entry 的年龄值比
发射队列需要实现为 CAM (面积和延迟都增加不少) - 方法2: 仲裁电路比较时,每条指令在发射队列中的地址也随着比较电路流动下去
并行比较,不影响关键路径
- 方法1: 用年龄值和发射队列的所有 entry 的年龄值比
对于集中式发射队列:采用 N-of-M 仲裁
- 方案1: 多级 1-of-M 仲裁电路级联
延时也翻倍,不具有可扩展性 - 方案2: 每个功能单元使用 1 个 1-of-M 仲裁
问题在于相同的功能单元之间如何进行分配?- 方法1: 轮换分配
- 当前周期分配给 ALU0,下一周期分配给 ALU1
- 发射队列每个 entry 增加一位分配位,指明分配给哪个 ALU
- 实现简单
- 利用率有限,容易出现”多条指令需要分配给 ALU0, 而 ALU1 空闲“的情况
- 方法2: 合并功能单元,多个功能单元共用 1 条发射队列(本质是折中式发射队列)
trade-off:- 更多功能单元共用一个发射队列:
- 发射队列容量需求更大
- 仲裁电路延时越高
- 更少功能单元共用一个发射队列:
- 发射队列的数量更多
- 唤醒电路的面积、延时、功耗都更高
- 更多功能单元共用一个发射队列:
- 方法1: 轮换分配