指令的执行逻辑
前端
- IF1 段通过 pc 读取指令内存,同时读取分支预测器,触发 nextpc 计算逻辑
- IF2 段更新分支预测器
- ID 段解码指令
- 进入 Dispatch Buffer 等待发射
上述逻辑实现在 frontend/frontend_base.cpp
中。
后端
- 指令进入保留站和 ROB 等待唤醒执行
- 等到获取了需要的寄存器的值,指令被唤醒之后,可以进入 ALU 执行
- 经过 1 周期执行完成后,向 cdb 写入计算结果和对应的 ROB 号
- 等待 ROB 弹出指针指向自己后,提交指令,写入寄存器
- 指令进入保留站和 ROB 等待唤醒执行
- 等到获取了需要的寄存器的值,指令被唤醒之后,可以进入 ALU 执行
- 经过 1 周期执行完成后,向 cdb 写入计算结果,是否 mispredict,跳转地址和对应的 ROB 号
- 等待 ROB 弹出指针指向自己后,提交指令。若需要,写入寄存器。如 mispredict,向前端发送跳转信号,清空流水线。
- 指令进入保留站和 ROB 等待唤醒执行
- 等到获取了需要的寄存器的值,指令被唤醒之后,可以进入 LSU 执行
- 若为 Load 指令,读取数据内存和 Store Buffer,查询结果,插入 Load Buffer
- 若为 Store 指令,读取数据内存和 Store Buffer,查询结果。刷新 Load Buffer。构造写入结果推入 Store Buffer 中。
- Load / Store 指令均执行一周期构造地址。访问内存时间不确定。
- 等待 ROB 弹出指针指向自己后,提交指令。Load 先检查 Load Buffer 项是否失效。若失效,进行跳转。否则将结果写入寄存器,清除 Load Buffer
- Store 指令弹出 Store Buffer,写入内存。注意内存可能不能在 1 周期之内完成写入。如果写入未完成,请不要弹出 rob。
- 指令进入保留站和 ROB 等待唤醒执行
- 等到获取了需要的寄存器的值,指令被唤醒之后,可以进入 ALU 执行
- 经过 多个 周期执行完成后,向 cdb 写入计算结果和对应的 ROB 号
- 等待 ROB 弹出指针指向自己后,提交指令,写入寄存器
最后更新:
2024年2月23日
作者: