孫彩霞 鄭 重 鄧 全 隋兵才 王永文 倪曉強(qiáng)
(國防科技大學(xué)計算機(jī)學(xué)院 長沙 410073)
(cxsun@nudt.edu.cn)
DMR是由國防科技大學(xué)計算機(jī)學(xué)院自研的一款兼容RISC-V架構(gòu)的亂序超標(biāo)量通用處理器核,主要面向高性能計算領(lǐng)域.
DMR支持用戶態(tài)(user-mode)、特權(quán)態(tài)(supervisor-mode)和機(jī)器態(tài)(machine-mode)三種特權(quán)級模式,兼容RV64G指令集規(guī)范[1],并進(jìn)行了自定義向量擴(kuò)展,虛存系統(tǒng)支持Sv39和Sv48[2],物理地址為44 b.
DMR的微架構(gòu)如圖1所示.取指寬度為256 b,即8條32 b指令;譯碼寬度、寄存器重命名寬度和指令分派寬度都是4;寄存器重命名采用統(tǒng)一的物理寄存器文件方式,如果沒有足夠的空閑物理寄存器,重命名過程將會發(fā)生阻塞;分派后的指令根據(jù)指令類型進(jìn)入相應(yīng)的指令調(diào)度隊列,同時也會進(jìn)入重定序緩沖(reorder buffer,ROB);采用分布式調(diào)度隊列,根據(jù)指令類型設(shè)置了整數(shù)調(diào)度隊列、訪存調(diào)度隊列和浮點調(diào)度隊列;調(diào)度隊列中的指令就緒后,就會被亂序調(diào)度執(zhí)行,每拍最多可以調(diào)度9條指令,其中3條整數(shù)指令、1條分支指令、2條load指令、1條store指令和2條浮點指令;指令被調(diào)度執(zhí)行時讀取寄存器文件獲取源操作數(shù),源操作數(shù)也可能來自旁路的數(shù)據(jù);指令提交按序進(jìn)行;指令Cache和數(shù)據(jù)Cache均為64 KB,4路組相聯(lián),Cache行大小均為64 B.
Fig.1 DMR microarchitecture圖1 DMR的微體系結(jié)構(gòu)
DMR的流水線如圖2所示.單周期整數(shù)流水線共有12級,取指4拍,然后是2拍的譯碼.第1拍進(jìn)行預(yù)譯碼并處理指令拆分和指令融合,第2拍譯碼出指令中的操作數(shù)信息,以供寄存器重命名時使用;REN為重命名站,DS為指令分派站,根據(jù)指令類型,將指令順序分派到相應(yīng)的指令調(diào)度隊列;ISS為指令發(fā)射站,發(fā)射后進(jìn)入RF站,讀取寄存器文件,讀出數(shù)據(jù)和旁路數(shù)據(jù)進(jìn)行選擇后送到執(zhí)行站EX,執(zhí)行結(jié)果在WB站被寫回到寄存器文件.
Fig.2 DMR pipeline圖2 DMR的流水線
數(shù)據(jù)Cache命中時的Load-to-use延時是4拍;為了實現(xiàn)較高主頻,浮點流水線在讀寄存器文件之后增加了一拍MUX用于數(shù)據(jù)選擇.
DMR采用TAGE(tagged geometric history length)[3-4]算法預(yù)測分支方向,所實現(xiàn)的TAGE結(jié)構(gòu)包含5個組件(component),即除了基本預(yù)測器組件外,還包含4個具有標(biāo)記的用不同歷史長度生成索引的預(yù)測組件;2K項的BTB(branch target buffer)、48項的RSB(return stack buffer)和512項的IPB(indirect prediction buffer)分別被用于預(yù)測不同類型的分支的目標(biāo)地址.
DMR在譯碼階段將整數(shù)和浮點之間的轉(zhuǎn)換指令拆分成2個內(nèi)部操作,轉(zhuǎn)換操作在浮點單元完成,而讀取整數(shù)寄存器文件或?qū)懭胝麛?shù)寄存器文件的操作在訪存部件完成,使得浮點執(zhí)行單元不需要讀寫整數(shù)寄存器文件,從而可以減少整數(shù)寄存器文件的讀寫端口數(shù)目、簡化整數(shù)數(shù)據(jù)旁路網(wǎng)絡(luò)的設(shè)計,同時也有利于物理實現(xiàn).
DMR在指令譯碼階段將某些指令組合融合成一條指令,然后進(jìn)行重命名、發(fā)射和執(zhí)行,從而提高指令實際發(fā)射寬度,并且可以減少指令占用的亂序執(zhí)行資源數(shù)目和降低調(diào)度開銷[5].
根據(jù)RISC-V架構(gòu)手冊的描述[1],結(jié)合DMR微架構(gòu)的特點,DMR實現(xiàn)了指令組合的融合,如表1所示.auipc指令和load指令融合,可以實現(xiàn)PC(program counter)相對的32 b偏移尋址的數(shù)據(jù)加載,auipc指令和jalr指令融合,可以實現(xiàn)PC相對的32 b偏移的分支跳轉(zhuǎn).
Table 1 Instruction Fusion in DMR表1 DMR中的指令融合組合
當(dāng)發(fā)生異?;蚍种д`預(yù)測、需要清除前瞻執(zhí)行的指令時,被清除指令對處理器有關(guān)狀態(tài)的影響同樣需要被清除,以恢復(fù)到前瞻指令未執(zhí)行之前的狀態(tài).前瞻寄存器重命名映射表就是需要被恢復(fù)的處理器狀態(tài)之一.
DMR維護(hù)了2個寄存器重命名映射表:前瞻映射表和體系結(jié)構(gòu)映射表.指令重命名時更新前瞻映射表,指令提交時更新體系結(jié)構(gòu)映射表.DMR在指令提交時才報告該指令觸發(fā)的異常,所以發(fā)生異常時,異常指令之前的所有指令都已經(jīng)完成對體系結(jié)構(gòu)映射表的修改,直接使用體系結(jié)構(gòu)映射表恢復(fù)前瞻映射表即可.而分支誤預(yù)測一旦發(fā)生,需要立即清除后續(xù)前瞻執(zhí)行的指令,這時前瞻映射表一般通過重建的方式進(jìn)行恢復(fù),重建完成前不能進(jìn)行寄存器的重命名,從而可能造成流水線停頓.DMR在分支指令進(jìn)行重命名時,會對當(dāng)前的前瞻映射表進(jìn)行備份,分支誤預(yù)測發(fā)生時使用該分支對應(yīng)的備份數(shù)據(jù)對前瞻映射表進(jìn)行快速恢復(fù),避免重命名映射表重建導(dǎo)致的流水線停頓.
DMR面向高性能計算進(jìn)行了浮點向量的自定義擴(kuò)展,該擴(kuò)展中浮點向量和浮點標(biāo)量共用一套體系結(jié)構(gòu)寄存器,標(biāo)量占用寄存器的低位部分.如圖3所示,其中D表示雙精度浮點,S表示單精度浮點.
Fig.3 Vector formats圖3 向量格式
除了基本的單、雙精度浮點計算操作和訪存操作外,自定義擴(kuò)展指令集還支持單、雙精度浮點向量乘加操作以及gather load/scatter store操作.
向量長度支持動態(tài)配置為128 b或256 b.DMR的浮點執(zhí)行單元實現(xiàn)了2條256 b流水線,雙精度浮點峰值運算性能可達(dá)到每個時鐘周期16個操作.
DMR采用覆蓋率驅(qū)動的多層次、多平臺功能驗證方法,如圖4所示.
驗證分為3個層次:單元級、核級和系統(tǒng)級.在單元級,針對不同的功能單元搭建了基于UVM(universal verification methodology)的軟模擬平臺和形式化驗證平臺,在核級,搭建了基于trace實時對比的軟模擬平臺,在系統(tǒng)級搭建了硬件仿真平臺.對單元級的軟模擬平臺和形式化驗證平臺收集的覆蓋率以及核級軟模擬平臺收集的覆蓋率進(jìn)行合并,統(tǒng)一管理.
DMR已經(jīng)在FPGA原型系統(tǒng)下成功啟動Linux OS,Core Mark分?jǐn)?shù)為5.12 MHz,在14 nm工藝下主頻可達(dá)到2 GHz.
Fig.4 Functional verification圖4 功能驗證方法