参考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/ARM7 and http://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 with Dual-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) |
上一篇:ARM处理器NEON编程及优化技巧—左移右移等移位操作
下一篇:ARM Cortex系列(A8/A9/A15/A7) NEON多媒体处理SIMD引擎优化
推荐阅读最新更新时间:2024-03-16 15:00
设计资源 培训 开发板 精华推荐
- 有奖直播:DIY 家用监控边缘 AI Box——基于 8TOPS 算力,售价 199 美元的开发套件搭建深度学习案例
- 报名有礼:【TI C2000在实时控制系统中的新特性】网络直播诚邀您参与!
- TI“无线”风光可穿戴现场培训直播,诚邀参与,预注册赢好礼
- 热烈庆祝坛友coyoo新书《FPGA设计实战演练》出版,参与讨论即有机会赢新书!
- 2018,EEWORLD邀请你定下新年成长计划
- 泰克多媒体总线系列专题之三 《USB3.1接口测试》下载有礼
- 新用户限时福利:e络盟商城迎新季,全场包邮+打折~买一只电阻也包邮!
- 【晒月亮抢楼有礼】中秋月圆,千里共赏!
- 用 TI 汽车电子方案充充电吧,看你止步不前还是勇往直前!