1. 流水线
定义:流水线通过在较长的组合逻辑路径中插入寄存器降低了组合逻辑的路径,从而增加了时钟频率并提高了性能。
关键路径:最大组合延迟的路径
2. 经典五级流水
取值(IF)-译码(ID)-执行(EX)-访存(MEM)-写会(WB)
- IF
- 从存储器中获取指令并放入指令寄存器(IR)
- IR保存下个时钟周期所需的指令
- PC值递增4,指向下一个指令地址
- ID
- 分析IR中的指令并访问寄存器堆以读取寄存器
- 将通用寄存器的输出读入两个临时寄存器A和B,供以后使用
- IR的高16位经过符号拓展保存到临时寄存器IMM中供以后使用
- EX
访问存储器
通过执行得到有效地址,并将结果放入寄存器ALUoutput
寄存器-寄存器指令
通过操作码对寄存器A和寄存器B的数值进行操作,把结果放入ALUoutput
寄存器-立即数指令
寄存器A的数字和立即数进行运算
分支指令
ALU将NPC和IMM中的带符号立即数相加,计算出分支的目标地址;然后检查寄存器A的值来决定是否进行分支。 - MEM
通过ALU算出的地址,进行读数据或者写数据
如果是分支指令,就用ALUoutput寄存器中的分支目标地址替代PC中的值,否则用NPC寄存器中递增的值替代PC中的值 - WB
寄存器-寄存器指令:Reg[IR16,20] = ALUoutput
寄存器-立即数指令:Reg[IR11…15] = ALUoutput
3. 流水线冒险
- 结构冒险
结构冒险主要指资源冲突,比如在同一时钟周期内要求访问同一存储器
解决方案:在发生冲突时将流水线停一个时钟周期,这样会产生气泡;另一种解决方案是资源重复 - 数据冒险
指当前指令的执行需要依赖前面指令执行的结果
解决方案:数据/寄存器转移 - 控制冒险
常发生在由于分支语句使程序计数器发生变化的情况
解决方案:预取指令
4. 相关题目
一个clcyle需要访存的次数为32 * 6 = 192次
一个访存需要阻塞15/2.167=6.92约为7个时钟周期,可以访存192*7=1344次存储
2. 流水线的级数太少或者太多有什么问题
流水线级数太少导致组合逻辑延时太高,频率升不上去;流水级数太高会使得分支预测错误的成本太高,导致性能下降