流水線技術(shù)通過(guò)多個(gè)功能部件并行工作來(lái)縮短程序執(zhí)行時(shí)間,提高處理器核的效率和吞吐率,從而成為微處理器設(shè)計(jì)中最為重要的技術(shù)之一。
1. 3級(jí)流水線
到ARM7為止的ARM處理器使用簡(jiǎn)單的3級(jí)流水線,它包括下列流水線級(jí)。
(1)取指令 從寄存器裝載一條指令。
(2)譯碼(decode) 識(shí)別被執(zhí)行的指令,并為下一個(gè)周期準(zhǔn)備數(shù)據(jù)通路的控制信號(hào)。在這一級(jí),指令占有譯碼邏輯,不占用數(shù)據(jù)通路。
(3)執(zhí)行 處理指令并將結(jié)果寫回寄存器。
當(dāng)處理器執(zhí)行簡(jiǎn)單的數(shù)據(jù)處理指令時(shí),流水線使得平均每個(gè)時(shí)鐘周期能完成1條指令。但一條指令需要3個(gè)時(shí)鐘周期來(lái)完成,因此有3個(gè)時(shí)鐘周期的延時(shí),但吞吐率是每個(gè)周期一條指令。
對(duì)于3級(jí)流水線,PC寄存器里的值并不是正在執(zhí)行的指令的地址,而是預(yù)取指令的地址,這個(gè)知識(shí)點(diǎn)很重要,后面我們會(huì)詳細(xì)的舉例來(lái)證明。
處理器要滿足高性能的要求,為了滿足這個(gè)要求,需要重新考慮處理器的組織結(jié)構(gòu)。提高性能的方法主要有兩種方法:
1.提高時(shí)鐘頻率。時(shí)鐘頻率的提高,必然引起指令執(zhí)行周期的縮短,所以要求簡(jiǎn)化流水線每一級(jí)的邏輯,流水線的級(jí)數(shù)都要增加。
2.減少每條指令的平均指令周期數(shù)CPI。這就要求重新考慮3級(jí)流水線ARM中多余1個(gè)流水線周期的實(shí)現(xiàn)方法,以便使其占有較少的周期,或者減少因指令相關(guān)造成的流水線停頓,也可以將兩者結(jié)合起來(lái)。
較高性能的ARM核使用了5級(jí)流水線,而且具有分開的指令和數(shù)據(jù)存儲(chǔ)器。在Cortex-A8中有一條13級(jí)的流水線,但是ARM公司沒(méi)有對(duì)其中的技術(shù)公開任何相關(guān)的細(xì)節(jié)。
從經(jīng)典ARM系列到現(xiàn)在Cortex系列,ARM處理器的結(jié)構(gòu)在向復(fù)雜的階段發(fā)展,但沒(méi)改變的是CPU的取址指令和地址關(guān)系,「不管是幾級(jí)流水線,都可以按照最初的3級(jí)流水線的操作特性來(lái)判斷其當(dāng)前的PC位置」。
2. 流水線舉例
為方便理解,下面我們以3級(jí)流水線為例,
1)最佳流水線
這是一個(gè)理想的實(shí)例,所有的指令都在寄存器中執(zhí)行,且處理器完全不必離開芯片本身。每個(gè)周期,都有一條指令被執(zhí)行,流水線的容量得到了充分的發(fā)揮。指令周期數(shù) (CPI) = 1。
2)LDR流水線
該例中,用6周期執(zhí)行了4條指令 指令周期數(shù) (CPI) = 1.5
與最佳流水線不同,裝載(LDR) 操作將數(shù)據(jù)移進(jìn)片內(nèi)導(dǎo)致了指令/數(shù)據(jù)總線被占用,因此隨后緊跟了內(nèi)部的寫周期( writeback)以完成將數(shù)據(jù)寫回寄存器。
1.數(shù)據(jù)總線在周期1, 2, 3 被使用,周期6是取指,周期4用于數(shù)據(jù)裝載,而周期5是一個(gè)內(nèi)部周期用來(lái)完成載入的數(shù)據(jù)寫回到寄存器中。
2.周期3為執(zhí)行周期:產(chǎn)生地址
3.周器4為數(shù)據(jù)周期:從存儲(chǔ)器中取數(shù)據(jù)(數(shù)據(jù)只有在周期4的末尾出現(xiàn)在內(nèi)核中)
4.周期5寫回周期:通過(guò)數(shù)據(jù)通道中的B總線和ALU將數(shù)據(jù)寫回到寄存器bank 中
5.周期6的執(zhí)行被推遲了,直到周期5寫回完成(使用ALU )。同樣內(nèi)部周期是不需要等待狀體的,但讀寫存儲(chǔ)器時(shí)可能需要。
3)分支流水線
BL指令用于實(shí)現(xiàn)指令流的跳轉(zhuǎn),并存儲(chǔ)返回地址到寄存器R14(LR)中。
1.分支指令在其第一周期計(jì)算分支的目的地,同時(shí)在現(xiàn)行PC處完成一次指令預(yù)取,流水線被阻斷。這種預(yù)取在任何情況下都要做的,因?yàn)楫?dāng)判決地址產(chǎn)生時(shí)已來(lái)不及停止預(yù)取。
2.第二個(gè)周期在分支的目標(biāo)地址完成取指,而返回地址則存于R14如果link位已設(shè)置。
3.第三周期完成目標(biāo)地址+4的取指,重新填滿流水線,并且如果跳轉(zhuǎn)是帶鏈接的還要修改R14(減去4)以便簡(jiǎn)單地返回。
4.分支需要三個(gè)時(shí)鐘周期來(lái)執(zhí)行BL,隨后會(huì)涉及調(diào)整階段。
4)中斷流水線
「IRQ 中斷的反應(yīng)時(shí)間最小=7周期」
1.周期1: 內(nèi)核被告知有中斷 IRQ在現(xiàn)行指令執(zhí)行完之前不會(huì)被響應(yīng)( MUL and LDM/STM 指令會(huì)有長(zhǎng)的延遲) 解碼階段:中斷被解碼(中斷已使能,設(shè)置了相應(yīng)標(biāo)志位… )。如果中斷被使能和服務(wù),正常的指令將不會(huì)被解碼。
2.周期 2: 此時(shí)總是進(jìn)入ARM狀態(tài). 執(zhí)行中斷 ( 獲取IR向量的地址), 保存 CPSR 于 SPSR, 改變CPSR模式為 IRQ 模式并禁止進(jìn)一步的 IRQ 中斷輸入。
3.周期 3: 保存 PC (0x800C) 于 r14_irq, 從IRQ異常處理向量處取指
4.周期 4: 解碼向量表中的指令; 調(diào)整r14irq 為0x8008
5.周期 4和 5: 無(wú)有用的指令取指, 由于周期 6的跳轉(zhuǎn)
6.周期 6: 取異常處理子程序的第一條指令; 從子程序返回: SUBS pc,lr,#4文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-692614.html
這將恢復(fù)工作模式并從響應(yīng)中斷前的下一條指令處取指,如果有多個(gè)中斷,需堆棧保存返回地址。注意最大的FIQ響應(yīng)延遲為 29個(gè)周期(而非Thumb狀態(tài)的28周期!)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-692614.html
到了這里,關(guān)于ARM編程模型-指令流水線的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!