国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于RISC-V參數(shù)化超標(biāo)量處理器的優(yōu)化設(shè)計

2022-04-09 07:02劉有耀潘宇晨
計算機(jī)工程與應(yīng)用 2022年5期
關(guān)鍵詞:流水線寄存器分支

劉有耀,潘宇晨

西安郵電大學(xué) 電子工程學(xué)院,西安 710121

目前嵌入式領(lǐng)域市場具有很大的發(fā)展前景,但一直以來基本被ARM系列處理器占據(jù)。RISC-V是由加州大學(xué)伯克利分校(UCB)提出的一種開源精簡指令集架構(gòu)[1-4],作為一個新生的開源指令集架構(gòu),具有精簡、模塊化設(shè)計、開源等優(yōu)點,可以根據(jù)需求定制自定義customer指令[5],大大簡化了處理器的設(shè)計,也因此涌現(xiàn)了很多優(yōu)秀的開源設(shè)計[6]。目前開源的RISC-V處理器大多偏向于低功耗的嵌入式設(shè)計,例如E203、SCR1、PicoRV32和RI5CY等內(nèi)核均為標(biāo)量處理器。其設(shè)計的流水線階段相對較短,專注于低功耗嵌入式區(qū)域。PicoRV32是一個精簡的緊湊型內(nèi)核,能夠順序地處理每條指令,因此其平均IPC為0.25。在高性能開源處理器中,代表性設(shè)計有BOOM處理器[7],能夠參數(shù)化地定制各級流水線以及緩存的配置。但是其語言編寫采用了較為激進(jìn)的Chisel[8]語言進(jìn)行編寫,編譯生成所得,因此屬于機(jī)器生成代碼,具有更好的可擴(kuò)展性與可重用性。但是其人工可讀性比較差,學(xué)習(xí)曲線又非常陡峭,學(xué)習(xí)成本比較大。

在嵌入式微處理器設(shè)計,低功耗處理器一般采用簡單的單發(fā)射、順序執(zhí)行、寫回的策略進(jìn)行成本和性能的壓制。在較高性能處理器中,其主要的核心思想是通過指令級并行(instruction level parallelism,ILP)[9]來提升處理器的執(zhí)行多條指令的性能。在多發(fā)射時,采用分組式保留站對待發(fā)射指令進(jìn)行暫存,再進(jìn)行運算。執(zhí)行完提交相應(yīng)的提交請求進(jìn)入重排序中緩存[10],其亂序處理的機(jī)制可以大大提高處理器的性能[11]。

緩存和執(zhí)行單元的配置可以在一定程度上能夠代表處理器的性能。充足的緩存與運算單元可以保證流水線不被大量氣泡操作占用,最大程度上發(fā)揮多發(fā)射和亂序?qū)懟氐男阅堋?/p>

可執(zhí)行單元是由算術(shù)邏輯單元(ALU)、乘除法單元(MDU)等其他專用運算單元構(gòu)成,單元的數(shù)目可以直接提高處理器的性能,但也同時會帶來功耗收益的遞減。在處理器設(shè)計中,不同運算單元是處在同一級流水線上并行運算,向后級緩存寫入數(shù)據(jù)。對于不同單元的不同指令來說,需要為其分配不同的保留站進(jìn)行數(shù)據(jù)相關(guān)性檢測,且長周期執(zhí)行單元會阻塞短周期執(zhí)行單元的提交,造成處理器執(zhí)行單元的空閑操作。

緩存在超標(biāo)量處理器中充當(dāng)著保證發(fā)射和寫回的順序嚴(yán)格按照程序本意的指令順序執(zhí)行。一些處理器的指令分派的機(jī)制采用了一種物理寄存器文件,重命名表和重排序提交緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)。將傳統(tǒng)的重命名寄存器堆合并到提交緩沖區(qū)中,并使重命名表分離。在配置的6個保留站(reservation stations,RS)中,獲取用于每一個功能單元在下一執(zhí)行階段獲得的基本操作數(shù)和功能代碼,并通過比較調(diào)度指針識別最早發(fā)出的指令[12]。但是對于分布式保留站在指令發(fā)射時具有利用率低的特點,且若發(fā)布4條分支指令,需要構(gòu)建五個檢查點來支持未命中預(yù)測恢復(fù),這會帶來復(fù)雜檢查控制機(jī)制。同時,也有一種以非推測方式進(jìn)行的派遣提交被提出,從而避免了檢查點。用驗證緩沖(validation buffe,VB)結(jié)構(gòu)替換了傳統(tǒng)的ROB(reorder buffer,ROB)[13]。這種結(jié)構(gòu)會保持已分派的指令,直到它們成為非推測性的或被推測性的為止。但是這種結(jié)構(gòu)并沒有區(qū)分長端周期指令在寫回階段的不同,由于指令執(zhí)行時間的不確定性,該結(jié)構(gòu)只能將load/store指令單獨派遣,同時需要將不同的指令追蹤,分離為Pending_Readers、Valid_Remapping和compile這3種狀態(tài),提高了各模塊之間互聯(lián)的復(fù)雜度。和在較多運算單元時,提交給緩存的請求也越多。為了使在指令提交時減少阻塞的發(fā)生,在流水線訪存寫回階段將緩存劃分為指令類型、目標(biāo)和存儲緩存結(jié)構(gòu)。這種流水線方案,能夠?qū)LU算數(shù)邏輯指令與load/store指令進(jìn)行分類提交[14]。但是在指令的派遣時并未考慮到系統(tǒng)指令以及不定周期的指令對處理器的影響,其設(shè)計的緩存模塊大量集中于流水線的末尾階段,緩存無法匹配到各級流水線,可能導(dǎo)致處理器上限頻率降低。循環(huán)迭代的方式檢測寄存器的相關(guān)性的方式,提高了處理器的動態(tài)功耗,且在鎖存隊列滿時測出store指令時,最差情況下只能發(fā)射一條指令。

面對嵌入式多種復(fù)雜的性能需求時[15],需要一種能夠快速可配置的流水線結(jié)構(gòu)勝任不同的需求,并解決各級流水線的吞吐匹配問題。在此問題基礎(chǔ)上設(shè)計了一種優(yōu)化后的基于RISC-V的參數(shù)化超標(biāo)量處理器。處理器中的緩存分布在處理器的各個流水線階段,既可以取代流水線寄存器,對RISC-V處理器指令分類處理,直連化各級緩存接口,降低時延,同時擴(kuò)展了可駐留指令的上限。同時采用單周期運算單元與長周期運算單元級聯(lián),同類執(zhí)行單元并行執(zhí)行的方式,可以使數(shù)據(jù)流先通過ALU簡單計算,再流入后級執(zhí)行單元,緩存結(jié)合了集中式與分布式保留站的優(yōu)點,既可以達(dá)到前級單元的高效利用,又可以通過可配置后級[16]流水模塊,達(dá)到自由調(diào)整數(shù)據(jù)吞吐率的平衡。在對面積極端要求條件下,可僅配置一條32 bit指令的緩存容量與單個處理單元,達(dá)到對面積的折中。但是由于數(shù)據(jù)相關(guān)性的存在,以及cache位寬大小的限制,無限制地提高緩存大小與執(zhí)行單元的數(shù)量也只能帶來有限的性能提升與大量的功耗。因此,本設(shè)計更傾向于面向嵌入式領(lǐng)域的定制化CPU的優(yōu)化實現(xiàn)。

1 處理器架構(gòu)

本設(shè)計中設(shè)計了一種面向嵌入式的變長4級流水線結(jié)構(gòu),即“取指”“派遣”“執(zhí)行”“寫回”,對派遣階段進(jìn)行了兩次派遣處理,具有可配置各級流水線、亂序執(zhí)行、亂序?qū)懟氐奶攸c。

處理器緩存可分為以下幾類:指令接收來自指令存儲器或cache中的指令,同時承擔(dān)來自跳轉(zhuǎn)與分支指令預(yù)測后的指令拼接區(qū)域;一級派遣緩存可以直接在派遣時得出寄存器的狀態(tài),對系統(tǒng)指令采取特殊通路,對于算數(shù)類型且無相關(guān)性的指令可以立即發(fā)射;寄存器緩存在寫回階段需要考慮其提交順序[17];二級派遣緩存對乘除法與存取指令緩存后,合并其向重排序緩存的請求,對于多個乘除法和一個訪存模塊,可以復(fù)用一條指令提交通路。

處理器可執(zhí)行單元可分為:ALU與乘除法單元,可以根據(jù)實際應(yīng)用做到參數(shù)化可配置。

1.1 流水線結(jié)構(gòu)

處理器整體數(shù)據(jù)通路如圖1所示。其中,指令緩存(instruction buffer,IB)來自指令存儲器中的指令,同時也是分支跳轉(zhuǎn)指令的拼接緩存區(qū)。預(yù)測單元采用局部歷史分支預(yù)測器(local history),將每條分支指令的執(zhí)行歷史結(jié)果移入歷史分支寄存器(branch history register,BHR),通過歷史執(zhí)行的情況對其進(jìn)行預(yù)測(predict)[18]。來自一級派遣緩存(dispatch buffer,DB)和二級長指令派遣緩存(dispatch long instruction buffer,DLIB)共同組成長短指令的派遣緩存。DLIB不僅充當(dāng)了存取指令的緩沖等待區(qū),也是乘除法指令再派遣和運算結(jié)果的暫存。DLIB在釋放一條長指令時,同時可向RB與DB更新指令列表信息,同時提交多個ALU指令。更新指令列表信息和當(dāng)前退休指令數(shù)量有關(guān),提交指令的數(shù)量與當(dāng)前無數(shù)據(jù)相關(guān)的指令條數(shù)有關(guān)。

圖1 整體架構(gòu)設(shè)計圖Fig.1 Total frame

設(shè)計中采用了多個參數(shù)化的緩沖模塊來處理流水線中的各階段的數(shù)據(jù)的緩沖問題。可設(shè)置每一級緩存的接口數(shù)量和大小,面向不同的設(shè)計選擇性能與面積的折中。同時對(MUL/DIV unit,MDU)模塊采用級并聯(lián)復(fù)用長指令提交緩存的方式,進(jìn)行多級派遣。可提供多個MDU單元同時運算,減少端口的復(fù)雜度,降低流水線阻塞的概率,而面積開銷可以依據(jù)需求的MDU模塊以及特定的程序優(yōu)化,并不會很大。

本設(shè)計將RISC-V指令分為分支跳轉(zhuǎn)、ALU指令、系統(tǒng)指令、長周期指令等,利用對應(yīng)的控制與緩存模塊進(jìn)行緩存處理。在取指階段可適應(yīng)CPU外部存儲位寬進(jìn)行指令緩存,同時對緩存的指令調(diào)用預(yù)譯碼模塊和分支預(yù)測模塊對指令進(jìn)行預(yù)測合并緩存。在派遣階段將指令劃分為ALU指令、特殊指令(分支跳轉(zhuǎn)、環(huán)境調(diào)用、非法指令等)和長指令進(jìn)行相關(guān)性檢測后進(jìn)行分派處理,送入不同的執(zhí)行模塊。在執(zhí)行階段,長、短兩類指令分別在不同級流水線內(nèi)處理。普通的ALU指令結(jié)果,提交給寄存器緩存(regfile buffer,RB)處理。存儲指令和乘除法等指令,提交給二級長指令派遣緩存(dispatch long instruction buffer,DLIB)進(jìn)行再派遣處理。對于DLIB,采用分離派遣的方式與乘除法進(jìn)行數(shù)據(jù)交換,屬于兩類指令混合的多級派遣機(jī)制,以提高并行性。

1.2 超標(biāo)量實現(xiàn)

RISC-V指令集相較于ARM和MIPS指令集更為精簡,可以大大簡化硬件架構(gòu)的設(shè)計。

為確保每一級指令能夠源源不斷送入后級,將每一級的流水線寄存器替換為對應(yīng)的緩存,如取指譯碼階段為指令緩存(IB),譯碼執(zhí)行階段為派遣緩存(DB),執(zhí)行和訪存階段為長指令派遣緩存(DLIB),寫回階段為寄存器緩存(RB)。

在取指階段,根據(jù)RAM或Cache總線位寬,進(jìn)行配置。在緩沖器的剩余空間大于讀數(shù)據(jù)的位寬時,會自動發(fā)起讀指令的操作,以求填滿緩存。緩沖器的輸出為已成型的指令。由于本設(shè)計支持RISC-V壓縮指令集,指令長度可能是16 bit或32 bit,指令數(shù)目也不固定。因此輸出的比特數(shù)是16的倍數(shù)。每次取指時,將已保存在緩沖器的比特和剛從指令存儲器進(jìn)入的比特,這兩者按照前后順序連接在一起,作為譯碼的對象。

在譯碼派遣階段,譯碼多少條指令由下一級的需求決定。若下一級可以接受N條指令,則從IB中調(diào)用譯碼模塊盡量生成N條譯碼結(jié)果。RISC-V規(guī)整的指令格式可以通過bit[6∶0]7位操作碼(opcode)直接得出指令類型,通過功能碼(func)得到需要具體執(zhí)行的操作。對于操作數(shù)的獲取,在派遣緩存內(nèi)采用兩個黑名單,分別是Rs和Rd黑名單。讓每一條候選指令對照這兩個黑名單,當(dāng)發(fā)現(xiàn)Rs和Rd任意一個處于黑名單上,此條指令則不能進(jìn)入選中序列,應(yīng)被推移到下周期等待執(zhí)行。同時每個周期需要對Rs、Rd黑名單進(jìn)行更新,考察這條指令當(dāng)前的狀態(tài)下會影響那些操作數(shù)索引。只要當(dāng)前指令不在此黑名單,即可越級發(fā)射派遣。

在執(zhí)行階段,ALU、乘除法和LSU(計算地址)共同寫入長指令緩存(DLIB)中。此級緩存是逐步實現(xiàn)ALU指令的寫入權(quán)限的。

以圖2留存于緩存中的指令序列舉例。其中ALU0、ALU1、ALU2、ALU3送入RB緩沖器,MUL0、MUL1和LSU0送入DLIB緩沖器。ALU0有權(quán)限寫入寄存器組,但ALU0和ALU1卻不能寫入。在MUL0指令并沒有成功執(zhí)行時,寄存器組可以通過緩存器恢復(fù)到lsu0指令執(zhí)行之前的狀態(tài)。一旦LSU0指令成功執(zhí)行,寄存器緩存(RB)則允許放開此指令之后的ALU1和ALU2指令的寄存器寫入權(quán)限,和ALU0享有同等待遇。若MUL0異常,或未執(zhí)行完畢,RB則不允許其寫入寄存器,實現(xiàn)了指令的精確異常。因此RB會配合DLIB的執(zhí)行結(jié)果,退休一批ALU指令。

圖2 緩存指令序列Fig.2 Instruction sequence

在寫回階段,只有在外部存儲返回了響應(yīng)信號,store指令狀態(tài)才被判決執(zhí)行完畢,同時在執(zhí)行期間記錄索引,避免load指令訪問該外部存儲的地址空間。

1.3 互連線結(jié)構(gòu)

每一級緩存的端口數(shù)目、位寬由參數(shù)決定,每一級緩存接口將必要的數(shù)據(jù)信息互聯(lián),并不需要復(fù)雜的公共數(shù)據(jù)總線,減少了握手所帶來的時序損耗。后級緩存需要向前級緩存發(fā)出自己的空滿信號[19],以確保流水線的正常運行。在長指令處理的互聯(lián)情況中,采用多級派遣方式,逐級緩存上級的譯碼包、操作數(shù)或訪存地址,因此可以提前在二級緩存DLIB剛緩存乘除法指令時即開始運算,提高并行性。DLIB向DB與RB緩存之間提交退休的長周期指令數(shù),其自身也可以同時移除多條長指令,移除的指令結(jié)果直接寫入RB內(nèi)的寄存器組。ALU指令可以直接使用長指令的數(shù)據(jù)通路,但只由RB進(jìn)行退休。因為ALU指令并不能隨時寫入寄存器組。在長指令出現(xiàn)異常的情況時,寄存器組不能讓該條異常指令之后的指令寫入。系統(tǒng)模塊(SYS)和指令緩存器(IB)之間互聯(lián),控制系統(tǒng)指令和地址跳轉(zhuǎn)等指令的操作。處理器中緩存與運算單元直接的互聯(lián)結(jié)構(gòu)直接的功能可以用簡單的互聯(lián)圖3來表示。

圖3 互聯(lián)數(shù)據(jù)圖Fig.3 Interconnection data graph

1.4 可配置化

四類緩存的基礎(chǔ)可配置參數(shù)如下,輸入位寬,輸出位寬與暫存位寬。位寬均為2n次冪。如位寬為128 bit,可容納4條32位指令與8條16位指令。

指令緩存中可配置最小指令位寬以支持壓縮指令集,為了處理多個分支指令,支持可配的預(yù)測指令的暫存位寬,在分支預(yù)測失敗時,可直接從緩存中讀取正確指令。每個分支指令在進(jìn)入分支暫存緩存后,它后續(xù)的指令也能放行進(jìn)入后級的緩沖器。

分支預(yù)測單元的可配置參數(shù)為局部歷史分支預(yù)測器(BHR)位寬,最高可配置為5 bit。當(dāng)配置為2 bit時,即為2比特飽和計數(shù)器,提供基礎(chǔ)的分支預(yù)測能力。

可執(zhí)行單元的配置參數(shù)為級并聯(lián)單元的個數(shù)和與其連接緩存接口個數(shù)。當(dāng)配置ALU個數(shù)為3時,MDU為2,指令長度為32時,一級派遣緩存接口位寬可以自適應(yīng)位寬配置為指令長度乘以ALU單元數(shù)(XLEN×ALEN,32×3=96 bit)。同理,長指令派遣緩存接口的位寬為2個MDU加上1個LSU模塊的位寬也為96 bit。

以上參數(shù)均通過以Makefile腳本宏的方式進(jìn)行寫入編譯,以實現(xiàn)簡便化的定制流程。

2 處理機(jī)制

2.1 兩級派遣

指令緩存器(instruction buffer)連接譯碼模塊,將RISC-V指令劃分為長周期指令、算數(shù)指令、跳轉(zhuǎn)指令、特殊/系統(tǒng)指令(CSR寄存器指令、非法指令、柵欄指令等)。對于無條件跳轉(zhuǎn)指令直接進(jìn)行拼接指令緩存;分支指令等待預(yù)測結(jié)果,Jalr指令等待Rs寄存器結(jié)果,拼接指令緩存;CSR寄存器操作指令,直接進(jìn)行寄存器操作;Fence指令暫停取指后,等待派遣模塊接收;最終只能有運算指令可以進(jìn)入一級派遣緩存。在指令緩存器中,只能有一條跳轉(zhuǎn)指令或者特殊/系統(tǒng)指令被執(zhí)行。由于這些指令的特殊性,導(dǎo)致了必須嚴(yán)格按照指令順序,在其他指令執(zhí)行完畢后,才能交付。跳轉(zhuǎn)和分支指令,是一種具有ALU屬性的指令。跳轉(zhuǎn)之后將新指令進(jìn)行拼接并不影響后續(xù)的指令流的運行。

DB緩存接收上級緩存器送來的ALU、存取、乘除法指令。DB緩存會通過直接互聯(lián)監(jiān)聽寄存器的占用信息以及后級緩存、運算單元的空閑信息。對指令進(jìn)行相關(guān)性檢測,對沒有沖突的指令進(jìn)行派遣。派遣乘除法時,進(jìn)入長指令緩存模塊,單獨對其再派遣和結(jié)果回讀。派遣機(jī)制流程如圖4所示。

圖4 派遣機(jī)制流程圖Fig.4 Dispatch mechanism

2.1.1 ALU派遣執(zhí)行機(jī)制

ALU指令派遣的條件如下:(1)RB緩存有剩余空間;(2)ALU運算單元有空閑;(3)相關(guān)性檢測通過。

滿足一級派遣的指令進(jìn)入ALU執(zhí)行階段,剩下的按照順序留存在一級派遣DB內(nèi)。在下一個周期到來時,保存在DB緩存內(nèi)的指令優(yōu)先進(jìn)行判斷派遣。每個ALU數(shù)據(jù)通路傳送的是經(jīng)過譯碼打包后的數(shù)組,包含了指令的功能碼,操作數(shù)等信息。ALU計算后的數(shù)據(jù)分為兩種情況:(1)正常的ALU指令結(jié)果,寫回到RB中。(2)計算出MEM指令的地址,打包MDU指令送入到DLIB中。

2.1.2 長指令派遣執(zhí)行機(jī)制

將原有與ALU同級的多周期MDU單元后移,其運算結(jié)果與數(shù)據(jù)存放于原有的MEM指令緩存器中,合并為長指令緩存器。在合并后的再派遣緩存中,存放著排序好的等待退休的存取指令和乘除法指令。當(dāng)有長指令需要退休時,依據(jù)序號和ALU指令一同送入RB中,由RB在進(jìn)一步的仲裁寫入結(jié)果。

LSU/MDU指令被派遣的條件如下:(1)二級DLIB緩存有剩余空間;(2)在先前的指令周期內(nèi)有LSU/MDU在第一級派遣緩存模塊未被發(fā)射,先發(fā)射一級派遣緩存的指令。在本周期進(jìn)入的LSU/MDU指令應(yīng)保存在一級DB緩存中等待派遣。對于執(zhí)行時間不定的指令,不能有后級指令超越前級指令的行為。

執(zhí)行分別在兩類數(shù)據(jù)通路內(nèi)處理。ALU接收從派遣模塊送來的指令,并再次將指令分成三類:算數(shù)指令、存取指令、乘除法指令。算數(shù)指令直接在ALU內(nèi)完成運算,送給RB進(jìn)行重排序評估。MEM指令和乘除法指令混合送入二級DILB進(jìn)行緩存。

因為這三種指令的執(zhí)行階段不一樣,故稱之為變長流水線結(jié)構(gòu)。在執(zhí)行乘除法指令時,由于DILB緩存是第二級派遣單元,已經(jīng)保存了之前存儲的和指令類型和操作數(shù)的緩存元素,因此可以提前在DILB緩存剛接收乘除法指令時即開始運算。

復(fù)用結(jié)構(gòu)執(zhí)行操作如下:(1)當(dāng)有長指令進(jìn)入二級派遣緩存時,通過功能碼檢測其指令類型,并根據(jù)類型進(jìn)行序號若是MEM指令交給LSU處理,若是MUL/DIV指令交給MDU處理。(2)若是MEM指令,檢測LSU單元是否被占用。占用時在Buffer中進(jìn)行等待調(diào)度,空閑時進(jìn)行內(nèi)存讀寫操作,序號(order)進(jìn)行加1。在二次派遣和指令提交時,序號自減,只需提交統(tǒng)一的結(jié)果即可。(3)若是MUL/DIV指令,檢測MDU單元是否被占用。查詢送入的指令序號(md_ord=n),取出緩存中暫存的操作數(shù)和功能碼送往動態(tài)分配的MDU。同時準(zhǔn)備下一條指令的序號(md_ord_next=N)。直到讀出下一條N為緩存的最高容量,說明無需要處理的指令。與MEM指令不同的是二級派遣緩存可以對應(yīng)多個MDU單元同時運算。通過與運算單元直連的簡單握手信號進(jìn)行通信,存儲來自MDU的運算結(jié)果,待下一個周期送入REB進(jìn)行寫入寄存器。

兩種指令可以混合緩存來自上級模塊下發(fā)的指令。緩存的指令參數(shù)段存放指令的類型、Rd索引號、有效標(biāo)志和功能碼。若是乘除法和load指令,Rd為結(jié)果或加載的目的寄存器。若是store指令,則為全0。其中l(wèi)ong_addr來自load/store指令的地址或者是乘除法的一個操作數(shù)。long_wdata存儲來自store指令的Rs2或者是乘除法的另一個操作數(shù)。

其具體行為操作如圖5所示。

圖5 長指令派遣Fig.4 Long instruction dispatch

通過此部分二次派遣的方法,一方面減少互聯(lián)復(fù)雜度,只需發(fā)送整體的提交信息,使一級調(diào)度緩存和RB等模塊直連的信號大大縮減。同時重用了DILB的緩存空間,相當(dāng)于增加了MDU的緩存大小,使運算單元不容易受制于緩存大小而造成流水線阻塞。對于改進(jìn)后的面積開銷,只會增大因需要存儲MDU返回結(jié)果的資源。

2.1.3 長指令派遣執(zhí)行機(jī)制

特殊指令可以分為這兩類:error、illegal、sys、fencei、fence、csr系統(tǒng)非法類和branch、jalr、jal正常跳轉(zhuǎn)類。這些指令會在指令緩存中進(jìn)行處理,系統(tǒng)等指令會在下一級派遣緩存DB之前,送給SYS模塊進(jìn)行跳轉(zhuǎn)到異常程序入口或進(jìn)行csr讀寫操作。

sys模塊會實現(xiàn)CSR寄存器的相關(guān)讀寫操作,它是處理系統(tǒng)指令和CSR指令并控制整個CPU狀態(tài)的模塊。sys模型在對CSR寄存器進(jìn)行處理時。一般會涉及到系統(tǒng)跳轉(zhuǎn),會取到一個新的PC地址進(jìn)行取指。同時會有清除所有緩存內(nèi)指令的操作。

跳轉(zhuǎn)指令會將下一條指令直接進(jìn)行拼接,分支指令根據(jù)預(yù)測的結(jié)果覺得是否需要進(jìn)行拼接。當(dāng)分支指令的緩存清空時,且下級緩存被清空時(正常指令執(zhí)行完),可以執(zhí)行系統(tǒng)指令。送往DB緩存的將只有算術(shù)存取指令的功能碼(func)和對源操作數(shù)和目的操作數(shù)的索引號(index)。

為了管理經(jīng)過預(yù)測執(zhí)行的指令,為每一條指令設(shè)置一個預(yù)測真實梯度grade。grade表示當(dāng)前指令前有多少條分支指令未給出實際的結(jié)果。帶不同grade標(biāo)準(zhǔn)的指令允許進(jìn)入后級流水線。當(dāng)一條分支指令被確認(rèn)預(yù)測正確,那么grade等級會自動減1。只有g(shù)rade等級為0的指令可以進(jìn)入寄存器堆或?qū)懭雖em中。如圖6所示,只有ALU0和ALU1指令允許寫入寄存器堆中。

圖6 預(yù)測指令真實梯度Fig.6 Forecast true grade

2.2 重排序?qū)懟?/h3>

RB緩存主要負(fù)責(zé)存儲來自ALU、DLIB、CSR指令中需要的寄存器堆數(shù)據(jù)。RB緩存中內(nèi)嵌了32個RISC-V標(biāo)準(zhǔn)寄存器組,因而可以方便地對其進(jìn)行操作。同時RB也為DLIB設(shè)置了專門訪問通用寄存器的接口,方便ALU指令再排序后能夠在長指令提交后同時寫入寄存器。ALU送來的數(shù)據(jù)夾雜著存取指令的地址,RB仲裁器需要仲裁出來自ALU的算數(shù)指令,將其寫入緩存并分配序號。每新來一個MEM指令時,對序號加1,若是ALU指令,則不變。每個周期進(jìn)行評估,對序號等于0的數(shù)據(jù)才允許寫入寄存器堆。序號大于0的,只能保存在RB的緩存器內(nèi)。如果發(fā)生序號為1的MEM指令發(fā)生了異常(MEM指令必須嚴(yán)格順序讀寫,所以只有序號為1才能進(jìn)入讀寫序列),只需要清除包括序號為1之后的數(shù)據(jù)即可。保證了寄存器堆的數(shù)據(jù)正確,同時可以精確定位異常指令。

若MEM指令正確執(zhí)行,則RB中的序號自動減1,允許新數(shù)據(jù)寫入寄存器堆。這種分類隔離的方式避免了MEM指令異常而導(dǎo)致的數(shù)據(jù)錯誤提交。同時對于后續(xù)指令取用寄存器堆內(nèi)數(shù)據(jù)時,不僅要從寄存器堆內(nèi)取用,同時還要從RB緩存中取出進(jìn)行比對。對于不同的數(shù)據(jù),以RB緩存中的數(shù)據(jù)作為基準(zhǔn),這保證了運算單元索引的寄存器中的數(shù)據(jù)是被正常提交所得的。

3 實驗結(jié)果及分析

指令集驗證采用RISC-V社區(qū)開源的指令集自測試程序。該測試程序用匯編語言編寫,屬于指令兼容性測試。該方法通過循環(huán)計數(shù),檢測寄存器的值來判斷測試是指令集架構(gòu)中定義的指令是否符合RISC-V的標(biāo)準(zhǔn)。使用自測試下,處理器通過了RISC-V的IMC(整數(shù)、乘除法、壓縮)指令集的測試。

在128 bit的取指位寬情況下,對不同發(fā)射數(shù)的緩存進(jìn)行了匹配,評估了不同緩存接口數(shù)與大小下的性能,同時運行了CoreMark與Dhrystones的跑分測試。Dhrystone用于衡量處理器的整數(shù)運算處理性能,比如數(shù)據(jù)的賦值、間接指針函數(shù)調(diào)用、賦值等常見操作,有是否選擇編譯器優(yōu)化兩種情況。CoreMark程序包含了常見的矩陣運算、鏈表操作、狀態(tài)機(jī)和循環(huán)冗余校驗(CRC)等算法。這些測試程序都能較好地衡量處理器的性能。

可配置性,是通過Makefile腳本中sed命令,直接修改define.v文件中相應(yīng)的定義來實現(xiàn)。在定義文件中,可定義的選項有指令緩存、派遣緩存、長指令緩存、寄存器緩存大小、ALU單元、MDU單元和分支預(yù)測位寬。如:直接sed修改`define MDU_NUM為2。

為了能夠更加簡便化實現(xiàn)對應(yīng)測試環(huán)境的性能測試,在配置選項中加入了launch選項(編譯器優(yōu)化),分別對應(yīng)該發(fā)射數(shù)在對應(yīng)測試程序下的最優(yōu)配置。

處理器性能主要依賴于合成基準(zhǔn)測試程序進(jìn)行評估。在不同基準(zhǔn)程序中IPC可能會有所差異。在處理前和后分別采用modelsim仿真記錄運行程序的時間,取平均,可以得到各個配置下的IPC。

下列配置是在Dhrystones和CoreMark測試程序?qū)Τ顺ǚ治龊筮M(jìn)行最優(yōu)配置。若目標(biāo)程序采用此類運算較多,可直接進(jìn)行增加,所以此設(shè)計更傾向于嵌入式領(lǐng)域中運算指令密集型的應(yīng)用處理。

1發(fā)射:ALU:1,MDU:1,IB緩存:2,DB緩存:2,DLIB緩存:4,RB緩存:4。

2發(fā)射:ALU:2,MDU:1,IB緩存:3,DB緩存:4,DLIB緩存:8,RB緩存:8。

3發(fā)射:ALU:3,MDU:2,IB緩存:5,DB緩存:7,DLIB緩存:14,RB緩存:14。

4發(fā)射:ALU:4,MDU:2,IB緩存:6,DB緩存:8,DLIB緩存:16,RB緩存:16。

5發(fā)射:ALU:5,MDU:3,IB緩存:8,DB緩存:10,DLIB緩存:20,RB緩存:20。

圖7測試表明,不同發(fā)射數(shù)對性能的影響是巨大的。但隨著發(fā)射數(shù)的提升,處理器的性能增益也會有所降低,這主要是由于指令的相關(guān)性約束所導(dǎo)致的[20]。在這幾種跑分場景中可以發(fā)現(xiàn)3發(fā)射的配置占優(yōu)。越高的取指位寬和運算單元可以顯著提升處理器性能。

圖7 不同發(fā)射數(shù)下IPCFig.7 IPC with different emission numbers

為了支持取指,cache的功耗與面積代價會不可避免地增加[21],但是本設(shè)計理論上可以靈活地對接不同的存儲取指位寬,加上不同的運算單元和發(fā)射數(shù)目,達(dá)到性能與面積的平衡。

在采用三發(fā)射的配置,即ALU:3,MDU:2的基準(zhǔn),表1為在TMSC 28HPC+工藝綜合和FPGA實現(xiàn)兩種派遣指令內(nèi)核的配置,即在相同運算單元數(shù)目下,分別采用基準(zhǔn)程序測試了在MDU與ALU同級流水線與緩存復(fù)用派遣下的性能。用不同模式下的平均跑分與邏輯單元數(shù)目的比值,Average Cells/IPC,作為一個評判依據(jù)。值越低,其單位性能下所占用的數(shù)目越少。在采用復(fù)用派遣后,因需要緩存從MDU來的指令,需要適當(dāng)增大DILB緩存提升性能而帶來一定面積開銷。

表1 不同派遣模式參數(shù)對比Table 1 Comparison of different mode parameters

單級派遣即是乘除法MDU單元與ALU單元處在同級流水線中的執(zhí)行階段,LSU訪存模塊處于訪存階段。這種做法在執(zhí)行乘法指令時可以快一個周期,但是此類指令為長周期指令,需要為此指令類指令再增加另外的派遣緩存,在無此類指令時不工作。在訪存指令執(zhí)行時,需要為所有執(zhí)行單元設(shè)計一個重排序緩沖區(qū),該緩沖區(qū)需要時刻接受來自公共數(shù)據(jù)總線的釋放信號,這無疑增大了總線復(fù)雜度。

復(fù)用派遣即為本設(shè)計所采用的方法。所有執(zhí)行和訪存指令均通過派遣緩存(DB),提高了緩存利用率。同時將乘除法單元(MDU)移至訪存階段,由于LSU和MDU指令均為長周期指令,長指令緩存(DLIB)能夠更加有效管理指令執(zhí)行的流向。普通指令結(jié)果即可流向寄存器緩存(RB),乘除法指令在運算結(jié)束后也可暫存在DLIB,隨即流向RB。LSU指令,對于load指令可直接操作RB從Regfiles取操作數(shù),Store指令直接訪問外部Memory。同時僅在有需要通信的緩存之間以直接連線的方式,既可以高效完成功能,又可以降低設(shè)計復(fù)雜度。

可以看到,由于MDU單元需要通過二級DLIB緩存,所以需要適當(dāng)增大此部分緩存的大小,總體采用的邏輯門數(shù)略有增加,這部分面積開銷由總線控制模塊,DB和DLIB共同承擔(dān)。但同時性能也有提升,同時簡化了復(fù)雜的互聯(lián)機(jī)制。對于乘除法和load指令來說,其目的操作數(shù)都是RISC-V內(nèi)部規(guī)劃的32個32 bit寄存器。其數(shù)據(jù)流索引被記錄在DLIB中,可以直接寫入到RB中,當(dāng)無指令沖突時,即可寫入寄存器堆,實現(xiàn)指令退休。store指令為目的操作數(shù)為外部存儲的空間,在store指令執(zhí)行中,DLIB可以避免load指令訪問該外部存儲的地址空間。

采用TMSC 28HPC+工藝,在200 MHz頻率下對本設(shè)計進(jìn)行綜合。采用CoreMark 5 000次迭代,和Dhrystone進(jìn)行FPGA功能驗證。通過配置發(fā)射數(shù),依據(jù)各個執(zhí)行時間結(jié)果計算出不同基準(zhǔn)測試程序下的IPC數(shù),并平均化處理,得到在不同發(fā)射數(shù)下的平均IPC。結(jié)果表明,本設(shè)計配置在2/4發(fā)射時,已較為接近知名的BOOM處理器。如表2所示,相較于同類型處理器IPC分別有122.1%、122.3%和176.8%的提升。且采用復(fù)用派遣后內(nèi)核面積僅增大8.1%。

表2 不同處理器性能對比Table 2 Performance comparison of different processors

表3所示為在最優(yōu)配置下(ALU:3,MDU:2)各個緩存與Top模塊在TMSC 28HPC+工藝庫下綜合參數(shù)。得出所需的門電路單元的數(shù)目和面積等參數(shù)信息。緩存單元容量與總線位寬與邏輯運算單元數(shù)量息息相關(guān)。當(dāng)取指位寬與ALU增加時,IB與DB也應(yīng)增加適應(yīng)其性能。

表3 主要模塊綜合結(jié)果Table 3 Synthesis results of main modules

從模塊綜合結(jié)果來看,三類緩存中,派遣緩存(DB)占用資源最多。因為所有指令均要經(jīng)過相關(guān)性檢測才能從流水線中被派遣,未滿足條件的應(yīng)當(dāng)留在此階段,等待發(fā)射。

得益于可配置的緩存接口,不僅在較高性能的處理器中占有優(yōu)勢,當(dāng)配置為單發(fā)射順序執(zhí)行時,因引入了緩存,雖然面積會大于其他低功耗處理器,但仍在可接受范圍內(nèi),且性能較其他處理器仍占有優(yōu)勢。此時設(shè)計為在配置1發(fā)射時,同時配置分支預(yù)測為2 bit時情況。作為通用型處理器,本設(shè)計與幾類嵌入式處理器邏輯門數(shù),跑分等性能方面進(jìn)行了對比。表4為最低配置時相較于ARM Cortex-M系列和開源RISC-V低功耗處理器的性能對比。

表4 單發(fā)射處理器對比Table 4 Single transmitter processor comparison

4 結(jié)束語

本文通過對簡便的參數(shù)化配置,實現(xiàn)了一種基于RISC-V開源指令集的超標(biāo)量微架構(gòu),通過分類指令的數(shù)據(jù)通路,不同周期的執(zhí)行單元采用級聯(lián)與并行的混合分布方式,將充當(dāng)排序緩存中的指令再派遣,達(dá)到指令暫存和分類執(zhí)行的目的。該方案通過定制優(yōu)化后的取指中的分支預(yù)測,執(zhí)行中的混合派遣,緩存與執(zhí)行單元,直連的簡潔,等CPU流水線中關(guān)鍵的性能優(yōu)化點,改善處理器中流水線不匹配以及緩存堵塞的問題。

最終,本設(shè)計在FPGA開發(fā)板上完成功能處理器功能驗證,并在TSMC 28HPC+工藝上進(jìn)行了面積綜合。受益于上述描述的各級流水線的性能點優(yōu)化,在本設(shè)計的最佳配置中,性能相比同類型處理器IPC提升132.4%;在單發(fā)射最低配置中,性能和邏輯門數(shù)與對應(yīng)級別的低功耗處理器持平。針對嵌入式多樣化的應(yīng)有方向,下一步研究將此處理器應(yīng)用到神經(jīng)網(wǎng)絡(luò)的向量化處理中,設(shè)計特定指令集并在長指令派遣單元中集成更多的專用并行處理單元,實現(xiàn)算法的并行化處理,專用領(lǐng)域的加速研究。

猜你喜歡
流水線寄存器分支
一類離散時間反饋控制系統(tǒng)Hopf分支研究
軟件多分支開發(fā)代碼漏合問題及解決途徑①
Lite寄存器模型的設(shè)計與實現(xiàn)
流水線
基于PLC的飲料灌裝流水線設(shè)計
巧分支與枝
二進(jìn)制翻譯中動靜結(jié)合的寄存器分配優(yōu)化方法
移位寄存器及算術(shù)運算應(yīng)用
流水線
汽車噴漆流水線的應(yīng)用與研究
修武县| 华池县| 阿拉善右旗| 洱源县| 建平县| 江孜县| 南丹县| 紫云| 怀仁县| 都昌县| 溆浦县| 宜宾市| 绵阳市| 富顺县| 冕宁县| 南郑县| 台江县| 德江县| 东阿县| 龙泉市| 乌审旗| 治多县| 商水县| 黄浦区| 英超| 阳朔县| 四子王旗| 舟曲县| 句容市| 会宁县| 兖州市| 永仁县| 通州市| 日照市| 日土县| 图片| 苏尼特右旗| 崇义县| 清徐县| 秦安县| 边坝县|