玄鐵C910微架構學習(2)——指令快取記憶體
現代高效能處理器的效能與記憶體效能的不匹配,如果處理器每次讀取資料都直接訪問記憶體,將導致記憶體的存取速度嚴重阻礙處理器效能的發揮。因此現代高效能處理器往往採用多層次的快取技術來減少對記憶體的訪問,節省處理器讀取記憶體的時間。
玄鐵C910
採用兩級的快取記憶體,第一級快取分為指令和資料快取記憶體,是距離處理器核心最近的快取,第二級快取指令和資料共享,相比第一級快取容量更大,但訪問速度也相對更慢。
本文將介紹高效能處理器
玄鐵C910
的第一級指令快取記憶體的組成和擴充套件的Cache操作,並對其中使用的
指令預取
和
快取路預測
等技術進行詳細的介紹。
一、指令提取單元簡介
由於指令快取記憶體的訪問位於指令提取單元(IFU),因此先簡單介紹一下玄鐵C910指令提取單元(IFU)的流水線組成,取指單元主要進行指令快取的訪問、對指令進行預處理,還有分支預測(本文將不再對分支預測部分進行介紹,相關內容請參考《玄鐵C910微架構學習》系列的分支預測篇),取指單元一共分為三個流水級:Instruction Fetch(下文簡稱為IF)、Instruction Pack(下文簡稱為IP)、Instruction Buffer(下文簡稱為IB)。
IF:
訪問L1指令快取獲取指令,一週期最多可以取出128bit指令。
IP:
預處理指令,最多可以預處理8條指令,在發生快取miss時進行回填(refill)。
IB:
將指令快取到指令Buffer中,然後向後續流水線傳送指令。
原始碼中的pcgen模組主要功能是產生PC,產生PC後即向指令快取記憶體發出訪問請求。
二、指令快取記憶體原始碼的檔案結構
指令快取記憶體部分的原始碼主要集中在gen_rtl程式碼中的ifu部分,相關邏輯主要包含在以下檔案中:
檔名
檔案內容
ct_ifu_icache_data_array0/1。v
儲存Icache第0/1路資料
ct_ifu_icache_if。v
Icache的頂層模組
ct_ifu_icache_predecd_array0/1。v
儲存第0/1路的預譯碼資訊
ct_ifu_icache_tag_array。v
儲存Icache的Tag
ct_ifu_ifctrl。v
IF階段的控制邏輯
ct_ifu_ipctrl。v
IP階段的控制邏輯
ct_ifu_ibctrl。v
IB階段的控制邏輯
ct_ifu_ipb。v
預取指邏輯
ct_ifu_l1_refill。v
Icache回填邏輯
ct_ifu_pcgen。v
生成PC的模組
ct_ifu_precode。v
預譯碼模組
三、指令快取記憶體的組成
指令快取記憶體的工作原理是當CPU需要取指令時,會首先在第一級快取中尋找,透過比較標籤(Tag)如果命中則能第一時間返回指令,否則就需要去下一級快取中進行尋找,並把整個快取行讀入到快取中,那麼當訪問該快取行的指令時,就可以以最快的速度返回指令。更多關於快取記憶體的基礎知識可以參考
《計算機體系結構量化方法》
的第二章和附錄B部分。
玄鐵C910的指令快取記憶體大小為64KB(開源版本中還支援32KB、128KB、256KB的配置),快取行(Cache line)大小為64Bytes,共有512個set。指令快取記憶體主要由三個部分組成:儲存指令的data_array、儲存標籤的tag_array、儲存預譯碼資訊的predecd_array。
data_array
使用8個2048x32bit大小的SRAM搭建,使用PC部分位[14:4]進行索引,採用兩路組相聯結構,每一路共有4個bank,每一個bank的資料寬度為32bit。
因此一次最多可以從快取中取出128bit的指令,最少為4條指令,最多為8條指令(當所有指令都為壓縮指令時),由於一共Cache line大小為64Bytes,而data_array一次讀寫頻寬為128bit,因此從下一級快取取資料時需要取四次。
除了正常的取指需要訪問data_array以外,還有許多其它情況需要訪問data_array,總結如下:
讀訪問:
1、正常進行順序取指,根據路預測的結果決定對哪路Cache進行訪問。
2、發生change flow(代表PC不是按順序的自增,出現跳轉或者分支預測失敗需要重定向或者發生異常需要重定向)後的PC進行取指,根據路預測的結果決定對哪路進行訪問,並且根據PC決定對哪個bank進行訪問。
3、由控制狀態暫存器(CSR)傳來的讀Cache請求,玄鐵C910在標準RISCV指令集的基礎上加入了許多Cache訪問的擴充套件暫存器組,例如mcins、mcindex等。
寫訪問:
1、發生refill(下文會對此進行詳細介紹)時,需要根據替換策略選擇某一路的Cache進行替換。
2、invalid Cache(下文會對此進行詳細介紹)時,需要往data_array中寫0。
tag_array
由於Icache一共有512個set,且為兩路組相聯結構,因此tag_array由512x59bit大小的SRAM搭建,其中每一項由兩路Tag(物理地址的高28位和一個有效位)和一個fifo_din位組成,fifo_din的作用是決定替換Cache是替換哪一路,因為玄鐵C910採用的替換策略是先入先出,因此每一次替換更新完某一路的Cache line後就會將fifo_din位取反,代表下一次替換另一路,從而實現FIFO的替換邏輯。
assign
tag_fifo_din
=
(
ifctrl_icache_if_inv_on
)
?
ifctrl_icache_if_inv_fifo
:
!
fifo_bit
;
//Only When refill last, Valid Bit will Be 1
assign
tag_valid_din
=
l1_refill_icache_if_last
;
assign
tag_pc_din
[
27
:
0
]
=
(
ifctrl_icache_if_inv_on
||
l1_refill_icache_if_first
)
?
28
‘b0
:
l1_refill_icache_if_ptag
[
27
:
0
];
assign
ifu_icache_tag_din
[
58
:
0
]
=
{
tag_fifo_din
,
tag_valid_din
,
tag_pc_din
[
27
:
0
],
tag_valid_din
,
tag_pc_din
[
27
:
0
]
};
predecd_array
predecd_array使用兩路2048x32bit大小的SRAM搭建,每一個項與data_array中的128bit指令包對應,在指令從下一次快取寫到L1 Cache時,同時會對每一次寫的128bit指令包進行預譯碼後,輸出一個32bit的資訊儲存到predecd_array中,使能訊號和索引訊號與data_array完全相同。
因為玄鐵C910支援RISC-V壓縮指令子集,所以指令包中一條指令的最小單位為16bit,預譯碼時會將128bit的指令包拆分成8個16bit,每一個16bit擁有4bit的資訊:hn_ab_br、hn_br、hn_bry1、hn_bry0(其中n為1到8),hn_bry1和hn_bry0用於將128bit的指令包區分開,用於判斷哪個16bit為單獨的壓縮指令,哪兩個16bit組成一條標準的32位指令。hn_ab_br用於表示該條指令是否為絕對跳轉指令,hn_br用於表示該條指令是否為分支指令。在從Icache中取出指令時,同時會取出這些譯碼資訊,根據預譯碼的資訊判斷需不需要進行分支預測,在沒有分支指令時則不需要對分支預測器進行訪問,減少了分支預測器的訪問,降低了錯誤預測發生的機率。
四、指令快取記憶體的回填
當發生了Cache miss時會發送一個請求過來回填(refill)階段開始進行refill操作,pc會從IP階段傳給refill階段,包括有虛擬pc(充當Index)、物理pc(充當Tag)、fifo位(決定替換哪一路),會傳到Icache。並且當處於資料傳輸的狀態下且沒有invalid Cache的訊號時,地址會每一週期加8,相當於指向Icache中的下一項(一個Cache line共有四項),每一次refill要進行四次資料傳輸,每一次傳輸128bit,傳輸4次才能填滿一個Cache line。refill的讀取的資料根據mux判斷是從預取Buffer中取還是從總線上取,讀取的資料傳到Icache中並傳到data path中。讀取到的資料還會經過
precode
階段進行預譯碼後傳到Icache的
predecd_arrry
,同時也傳到data path中,使得此時的IF階段的data path,不用再重新訪問Icache才能拿到資料。
整個refill的過程由以下的狀態機(圖1)進行控制。
圖1 指令快取記憶體回填的控制狀態機
IDLE:
等待refill,當開始refill時跳轉到
REQ
。
REQ:
但發生change flow(出現分支預測失敗需要重定向或者發生異常需要重定向)時,代表當前的PC時無效的,需要被沖刷掉,因此此時的refill是沒有意義的。當change_flow但匯流排沒有準許refill時,回到IDLE繼續等待;如果不是change_flow,但匯流排准許refill時,進入
WFD1
;當匯流排准許refill和change_flow同時來臨時,進入
INV_WFD1
;當IF階段傳來
inst invalid
訊號時,取消請求回到
IDLE
。
WFD1:
等待第一次有效資料傳輸。當匯流排響應的資料有效且
tsize
(代表此時Cache使能和cacheable)有效時,跳轉到
WFD2
;若匯流排響應發生了error且tsize有效時,跳轉到
INV_WFD2
;當tsize無效時,代表不經過Cache,所以跳轉回
IDLE
;當發生了change_flow,也代表當前請求的地址是無效的,因此跳轉到
INV_WFD1
;如果IF階段傳來
inst invalid
訊號,代表此時正在無效Cache,所以不進行refill,跳轉到
CTC_INV
。
WFD2:
等待第二次有效資料傳輸。當匯流排響應有效,跳轉到
WFD3
;當匯流排響應發生了error,跳轉到
INV_WFD3
。
WFD3:
等待第三次有效資料傳輸。當匯流排響應有效,跳轉到
WFD4
;當匯流排響應發生了error,跳轉到
INV_WFD4
。
WFD4:
等待第四次有效資料傳輸。當匯流排響應有效,跳轉到
IDLE
;當匯流排響應發生了error,跳轉到
IDLE
。在該狀態下代表refill結束,會向Cache傳送Last訊號。
INV_WFD1:
當出現匯流排響應發生error時,會進入該狀態,該狀態下不進行任何操作,但是傳輸已經開始,不能中途停止,所以還要繼續經過傳輸的狀態。當響應資料有效或響應error且tsize有效時,跳轉到
INV_WFD2
;如果IF階段傳來
inst invalid
訊號,代表此時正在無效Cache,跳轉到
CTC_INV
。
INV_WFD2:
當響應資料有效或響應erro時,跳轉到
INV_WFD3
。
INV_WFD3:
當響應資料有效或響應error時,跳轉到
INV_WFD4
。
INV_WFD4:
當響應資料有效或響應error時,跳轉到
IDLE
。
CTC_INV:
當正在進行無效Cache時會在該狀態下等待,當無效Cache完成時,會跳轉到
INV_WFD1
。
五、擴充套件的指令快取操作
為了方便進行Cache維護操作,提高Cache效率,玄鐵C910擴充套件了許多對Cache進行操作的指令,對於Icache的操作的指令有Icache。IALL(無效所有表項,僅操作當前核)、Icache。IALLS(無效所有表項,操作所有核)、Icache。IPA(按物理地址無效對應的表項,操作所有核)、Icache。IVA(按虛擬地址無效對應表項,操作當前核)。除了擴充套件的Cache指令外,還擴充套件了一些機器模式Cache訪問的暫存器,其中機器模式硬體操作暫存器MCOR可以決定是否對快取記憶體和分支預測進行操作,Cache指令暫存器(MCINS)決定是否向快取記憶體發起讀請求,Cache訪問索引暫存器(MCINDEX)配置讀請求訪問的Cache位置資訊,Cache資料暫存器(MCDATA0/1)記錄讀取快取記憶體的資料,更多內容請參考
玄鐵C910使用者手冊
。
這些擴充套件的Cache操作在指令快取記憶體中主要由下列狀態機(圖2)控制完成:
圖2 Icache操作的控制狀態機
IDLE:
等待無效請求,若有Cache指令請求無效整個Icache則跳轉到
INS_INV_ALL
;如果是Cache指令請求無效Cache中的某個地址則跳轉到
INS_TAG_REQ
;如果是cp0(控制狀態暫存器模組)傳來請求無效整個Cache則跳轉到
INV_ALL
;如果是cp0傳來的讀Icache請求則跳轉到
READ_REQ
。
READ_REQ:
由cp0傳來讀請求時會到達這個狀態。機器模式Cache指令暫存器
MCINS
的最後一位代表是否向Cache發起讀請求(高電平有效),機器模式Cache訪問索引暫存器
MCINDEX
用來配置讀請求訪問Cache的位置資訊如Index、Way、Tag/DATA、哪個Cache。機器模式Cache資料暫存器
MCDATA0/1
用於存放讀取的快取資料。在這狀態下會將訪問的位置資訊傳到Icache中,然後跳轉到
READ_RD
。
READ_RD:
該狀態下讀取Icache的資料和Tag,將從Icache傳來的資料和Tag讀到IF階段。然後會跳轉到
READ_ST
。
READ_ST:
該狀態下根據位置資訊(如哪一路、Tag或資料),將讀到的資料傳到cp0。
INV_ALL:
無效整個Icache。機器模式硬體操作暫存器
MCOR
可以對快取記憶體和分支預測進行操作,當選中指令快取記憶體且進行無效化時,就會傳來無效Icache的請求。使用一個計數器
Icache_inv_cnt
作為Index,初始化為最大值用自減的方式,不斷傳到Icache中進行無效Cache的操作,當無效完成後,跳轉回
IDLE
。
INS_TAG_REQ:
傳送讀Tag請求到Icache中。由
LSU
發來無效cacheline的請求。然後會跳轉到
INS_TAG_RD
。對於Cache指令
Icache.IPA
(按物理地址無效表項)和
Icache.IVA
(按虛擬地址無效表項),需要讀出Tag判斷需要無效的地址是否存在於Icache中。
INS_TAG_RD:
讀取Icache的Tag。之後跳轉到
INS_CMP
。
INS_CMP:
比較傳送請求的Tag和從Icache中讀取的Tag。傳送到讀取Tag的Index低6位由
LSU
傳來的Index決定,由於Cache的Index使用虛擬地址進行索引,只有低12位的頁內偏移與物理地址相同,而高3位對應的物理地址要由地址轉換得到,因此當需要對物理地址進行無效操作時,會將所有可能的對映地址都取出來判斷是否命中,高位為計數器
addr_inv_count_reg
決定,當有無效cacheline請求時後被置為
5‘b00111
,每週期減一,相當於需要將低位為
LSU
傳來的Index的所有項都比較Tag,若命中則跳轉到
INS_INV
進行無效Cache line的操作。若沒有命中則跳轉回
INS_TAG_REQ
,將下一個Index的Tag拿出來比較。
INS_INV:
將Cache Line無效,清除Tag的有效位。如果
addr_inv_count_reg
不為0則需要跳轉回到
INS_TAG_REQ
,繼續比較下一個Index的Tag,否則則代表無效cacheline操作完成跳轉回
IDLE
。
INS_INV_ALL:
無效整個Icache。對於Cache指令
Icache.IALL
和
Icache.IALLS
需要無效Icache的所有表項,具體操作與
INV_ALL
狀態類似。
六、指令預取技術
玄鐵C910的L1指令快取記憶體支援指令預取功能,透過配置隱式操作暫存器MHINT。IPLD使能,當指令快取記憶體發生缺失時需要向下一級快取中取資料回填,這個過程可能會消耗較長的時間,而加入預取功能則可以減少取指的延遲。預取指令主要是預取下一行Cache line的內容到Prefetch Buffer中,只有當發生了refill時,在refill請求後,才會進行預取,會在refill請求後的四個週期後向匯流排發出預取請求,因此會在refill的資料寫完Cache line後,接著進行預取資料,將Cache line的資料分四個週期寫到Prefetch Buffer中,預取完成後預取寫回狀態機會先判斷當前有沒有refill請求,如果有則比較是否命中,命中則使用Prefetch Buffer中的資料;反之,則等待下一次refill請求,當下一次refill請求到來時也會比較是否命中,若命中則使用Prefetch Buffer中的資料回填指令快取記憶體,降低取指延遲。指令預取要求預取的快取行和當前快取行位於同一頁面,保證取指地址的安全,整個預取的過程由下列狀態機(圖3)進行控制:
圖3 指令預取控制狀態機
IDLE:
等待Prefetch開始,開始後轉到
Cache
。
Cache:
等待一週期,等從Icache中讀出Tag。
CMP:
透過比較Tag檢查Icache中是否已經包含將要預取的Cache line,若包含則跳轉到回
IDLE
,不進行預取指。否則進入
PF_REQ
,向匯流排發出預取請求。
PF_REQ:
當匯流排空閒,可以進行讀取,且此時沒有refill的請求時,進入
PF0
開始預取第一組資料;當有refill請求且refill的Cache line沒有命中Prefetch line時,跳轉回
IDLE
。
PF0:
當匯流排傳輸發生error時,跳轉到
INV
代表資料傳輸無效;當預取的資料有效,即跳轉到
PF1
,取下一組資料。
PF1:
當匯流排傳輸發生error時,跳轉到
INV
代表資料傳輸無效;當預取的資料有效,即跳轉到
PF2
,取下一組資料。
PF2:
當匯流排傳輸發生error時,跳轉到
INV
代表資料傳輸無效;當預取的資料有效,即跳轉到
PF3
,取下一組資料。
PF3:
當匯流排傳輸發生error時,跳轉到
INV
代表資料傳輸無效;當預取的資料有效,即跳轉到
IDLE
,結束預取。
INV:
當出現傳輸error時就會跳轉到這個狀態,當匯流排傳來Last訊號,代表這次傳輸結束,跳轉回
IDLE
。
從預取快取區中讀取指令到Cache中的控制狀態機(圖4):
圖4 從預取快取區中讀取指令到Cache的控制狀態機
PF_IDLE:
當發生Icache invalid時,維持在
PF_IDLE
狀態;當預取完成後(即預取到最後一組資料時),此時如果Prefetch line命中refill的Cache line時,跳轉到
PF_GRNT
;如果Prefetch line沒有命中refill的cacahe line則跳轉到
PF_IDLE
;如果Prefetch完成時沒有refill請求則跳轉到
PF_VLD
。
PF_VLD:
跳轉條件與跳轉的目的狀態與
PF_IDLE
相同,該狀態用於當完成預取後,但又沒有出現refill請求時,等待request請求出現。
PF_GRNT:
當Prefetch line命中refill的Cache line時,會跳轉到該狀態,該狀態會跳轉到
PF_WB0
開始將第一組資料從預取Buffer中取到Icache中。
PF_WB0:
從Prefetch Buffer中讀取第一組資料到Icache中,然後跳轉到
PF_WB1
。
PF_WB1:
從Prefetch Buffer中讀取第二組資料到Icache中,然後跳轉到
PF_WB2
。
PF_WB2:
從Prefetch Buffer中讀取第三組資料到Icache中,然後跳轉到
PF_WB3
。
PF_WB3:
從Prefetch Buffer中讀取第四組資料到Icache中,完成資料的讀取後跳轉回
IDLE
。
七、路預測技術
玄鐵C910的指令快取記憶體採用兩路組相聯結構,為了減少並行訪問兩路快取的功耗,採用路預測技術,僅在低功耗模式下開啟,即MHINT。IWPE位為1時,主要使用兩位元標誌預測哪一路,每一個位元對應一路,會作為Icache data_array的使能訊號,若預測為該路時才會訪問該路的data_array,進而降低功耗。當兩位都為高時,則代表不進行預測,兩路都訪問。路預測主要分為順序路預測和跳轉路預測,當訪問Icache的同時也會訪問precode的資訊,得出該指令是否為跳轉指令,若為跳轉指令則下一個pc執行跳轉路預測,反之,則執行順序路預測。
順序路預測
的流程如圖5所示:
圖5 順序路預測流程(摘自路預測發明專利)
always
@(
inner_way_pred_default
[
1
:
0
]
or
ipctrl_pcgen_inner_way_pred
[
1
:
0
]
or
inc_pc
[
4
:
3
])
begin
if
(
inc_pc
[
4
:
3
]
==
2
’b10
||
inc_pc
[
4
:
3
]
==
2
‘b11
)
inner_way_pred
[
1
:
0
]
=
ipctrl_pcgen_inner_way_pred
[
1
:
0
];
else
inner_way_pred
[
1
:
0
]
=
inner_way_pred_default
[
1
:
0
];
end
assign
inner_way_pred_default
[
1
:
0
]
=
(
ipctrl_pcgen_inner_way1
||
ipctrl_pcgen_inner_way0
)
?
{
ipctrl_pcgen_inner_way1
,
ipctrl_pcgen_inner_way0
}
:
2
’b11
;
圖中的取指令指的是獲取PC的指令地址,透過PC判斷是否位於快取行邊界,若位於同一個Cache line中則可以使用之前的命中資訊,因為如果順序訪問的話,取完一個Cache line的資料需要四次,因此,如果當前的pc位於Cache line的後半行時,會根據前面一半的Cache line的命中資訊來預測當前該取哪一路,因為順序取指肯定會位於同一個Cache line中,所以這種情況下,預測的準確度會比較高。但噹噹前pc屬於Cache line的前半行時,會根據之前多次路命中的情況來決定預測哪一路或不進行預測,使用一個3位元的計數器來進行預測,當Cache的way0命中時該計數器會減一,way1命中時計數器加一,當計數器等於3’b000時路預測為way0,當計數器等於3‘b111時路預測為way1,其它情況下,不進行預測。
always
@(
posedge
forever_cpuclk
or
negedge
cpurst_b
)
begin
if
(
!
cpurst_b
)
hit_cnt
[
2
:
0
]
<=
3
‘b011
;
else
if
(
icache_way0_hit
)
hit_cnt
[
2
:
0
]
<=
hit_cnt_sub
[
2
:
0
];
else
if
(
icache_way1_hit
)
hit_cnt
[
2
:
0
]
<=
hit_cnt_add
[
2
:
0
];
else
hit_cnt
[
2
:
0
]
<=
hit_cnt
[
2
:
0
];
end
assign
hit_cnt_sub
[
2
:
0
]
=
(
hit_cnt
[
2
:
0
]
==
3
’b000
)
?
3
‘b000
:
hit_cnt
[
2
:
0
]
-
3
’b1
;
assign
hit_cnt_add
[
2
:
0
]
=
(
hit_cnt
[
2
:
0
]
==
3
‘b111
)
?
3
’b111
:
hit_cnt
[
2
:
0
]
+
3
‘b1
;
assign
ipctrl_pcgen_inner_way0
=
(
hit_cnt
[
2
:
0
]
==
3
’b000
);
assign
ipctrl_pcgen_inner_way1
=
(
hit_cnt
[
2
:
0
]
==
3
‘b111
);
訪問Cache時,雖然不會對無效資料路進行訪問,但還是會對兩路的Tag進行比較,判斷路預測是否正確,當預測失敗時,需要重新發送該PC,使用正確的命中資訊重新訪問Icache讀取指令包,因此在路預測失敗時會影響取指的效能,需要花更多的代價進行取指,得到命中資訊後還需要更新上述提到的計數器。
跳轉路預測
的流程如圖6所示:
圖6 跳轉路預測流程(摘自路預測發明專利)
當從Icache的precode array中讀出指令的預譯碼結果,若發現為跳轉指令,會進行跳轉路預測,或者當發生異常或者分支預測失敗需要change flow時,或其他需要reissue的情況時,也會進行跳轉路預測,透過PC訪問BTB獲取路預測資訊。然後根據Tag的比較結果判斷是否命中,如果發生預測失敗,則需要重新發送該PC重新訪問Icache讀取指令包,同時將正確的路命中資訊更新到BTB中。
begin
if
(
pcgen_chgflw_higher_than_ib
)
chgflw_way_pred
[
1
:
0
]
=
2
’b11
;
else
if
(
ibctrl_pcgen_pcload
)
chgflw_way_pred
[
1
:
0
]
=
ibctrl_pcgen_way_pred
[
1
:
0
];
else
if
(
ipctrl_pcgen_chgflw_pcload
)
chgflw_way_pred
[
1
:
0
]
=
ipctrl_pcgen_chgflw_way_pred
[
1
:
0
];
else
if
(
ipctrl_pcgen_reissue_pcload
)
chgflw_way_pred
[
1
:
0
]
=
ipctrl_pcgen_reissue_way_pred
[
1
:
0
];
else
chgflw_way_pred
[
1
:
0
]
=
ifctrl_pcgen_way_pred
[
1
:
0
];
end
路預測資訊的來源(優先順序從高到低):
1、當退休單元(rtu)、執行單元(iu)、addrgen模組給IFU傳來
chgflw
訊號,代表分支預測失敗需要重定向或者發生異常需要重定向時(rtu傳來的是異常訊號,iu傳來的是分支預測失敗訊號,addrgen模組傳來的是預譯碼後與預測地址比較發現不一致的預測失敗訊號),不進行路預測,即兩路都使能。
2、來自IB階段的pcload訊號,當IB階段發現指令緩衝區(Ibuffer)滿了,就需要將即將要進入Ibuffer中的那條指令的PC重新發射,而該指令的正確路命中資訊已經在IP階段得到,因此需要將這些路預測資訊傳遞,使得該PC使用正確的路命中資訊作為路預測的結果,或者在IB階段返回地址預測器(RAS)和間接分支預測器(Ind_BTB)做出了預測時,由於RAS和Ind_BTB中沒有儲存路預測資訊,所以對於RAS和Ind_BTB路預測均為不進行預測。
3、來自IP階段的pcload訊號,當BHT預測跳轉時,使用BTB傳來的路預測資訊。根據BHT的結果決定是在taken或者ntaken的表中取出預測的資訊,在根據Cache的哪一路命中取出BTB中儲存的路預測資訊,用該預測資訊,作為預測結果。
4、來自IP階段的reissue_pcload訊號,代表當路預測發生錯誤時,即預測的路取出的Tag沒有命中時,就需要reissue該pc,同時將實際的命中資訊,作為重新發送該pc時的路預測資訊。
5、來自IF階段的pcload訊號,當L0_BTB預測跳轉時,使用L0_BTB的路預測資訊。
總結
本文為《玄鐵C910微架構學習》系列的第一篇文章,對高效能處理器玄鐵C910的L1指令快取的組成結構進行了詳細的介紹,針對玄鐵C910擴充套件的Cache操作的具體過程也進行了介紹,同時還介紹了指令快取記憶體中使用的提高效能的指令預取技術和降低功耗的路預測技術。
本系列後續的文章將對玄鐵C910處理器其它部分的具體工作過程和相關的最佳化技術進行詳細的分析,希望能給想要想學習高效能處理器的人提高一些幫助。
參考資料
[1] Patterson, David A & Hennessy, John L。 (2017)。
Computer Architecture: A Quantitative Approach (The Morgan Kaufmann Series in Computer Architecture and Design)。
(6th ed。)。
[2] 玄鐵C910使用者手冊
[3] 劉東啟,江滔,陳晨。 用於指令快取記憶體的路預測方法、訪問控制單元以及指令處理裝置[P]。 開曼群島:CN112559049A,2021-03-26。
[4]
https://
github。com/T-head-Semi/
openc910
[5] Chen C, Xiang X, Liu C, et al。 Xuantie-910: A commercial multi-core 12-stage pipeline out-of-order 64-bit high performance risc-v processor with vector extension: Industrial product[C]//2020 ACM/IEEE 47th Annual International Symposium on Computer Architecture (ISCA)。 IEEE, 2020: 52-64。
上一篇:網路工程師需要準備什麼資料?