流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一。
1. 3级流水线
到ARM7为止的ARM处理器使用简单的3级流水线,它包括下列流水线级。
(1)取指令 从寄存器装载一条指令。
(2)译码(decode) 识别被执行的指令,并为下一个周期准备数据通路的控制信号。在这一级,指令占有译码逻辑,不占用数据通路。
(3)执行 处理指令并将结果写回寄存器。
当处理器执行简单的数据处理指令时,流水线使得平均每个时钟周期能完成1条指令。但一条指令需要3个时钟周期来完成,因此有3个时钟周期的延时,但吞吐率是每个周期一条指令。
对于3级流水线,PC寄存器里的值并不是正在执行的指令的地址,而是预取指令的地址,这个知识点很重要,后面我们会详细的举例来证明。
处理器要满足高性能的要求,为了满足这个要求,需要重新考虑处理器的组织结构。提高性能的方法主要有两种方法:
1.提高时钟频率。时钟频率的提高,必然引起指令执行周期的缩短,所以要求简化流水线每一级的逻辑,流水线的级数都要增加。
2.减少每条指令的平均指令周期数CPI。这就要求重新考虑3级流水线ARM中多余1个流水线周期的实现方法,以便使其占有较少的周期,或者减少因指令相关造成的流水线停顿,也可以将两者结合起来。
较高性能的ARM核使用了5级流水线,而且具有分开的指令和数据存储器。在Cortex-A8中有一条13级的流水线,但是ARM公司没有对其中的技术公开任何相关的细节。
从经典ARM系列到现在Cortex系列,ARM处理器的结构在向复杂的阶段发展,但没改变的是CPU的取址指令和地址关系,「不管是几级流水线,都可以按照最初的3级流水线的操作特性来判断其当前的PC位置」。
2. 流水线举例
为方便理解,下面我们以3级流水线为例,
1)最佳流水线
这是一个理想的实例,所有的指令都在寄存器中执行,且处理器完全不必离开芯片本身。每个周期,都有一条指令被执行,流水线的容量得到了充分的发挥。指令周期数 (CPI) = 1。
2)LDR流水线
该例中,用6周期执行了4条指令 指令周期数 (CPI) = 1.5
与最佳流水线不同,装载(LDR) 操作将数据移进片内导致了指令/数据总线被占用,因此随后紧跟了内部的写周期( writeback)以完成将数据写回寄存器。
1.数据总线在周期1, 2, 3 被使用,周期6是取指,周期4用于数据装载,而周期5是一个内部周期用来完成载入的数据写回到寄存器中。
2.周期3为执行周期:产生地址
3.周器4为数据周期:从存储器中取数据(数据只有在周期4的末尾出现在内核中)
4.周期5写回周期:通过数据通道中的B总线和ALU将数据写回到寄存器bank 中
5.周期6的执行被推迟了,直到周期5写回完成(使用ALU )。同样内部周期是不需要等待状体的,但读写存储器时可能需要。
3)分支流水线
BL指令用于实现指令流的跳转,并存储返回地址到寄存器R14(LR)中。
1.分支指令在其第一周期计算分支的目的地,同时在现行PC处完成一次指令预取,流水线被阻断。这种预取在任何情况下都要做的,因为当判决地址产生时已来不及停止预取。
2.第二个周期在分支的目标地址完成取指,而返回地址则存于R14如果link位已设置。
3.第三周期完成目标地址+4的取指,重新填满流水线,并且如果跳转是带链接的还要修改R14(减去4)以便简单地返回。
4.分支需要三个时钟周期来执行BL,随后会涉及调整阶段。
4)中断流水线
「IRQ 中断的反应时间最小=7周期」
1.周期1: 内核被告知有中断 IRQ在现行指令执行完之前不会被响应( MUL and LDM/STM 指令会有长的延迟) 解码阶段:中断被解码(中断已使能,设置了相应标志位... )。如果中断被使能和服务,正常的指令将不会被解码。
2.周期 2: 此时总是进入ARM状态. 执行中断 ( 获取IR向量的地址), 保存 CPSR 于 SPSR, 改变CPSR模式为 IRQ 模式并禁止进一步的 IRQ 中断输入。
3.周期 3: 保存 PC (0x800C) 于 r14_irq, 从IRQ异常处理向量处取指
4.周期 4: 解码向量表中的指令; 调整r14irq 为0x8008
5.周期 4和 5: 无有用的指令取指, 由于周期 6的跳转
6.周期 6: 取异常处理子程序的第一条指令; 从子程序返回: SUBS pc,lr,#4
这将恢复工作模式并从响应中断前的下一条指令处取指,如果有多个中断,需堆栈保存返回地址。注意最大的FIQ响应延迟为 29个周期(而非Thumb状态的28周期!)。