本文首要介绍ARM7,ARM9E,ARM11以及Cortex-A系列处理器的流水线,从指令读取fetch,指令解码decode到指令履行的各个阶段。
参阅ARM的网站http://www.arm.com/about/company-profile/index.php,ARM公司成立于1990年,现在现已出售了超越150亿个芯片,并向超越200多加公司出售了超越600个处理器的授权,现在全世界有超越95%的手机以及超越25%的消费电子产品运用ARM作为处理器中心。
ARM(Advanced RISC Machines)是专心于RISC(Reduced Instruction Set computer)架构的处理器公司,最早的ARM1原型是1985年在英国剑桥的Acorn公司规划,并由VLSI出产,前期的ARM1,ARM2,ARM250,ARM3..的处理器都被Acorn这家公司作为核算机处理中心。
现在处理器架构中,首要有1940年代提出的Von Neumann供给的记忆体架构,让程序和数据共用总线,之后的Harvard架构则让程序和数据运用不同的架构,优点是能够让程序和数据搭档从存储器内操作。前期的ARM7跟8051一般是选用Von Neumann架构,一块cache供指令与数据存取,而现在新的微处理器架构(例如:ARM11 or Cortex A)一般都选用Harvard架构,也便是处理器会支撑I-Cache与D-Cache,区别指令和数据的总线操作,进步处理器功率。(参阅文章:http://en.wikipedia.org/wiki/ARM7andhttp://en.wikipedia.org/wiki/Harvard_architecture).有关ARM处理器的冯诺依曼和哈佛架构能够参阅网页http://stenlyho.blogspot.com/2008/08/armcpu.html,如下所示
Processor Family |
#of pipeline stages |
Memory Organization |
Clock Rate |
MIPS/MHz |
ARM6 |
3 |
Von Neumann |
25MHz |
|
ARM7 |
3 |
Von Neumann |
66MHz |
0.9 |
ARM8 |
5 |
Von Neumann |
72MHz |
1.2 |
ARM9 |
5 |
Harvard |
200MHz |
1.1 |
ARM10 |
6 |
Harvard |
400MHz |
1.25 |
StrongARM |
5 |
Harvard |
233MHz |
1.15 |
ARM11 |
8 |
Von Neumann/Harvard |
550MHz |
1.2 |
ARM是选用RISC精简指令集(Reduced Instruction Set Computing)架构的处理器,RISC架构首要挑选运用频率较高的简略指令,防止杂乱指令,运用固定长度的指令编码(支撑32bits,16bits或16/32bits混合),单周期指令,便于Pipeline的操作履行,并经过很多暂存器,让逻辑处理指令只对暂存器进行操作,只要特定载入/贮存的指令能够存取存储器內容.比较CISC架构,会跟着需求,不断的参加新的指令集,使得架构越来越杂乱,实践运用中,也并非一切的指令都是常被运用的,如下以CSIC架构的x86指令集为例,指令集出现不固定长度的方法,如下比如有1,2,7与11 bytes的比如
(1bytes)0×48 = dec eax
(2bytes)0×89 F9= mov ecx,edi
(7bytes)0x8B BC 24 A4 01 00 00 = mov edi,dword ptr [esp+000001A4h]
(11bytes)0×81 BC 24 14 01 00 00 FF 00 00 00 = cmp dword ptr [esp+00000114h],0FFh
ARM经过Pipeline的方法加快指令集的处理,在Pipeline履行阶段,假如发生中止,也会把Pipeline中的指令履行完畢才进入中止,如下所示ARM7支撑如下的3级Pipeline
Fetch → Decode → Execute
其间
Fetch |
进行指令的读取动作 |
Decode |
Thumb->ARM指令Decompress,ARM指令解码,暂存器挑选 |
Execute |
进行暂存器/存储器读取,算术逻辑运算与暂存器/存储器回写动作 |
每一个CPU周期,处理器都能够一同处理Fetch,Decode,Execute這三个动作,而非把一个指令从Fetch开端到履行完后,才处理下一个指令周期,如下图所示
Time |
Fetch |
Decode |
Execute |
Cycle#1 |
Instruction#1 |
||
Cycle#2 |
Instruction#2 |
Instruction#1 |
|
Cycle#3 |
Instruction#3 |
Instruction#2 |
Instruction#1 |
Cycle#4 |
Instruction#4 |
Instruction#3 |
Instruction#2 |
Cycle#5 |
Instruction#5 |
Instruction#4 |
Instruction#3 |
Cycle#6 |
Instruction#6 |
Instruction#5 |
Instruction#4 |
为了防止在非载入存储器阶段,让运算指令进行存储器的存取,而导致Pipeline可堆叠履行的才能被损坏,ARM只允许特定载入贮存指令读写存储器的材料.前期的ARM6,ARM7有3级的Pipeline,到了ARM8、ARM9时为5级的Pipeline;之后的ARM11则为8级的Pipeline;不过Pipeline过深不一定就能帶来更高的效益,假如程序流程中遇到分支(例如Branch到另一个程序块),就会导致Pipeline中的材料失效而要从头进行指令Fetch的动作.
简略来说,Pipeline便是把指令的处理分红几个不同的步驟,例如
ARM9支撑如下的5级Pipeline
Fetch → Decode → Execute→ Memory→ Write Back
其间
Fetch |
进行指令的读取(Fetch)动作 |
Decode |
进行ARM/Thumb指令解码与暂存器的读取 |
Execute |
进行逻辑运算与存储器存取位址核算动作 |
Memory |
读取或写回存储器材料 |
Write Back |
將运算或是Load成果回写暂存器中 |
ARM10之后有支撑Branch Prediction以削减在Pipeline履行期间因为Branch动作导致Pipeline失效Flush的时机,支撑如下的6级Pipeline
Fetch→ Issue → Decode → Execute→ Memory→ Write Back
其间
Fetch |
进行Branch Predictor指令分支猜测,指令位址核算,与指令的读取(Fetch)动作 |
Issue |
ARM/Thumb指令解码,若非ARM/Thumb有用指令,就经过Coprocessor Signal判别是否为Coprocessor指令 |
Decode |
暂存器的读取,Result Forward,ScoreBoard |
Execute |
进行算术逻辑运算与Branch/Data存取存储器位址核算,乘法运算 |
Memory |
读取或写回存储器材料,Coprocessor材料存取,乘法相加处理 |
Write Back |
将运算或是Load成果回写暂存器中 |
ARM11选用Scalar架构的Pipeline,并在Issue阶段支撑ALU(arithmetic logic unit),MAC(multiply/accumulate)与Load/Store分红Pipeline的流水线,能够在一个Cycle分发一个对应的处理器动作到一个Pipeline,如下所示的8级Scalar Pipeline (ARM1156T2-S支撑9级的Pipeline,其间Fetch Pipeline扩大为3级,能够参阅网页
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0338g/I1002919.html)
Fetch#1→ Fetch#2→ Decode→ISS (ALU Pipeline)→ Shifter→ALU→ SAT→ Write Back
______________________________(MAC Pipeline) → MAC1→MAC2→ MAC3→ Write Back
______________________________(Load/Store Pipeline)→ LS Add→DC1→ DC2→ Write Back
跟之前版别比较ARM11用了两个Fetch Pipeline阶段去支撑两种指令分支猜测(Branch Prediction)的机制,第一个Fetch Pipeline阶段会依据前史记载进行动态的指令分支猜测(Dynamic Branch Prediction),一共记载64次,4种状况(Strongly taken,Weakly taken,Weakly not-taken and Strongly non-taken)的分支((Branch)方针存储器位址快取(BTAC,Branch-Target Address Cache)记载近期指令分支的情況.第二个Fetch Pipeline阶段进行静态的指令分支猜测(Static Branch Prediction),会处理不在第一阶段规模中的分支猜测存储器位址,射中率高的指令分支猜测(Branch Prediction)能够防止Pipeline失效重置的问題,让处理器的运作功率更高。依据参阅的材料ARM11的Dynamic与Static Branch Prediction在一般履行情況下能够有85%的射中率,大多數的情況能够介于80%-95%之间(取決于程序的巨细)。
简介如下,
#1 |
Fetch#1 |
进行Dynamic Branch Prediction,指令位址核算,与指令的读取(Fetch)动作 |
|||||
#2 |
Fetch#2 |
进行Static Branch Prediction |
|||||
#3 |
Decode |
ARM/Thumb指令解码,若非ARM/Thumb有用指令,就经过Coprocessor Signal判别是否为Coprocessor指令 Static BPR Stack |
|||||
#4 |
ISS |
暂存器的读取,与指令履行途径分配,有三条途径逻辑运算ALU Pipeline,乘法累加MAC Pipeline,与材料存取Load/Store Pipeline. |
|||||
ALU Pipeline |
MAC Pipeline |
Load/Store Pipeline |
|||||
#5 |
Shifter |
对逻辑运算指令操作单元(operand)进行Shift |
MAC1 |
第1阶段乘法累加操作 |
LS Add |
核算发生Load/Store操作的存储器位址 |
|
#6 |
ALU |
进行整數算术逻辑运算 |
MAC2 |
第2阶段乘法累加操作 |
DC1 |
第1阶段Data Cache存取 |
|
#7 |
SAT |
贮存运算成果 |
MAC3 |
第3阶段乘法累加操作 |
DC2 |
第2阶段Data Cache存取 |
|
#8 |
Write Back |
将运算或是Load成果回写暂存器中 |
ARM Cortext A系列的架构,在這架构下ARM导入了Superscalar架构的Pipeline,让处理器能够在一个周期平行处理一个以上的指令集。以Cortex A8为例,支撑13级的整數Pipeline与10级的NEON多媒体指令集Pipeline,以整數处理的指令集为例,Cortex A8支撑Dual-Issue,In-Order Pipeline,不同于之前的ARM核心一次只能处理一个整数处理指令集,Cortex A8能够一同Issue两个整数处理指令集,并在一个周期中经过两个整数算术逻辑单元Pipeline平行处理这两个指令集.
13-Stage Integer Pipeline |
10-Stage NEON Pipeline |
||||||||||||||||||||||
F#0 |
F#1 |
F#2 |
D#0 |
D#1 |
D#2 |
D#3 |
D#4 |
E#0 |
E#1 |
E#2 |
E#3 |
E#4 |
E#5 |
M#0 |
M#1 |
M#2 |
M#3 |
N#1 |
N#2 |
N#3 |
N#4 |
N#5 |
N#6 |
Instruction Fetch |
Instruction Decode withDual-Issues |
Architectural Register File |
ALU/MUL Pipeline 0 |
NEON Queue |
NEON Decode |
NEON File |
Integer ALU Pipe |
||||||||||||||||
ALU Pipeline 1 |
Integer MUL Pipe |
||||||||||||||||||||||
Load/Store Pipeline 0 or 1 |
Integer Shift Pipe |
||||||||||||||||||||||
None-IEEE FP Add Pipe |
|||||||||||||||||||||||
None-IEEE FP Mul Pipe |
|||||||||||||||||||||||
IEEE FP Engine |
|||||||||||||||||||||||
Load/Store Permute Pipe |
在Cortex A8架构下,有两个ALU Pipeline,ALU 0与ALU1是对称的,能够一同处理两个逻辑运算,因为Pipeline的特性在运用上,乘法需求的指令会跟ALU 0成对(也便是说在这条Pipeline 0接连处理有关整数逻辑运算与乘法相关的指令),而Load/Store的指令则合适跟ALU 0或1两者任一一同成对操作。
其间
13-Stage Integer Pipeline |
0-Stage |
F#0 |
用来发生要Fetch指令的位址,在文件中这个阶段并不归入13级的Pipeline中. (AGC,Address Generator Unit) |
|||||||||
1-Stage |
F#1 |
RAM+TLB , 支撑两个层级的全域前史指令分支猜测(Global History Branch Preditor)分別为 1,BTB(Branch Target Buffer) 能用来判别现在所要Fetch的位址是否为分支(Branch)指令,以及所要调到的方针存储器位址,现在一共能够记载512笔材料,若BTB射中,接下来就会进行GHB的动作. 2,GHB(Global History Buffer) 包括4096个2bits计数器,用来编码分支猜测的強度与方向。GHB会以10bits长度定址最近十次分支的位址,与4bits的PC(Program Counter)值. 此外,Return Stack(RS)会记载8次32bits Link Register的值,当发现有关于函式回来(Return)相对指令时,Return Stack中所记载的最近8次Link Register材料就能够协助Dynamic Branch Predictor猜测或许的分支結果. |
||||||||||
2-Stage |
F#2 |
供给12次Fetch Queue |
||||||||||
3-Stage |
D#0 |
Decode. |
||||||||||
4-Stage |
D#1 |
|||||||||||
5-Stage |
D#2 |
|||||||||||
6-Stage |
D#3 |
|||||||||||
7-Stage |
D#4 |
|||||||||||
8-Stage |
E#0 |
Architectural Register File |
||||||||||
ALU/MUL Pipeline 0 |
ALU Pipeline 1 |
Load/Store Pipeline 0 or 1 |
||||||||||
9-Stage |
E#1 |
Execution. |
||||||||||
10-Stage |
E#2 |
|||||||||||
11-Stage |
E#3 |
|||||||||||
12-Stage |
E#4 |
BP Update(to F#0) |
BP Update(to F#0) |
BP Update(to F#0) |
||||||||
13-Stage |
E#5 |
|||||||||||
10-Stage NEON Pipeline |
Instruction Decode |
Load and Store with Alignment |
||||||||||
1-Stage |
M#0 |
16-entry NEON Instruction Queue/Instruction Decode |
Mux L1/MCR |
|||||||||
2-Stage |
M#1 |
Decode Queue and Read/Write Check |
8-entry Load Queue |
|||||||||
3-Stage |
M#2 |
Score-Board and Issue-Logic |
Load Align |
|||||||||
4-Stage |
M#3 |
NEON Register Read and M3 fwding muxes |
Mux with NRF |
|||||||||
Integer ALU Pipe |
Integer MUL Pipe |
Integer Shift Pipe |
None-IEEE FP Add Pipe |
None-IEEE FP Mul Pipe |
IEEE Single/Double precision VFP |
Load/Store and Permute Pipe |
||||||
5-Stage |
N#1 |
FMT |
DUP |
SHIFT#1 |
FFMT |
FDUP |
VFP |
PERM#1 |
||||
6-Stage |
N#2 |
ALU |
MUL#1 |
SHIFT#2 |
FADD#1 |
FMUL#1 |
Write Back |
PERM#2 |
||||
7-Stage |
N#3 |
ABS |
MUL#2 |
SHIFT#3 |
FADD#2 |
FMUL#2 |
Store Align |
|||||
8-Stage |
N#4 |
ACC#1 |
FADD#3 |
FMUL#3 |
8-entry Store Queue |
|||||||
9-Stage |
N#5 |
ACC#2 |
FADD#4 |
FMUL#4 |
||||||||
10-Stage |
N#6 |
Write Back (Update to ARM/NEON Register File) |