新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM核流水線——ARM7,ARM9E,ARM11,Cortex-A系列處理器

        ARM核流水線——ARM7,ARM9E,ARM11,Cortex-A系列處理器

        作者: 時間:2016-11-10 來源:網絡 收藏
        本文主要介紹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作為處理器核心。

        本文引用地址:http://www.104case.com/article/201611/317422.htm

        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
        (Instruction Issue)

        暫存器的讀取,與指令執行路徑分派,有三條路徑邏輯運算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
        Instruction

        Queue

        NEON
        Instruction

        Decode

        NEON
        Register

        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核流水線處理

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 公安县| 荆州市| 吴忠市| 遂平县| 友谊县| 镇康县| 静乐县| 洞头县| 天峻县| 松原市| 东乌珠穆沁旗| 乐东| 寿阳县| 盐池县| 安平县| 浑源县| 花莲县| 金堂县| 台州市| 苏尼特左旗| 西丰县| 佛坪县| 灌南县| 高台县| 仁怀市| 宁武县| 邵东县| 城市| 资源县| 娱乐| 文成县| 沅陵县| 山阳县| 清苑县| 晋中市| 巴林左旗| 尤溪县| 郎溪县| 大田县| 庆安县| 辽宁省|