跳转至

指令的执行逻辑

前端

  1. IF1 段通过 pc 读取指令内存,同时读取分支预测器,触发 nextpc 计算逻辑
  2. IF2 段更新分支预测器
  3. ID 段解码指令
  4. 进入 Dispatch Buffer 等待发射

上述逻辑实现在 frontend/frontend_base.cpp 中。

后端

  1. 指令进入保留站和 ROB 等待唤醒执行
  2. 等到获取了需要的寄存器的值,指令被唤醒之后,可以进入 ALU 执行
  3. 经过 1 周期执行完成后,向 cdb 写入计算结果和对应的 ROB 号
  4. 等待 ROB 弹出指针指向自己后,提交指令,写入寄存器
  1. 指令进入保留站和 ROB 等待唤醒执行
  2. 等到获取了需要的寄存器的值,指令被唤醒之后,可以进入 ALU 执行
  3. 经过 1 周期执行完成后,向 cdb 写入计算结果,是否 mispredict,跳转地址和对应的 ROB 号
  4. 等待 ROB 弹出指针指向自己后,提交指令。若需要,写入寄存器。如 mispredict,向前端发送跳转信号,清空流水线。
  1. 指令进入保留站和 ROB 等待唤醒执行
  2. 等到获取了需要的寄存器的值,指令被唤醒之后,可以进入 LSU 执行
  3. 若为 Load 指令,读取数据内存和 Store Buffer,查询结果,插入 Load Buffer
  4. 若为 Store 指令,读取数据内存和 Store Buffer,查询结果。刷新 Load Buffer。构造写入结果推入 Store Buffer 中。
  5. Load / Store 指令均执行一周期构造地址。访问内存时间不确定。
  6. 等待 ROB 弹出指针指向自己后,提交指令。Load 先检查 Load Buffer 项是否失效。若失效,进行跳转。否则将结果写入寄存器,清除 Load Buffer
  7. Store 指令弹出 Store Buffer,写入内存。注意内存可能不能在 1 周期之内完成写入。如果写入未完成,请不要弹出 rob。
  1. 指令进入保留站和 ROB 等待唤醒执行
  2. 等到获取了需要的寄存器的值,指令被唤醒之后,可以进入 ALU 执行
  3. 经过 多个 周期执行完成后,向 cdb 写入计算结果和对应的 ROB 号
  4. 等待 ROB 弹出指针指向自己后,提交指令,写入寄存器

最后更新: 2024年2月23日
作者:cuibst