发布日期:
2023-11-06
更新日期:
2024-07-02
文章字数:
662
阅读时长:
2 分
阅读次数:
Pipeline
Overview
- IF 阶段与 MEM 阶段, 一个周期内无法完成访存, 需要将其他部件全部卡住.
- 单周期比多周期 CPI 低, 但是多周期可以提高时钟频率, 在性能上更好.
- 流水线过长, 一定程度能够均分各阶段延迟, 但会引入流水线寄存器带来的固定延迟.
- 如何清空流水线? 插入气泡, 拒绝写寄存器、写内存等时序逻辑.
- 为什么加速比 < 流水段数?
- 流水段执行时间不等, 部分流水段时间过长;
- 流水线寄存器延迟;
- 插入气泡废弃指令.
- 组合逻辑: 进入 ID 阶段即完成译码, 进入 EXE 阶段即完成执行.
- 时序逻辑: 进入 IF\MEM 阶段, 等待访存; 进入 WB 阶段, 下一周期写入完成.
- 从后向前生成控制信号, 避免信号生成遗漏.
Conflicts
- 由 Von-Neumann 体系结构中指令的执行过程决定.
- 结构冲突: 硬件资源不足.
- 当 load 指令在 MEM 阶段和任意指令在 IF 阶段同时访存, 用 stall 信号卡住 MEM 阶段及以前的指令, 用 bubble 信号排空 WB 阶段的指令.
- 当 load 指令在 WB 阶段和其他指令在 ID 阶段同时读写寄存器, 增设读写端口避免冲突. 寄存器读是组合逻辑, 寄存器写是时序逻辑.
- 通过设置 I-cache 和 D-cache 增加资源.
- 数据冲突: 读后写冲突, 指令依赖于前面指令的结果数据.
- 当读写寄存器次序冲突, 用 stall 信号卡住 ID 阶段的指令, 用 bubble 信号排空 EXE 阶段的指令.
- 当读写寄存器次序冲突, 使用数据旁路将 EXE 阶段的数据前传至 ID 阶段; 若为 load use 冲突, 只能使用 stall-bubble 方法, 并在 WB 阶段前传.
- 控制冲突: 执行分支转移类指令.
- 暂停流水线: 发现分支指令, 暂停流水线, 判断是否分支.
- 预测分支不成功: IF 阶段直接取后续指令, ID\EXE 阶段判断是否分支.
- 预测分支成功: ID 阶段计算分支地址并转移, ID\EXE 阶段判断是否分支.
- 动态预测: 使用 BTB 表, 用 inst[11:2] 作为索引存储分支指令 inst[31:12] 和分支目标的映射. IF 阶段读取 BTB, ID\EXE 阶段计算分支目标地址和分支结果, 并填入 BTB.
- 卡住+气泡的延迟方法是万能的, 相当于将流水线处理器退化为多周期处理器.