跳到主要内容

调度、唤醒与执行单元

调度器的核心问题是:每拍从大量等待微操作中选择哪些发射,同时满足数据依赖、端口能力和年龄/公平性策略。

微操作何时可发射​

通常需要同时满足:所有源操作数 ready、目标执行端口可接受、没有特殊次序限制。写回或旁路结果会产生 wakeup,更新等待项的源就绪状态。

源码入口:backend/issue/Scheduler.scala、backend/exu/ExeUnit.scala 以及 backend/fu/。

唤醒与选择为何困难​

宽发射意味着大量比较和广播:多个写回端口要匹配许多 issue entry 的物理源寄存器;随后 selector 还要在就绪集合中仲裁。这往往是面积、功耗和时序热点。

旁路与寄存器文件​

结果刚从执行单元产生时,依赖者可能无需等待写入再读出物理寄存器,而是经 bypass 直接获得。波形中要区分 operand 来自 regfile、regcache 还是 forward network。

不同执行单元​

  • 单周期整数 ALU;
  • 分支单元,可能产生 redirect;
  • 乘除法与浮点等多周期单元;
  • 访存地址生成与 LSU pipeline;
  • CSR/系统指令等序列化单元。

波形练习​

找一对 RAW 相关的加法指令,记录第一条写回、第二条 wakeup、select、issue 和实际接收旁路数据的周期。检查 wakeup 是否比 regfile 写回更早。