孫建輝,王春棟
(中國電子科技集團(tuán)公司第58研究所,江蘇 無錫 214035)
本文設(shè)計的OPS1-CPU是RISC的一種,其只將最常用的指令在RISC處理器中實現(xiàn),其他指令由編譯器綜合實現(xiàn)。這樣RISC的硬件結(jié)構(gòu)相對CISC比較簡單,通過解決流水線引入的競爭與冒險,將CPI(Cycles Per Instruction)推到最大。通過研究與改善其編譯系統(tǒng),可以用編譯器對整個CPU系統(tǒng)進(jìn)行優(yōu)化。本文的編譯系統(tǒng)可以實現(xiàn)對設(shè)計的OPS1-CPU進(jìn)行編譯及優(yōu)化。
MIPS[1]是RISC處理器中的一種。MIPS即無內(nèi)部互鎖流水級的微處理器(Microprocessor without interlocked piped stages),其機制是盡量避免流水線中的各種相關(guān)問題,使流水線得以順暢地實現(xiàn)??梢酝ㄟ^研究指令的具體執(zhí)行情況以及根據(jù)流水線的具體執(zhí)行情況,增加競爭與冒險檢測模塊,使設(shè)計的流水線得以順暢實現(xiàn)。
MIPS-CPU包含5級流水線,如圖1所示,分別是:
(1)IF/ID(Istruction Fetch&Instruction Decode),指令取指,根據(jù)程序存儲器尋址計數(shù)器PC來對應(yīng)讀取程序數(shù)據(jù),PC指向下一條指令,并且對取出的指令進(jìn)行解碼,解碼后的信號為控制信號,這些控制信號被送到EX級以及其他級,指令在執(zhí)行級需要來自寄存器堆的兩個操作數(shù),這兩個操作數(shù)在譯碼級被送到ALU的a和b入口,同時譯碼級還把ALU運算操作信號送到ALU;譯碼器一旦識別出非條件跳轉(zhuǎn)后,立即通知取指級IF。識別條件跳轉(zhuǎn)后,根據(jù)標(biāo)志位判別跳轉(zhuǎn)結(jié)果并決定是否立即通知取指令級IF。
(2)RF(Register Fetch /generate next pc(branch included)),進(jìn)行寄存器文件獲取以及下一條PC地址的獲取或產(chǎn)生,其中包括分支跳轉(zhuǎn)情況。
(3)EX(Execution),指令執(zhí)行,主要通過ALU運算。
(4)MA(Memory Access),存儲器與外部設(shè)備訪問級:數(shù)據(jù)存儲器或外設(shè)的讀寫(僅load/store指令)。
(5)WB(Write-Back),寫回寄存器堆。
第4級流水線是專門為load/store指令設(shè)計的,如圖2、3所示,指令load/stotre執(zhí)行過程中的數(shù)據(jù)通道仍然要經(jīng)過:(1)取指令&譯碼模塊;(2)計算下一條指令的程序存儲器的地址;(3)寄存器堆中的寄存器rs到ALU的輸入數(shù)據(jù)A,指令中的立即數(shù)到ALU的輸入數(shù)據(jù)B;(4)ALU執(zhí)行加運算,計算數(shù)據(jù)存儲器的訪問地址;(5)ALU的運算結(jié)果R到通往數(shù)據(jù)存儲器的地址總線;(6)來自數(shù)據(jù)存儲器的數(shù)據(jù)總線通往寄存器堆的寄存器rt。
可見,load/store指令也會像非存儲器訪問指令(比如add指令)一樣經(jīng)過相同的流水線數(shù)據(jù)通道,因而本文設(shè)計的MIPS-CPU將存儲器訪問指令與非存儲器訪問指令統(tǒng)一于5級流水線來實現(xiàn)。
同時需要考慮“冒險”檢測電路以及前饋電路設(shè)計。由于每個時鐘周期獲取的指令數(shù)量為1條,因而本文設(shè)計的MIPS-CPU是單發(fā)射極的MIPS-CPU。
圖4是本文設(shè)計的MIPS-CPU的整體架構(gòu)圖[2],在本圖中標(biāo)明了各個模塊的名字。采用此種架構(gòu)的原因是為了配合5級流水線結(jié)構(gòu)以及冒險檢測、數(shù)據(jù)前饋模塊而設(shè)計的。主要由Device_Ctrl(控制模塊)、Hazard_Detection_Unit(競爭檢測模塊)、P C_G E N(程序存儲器地址產(chǎn)生模塊)、Instruct_Memory(指令存儲器模塊)、Decode(譯碼模塊)、CMPR&FWD(比較跳轉(zhuǎn)與前饋檢測模塊)、Data_Memory_ctrl(數(shù)據(jù)存儲器控制模塊)、ALU(算術(shù)運算單元)、Forwarding_Unit(前饋模塊)、Ext(執(zhí)行模塊)以及其他MUX模塊、門級模塊、數(shù)據(jù)總線、地址總線、控制總線等組成。
流水線程序轉(zhuǎn)移將會產(chǎn)生一個很嚴(yán)重的問題,即程序必須在解碼后才知道是轉(zhuǎn)移指令,而程序的執(zhí)行是在第3個級的執(zhí)行周期才跳轉(zhuǎn)到所要轉(zhuǎn)移到的地址。若不加以判斷處理而繼續(xù)處理下去,會將原本要轉(zhuǎn)移而不執(zhí)行的指令繼續(xù)執(zhí)行下去,這種現(xiàn)象稱為“冒險”。本文設(shè)計的MIPS-CPU的轉(zhuǎn)移執(zhí)行采用的處理方式是:把下面兩個程序沖刷掉(FLUSH)。也就是說將轉(zhuǎn)移指令后的指令改為00H指令的NOP不處理運算,而所有的控制信號都要被禁止。
流水線對應(yīng)于數(shù)據(jù)序列執(zhí)行的數(shù)據(jù)冒險(HAZARD)處理,由于流水線的級數(shù)引起的數(shù)據(jù)寫回或者數(shù)據(jù)存儲器內(nèi)容的讀取或者存取的延遲使得后續(xù)指令在譯碼級所獲取的數(shù)據(jù)操作數(shù)內(nèi)容不是立即更新的,因而造成了數(shù)據(jù)冒險。為了解決數(shù)據(jù)冒險,可以把數(shù)據(jù)寫回或者數(shù)據(jù)存儲器內(nèi)容的寫回在第三流水線級EXT級執(zhí)行,而不經(jīng)過流水線的底級存儲器讀取、寫回或者流水線的第5級數(shù)據(jù)寫回級,而不是等其將數(shù)據(jù)寫入寄存器的MEM/WB管線處理后才予以讀取,而改在程序執(zhí)行到EXT級就將數(shù)據(jù)前饋給下面才程序的正在讀取寄存器的ID/EXT流水線路徑。
本文設(shè)計的MIPS-CPU硬件系統(tǒng)完全被GNU所兼容,所以完全可以適用(并且本文設(shè)計的MIPSCPU的軟件編譯與調(diào)試系統(tǒng)符合GNU標(biāo)準(zhǔn))用已經(jīng)存在的基于GNU的編譯系統(tǒng)進(jìn)行高級或中級編程語言的編寫,比如C與C++語言,來完成應(yīng)用程序的開發(fā),然后通過gccmips_elf仿真器來進(jìn)行高層架構(gòu)分析、程序編譯、軟件調(diào)試、程序運行結(jié)果以及代碼效率分析[3]。利用該平臺提供的C語言庫文件,可以實現(xiàn)基于OPS1-CPU應(yīng)用程序的開發(fā)。比如,對于計算∏的應(yīng)用程序cal_PI.c,使用基于Windows-x86-DOS的gccmips_elf仿真器進(jìn)行編譯與執(zhí)行,并且通過COM1口傳輸?shù)浇K端顯示,如圖5所示。
圖5 cal_PI-2函數(shù)的批處理過程
該仿真器要編譯并且產(chǎn)生向量文件,即16進(jìn)制的機器碼,并且產(chǎn)生Modelsim下載的存儲器RTL級的向量模型文件。并且同時產(chǎn)生QUARTUS II下載驗證的QU2_RAM0~3.MIF文件。
再比如,通過使用編譯器對中斷函數(shù)執(zhí)行批處理文件得到的RTL(sim_ram.v)文件進(jìn)行Modelsim仿真,得到結(jié)果如圖7所示。
圖6 Pi的精確計算結(jié)果
圖7 中斷函數(shù)的仿真結(jié)果
通過仿真器的驗證,表明本文設(shè)計的MIPS-CPU可以實現(xiàn)正常的功能,對其指令集中的絕大部分指令進(jìn)行了驗證,并且提供了一個編譯、執(zhí)行、優(yōu)化與評估的平臺,可以用來指導(dǎo)MIPS-CPU硬件架構(gòu)的優(yōu)化設(shè)計與實現(xiàn)。
本文設(shè)計的MIPS-CPU耗盡了3 457個LE,3 457/5 980×150 000=89 589,因而該MIPS-CPU大約為9萬門的設(shè)計[4]。時鐘頻率設(shè)定為50MHz,建立時間余量為2.503ns,保持時間余量為0.662ns,均滿足時序要求。由于編譯時建立時間考慮的是最壞情況,而保持時間考慮的是最好的情況,也就是說采用的是保守編譯,并且建立時間與保持時間的時序余量均為大于0的數(shù)值,因而本文時序滿足要求。
整個OPS1-CPU占FPGA芯片面積為34.6×34.6mm2,本文設(shè)計的MIPS-CPU占整個芯片面積的70%~80%,即CPU面積約為831~957mm2。把輸入的所有信號翻轉(zhuǎn)率設(shè)置為12.5%,并且將不用的I/O設(shè)置為高阻態(tài)輸入,其總理論功耗為261.68mW,動態(tài)理論功耗為194.13mW,靜態(tài)理論功耗為67.55mW,符合預(yù)期的功耗要求。
設(shè)計的OPS1-CPU可以實現(xiàn)5級流水線高效率運轉(zhuǎn),解決了競爭與冒險。gccmips_elf編譯系統(tǒng)可以實現(xiàn)指令編譯與優(yōu)化。最終實現(xiàn)FPGA的電路映射,并且借助配合該編譯系統(tǒng)的C庫文件,開發(fā)基于C語言的運算等應(yīng)用程序,最終板級指令調(diào)試成功,驗證了該32位MIPS-CPU軟硬件平臺的正確性。
[1]MIPS Technologies, Inc. MIPS32? Architecture For Programmers Volume II[M].The MIPS32? Instruction Set,2003,7(9).
[2]http://www.opencores.org[EB/OL].
[3]陳曦,倪繼利,李揮.CPU源代碼分析與芯片設(shè)計及Linux移植[M].北京:電子工業(yè)出版社,2007.
[4]林容益編. CPU/SOC及外圍電路應(yīng)用設(shè)計:基于FPGA/CPLD[M].北京:北京航空航天大學(xué)出版社,2004.