吳繼明, 曾碧卿
(華南師范大學(xué) 計(jì)算機(jī)學(xué)院,廣州 501631)
CS2013及國(guó)家教育部高等學(xué)校計(jì)算機(jī)科學(xué)與技術(shù)指導(dǎo)委員會(huì)均要求進(jìn)行計(jì)算機(jī)專業(yè)學(xué)生的系統(tǒng)能力培養(yǎng),2017年國(guó)家教指委提出的新工科思維中也特別注重計(jì)算機(jī)系統(tǒng)能力、創(chuàng)新能力的培養(yǎng),當(dāng)前國(guó)內(nèi)外高校都在開展這方面的工作。計(jì)算機(jī)系統(tǒng)能力包括計(jì)算機(jī)系統(tǒng)分析能力、系統(tǒng)設(shè)計(jì)能力和系統(tǒng)驗(yàn)證能力,3個(gè)方面相輔相成,共同構(gòu)成計(jì)算機(jī)專業(yè)本科學(xué)生的基本能力和專業(yè)素養(yǎng)。計(jì)算機(jī)系統(tǒng)能力的培養(yǎng)從根本上依賴于計(jì)算機(jī)系統(tǒng)類核心課程——計(jì)算機(jī)組成原理、操作系統(tǒng)和編譯原理這 3 門課程,其中計(jì)算機(jī)組成原理課程在整個(gè)計(jì)算機(jī)系統(tǒng)類核心課程鏈中處于中心位置[1-3]。
CPU設(shè)計(jì)是實(shí)現(xiàn)計(jì)算機(jī)系統(tǒng)能力培養(yǎng)中的一個(gè)至關(guān)重要的環(huán)節(jié),通過CPU 的設(shè)計(jì)可以把對(duì)計(jì)算機(jī)原理的理解上升到計(jì)算機(jī)的設(shè)計(jì)與實(shí)現(xiàn)層面,對(duì)計(jì)算機(jī)的原理有一個(gè)全面的理論認(rèn)識(shí)和切身的設(shè)計(jì)體會(huì)。目前許多國(guó)內(nèi)外高校都在計(jì)算機(jī)組成原理課程中安排了CPU設(shè)計(jì)方面的課程和實(shí)驗(yàn),基本上都是在Quartus II仿真平臺(tái)應(yīng)用硬件描述語言VHDL或者Verilog完成開放式CPU的邏輯設(shè)計(jì)與仿真,然后下載到FPGA開發(fā)板上進(jìn)行工程驗(yàn)證[4-9]。這種CPU設(shè)計(jì)方式存在如下問題:① 學(xué)生學(xué)習(xí)成本高,學(xué)習(xí)周期長(zhǎng),普通高校的學(xué)生難以在短時(shí)間內(nèi)掌握硬件開發(fā)語言和硬件開發(fā)平臺(tái)的調(diào)試與使用;② 學(xué)生實(shí)踐開發(fā)過程中,依賴于實(shí)驗(yàn)室的硬件環(huán)境,回到宿舍無法繼續(xù)開發(fā)或者調(diào)試,即使只在Quartus II平臺(tái)上做仿真,也涉及到不同處理器電腦上安裝仿真軟件出現(xiàn)bug的問題;③ 分析仿真數(shù)據(jù)時(shí)一頭霧水,不知如何下手去看懂各個(gè)器件之間的數(shù)據(jù)關(guān)系,程序、指令、微程序、微指令之間的關(guān)系不能在仿真界面清晰直觀展現(xiàn),編譯時(shí)出現(xiàn)錯(cuò)誤或者仿真時(shí)數(shù)據(jù)不對(duì)難以快速找到錯(cuò)誤源。④ 《數(shù)字邏輯》《計(jì)算機(jī)組成原理》《計(jì)算機(jī)體系結(jié)構(gòu)》等課程使用不同的硬件實(shí)驗(yàn)環(huán)境,導(dǎo)致學(xué)生在不同課程實(shí)驗(yàn)中完成的設(shè)計(jì)成果不能延續(xù)復(fù)用。
為了更好地培養(yǎng)學(xué)生的計(jì)算機(jī)思維能力和邏輯設(shè)計(jì)能力,經(jīng)過多年的CPU設(shè)計(jì)實(shí)踐教學(xué)積累,我們?cè)诮虒W(xué)過程中提出了“CPU仿真設(shè)計(jì)與工程實(shí)現(xiàn)”兩步走的理念。先通過仿真平臺(tái)完成CPU的仿真設(shè)計(jì),在設(shè)計(jì)與仿真分析過程中引領(lǐng)學(xué)生深入理解計(jì)算機(jī)的工作原理;對(duì)于有盈余學(xué)習(xí)能力的學(xué)生,再指導(dǎo)他們?cè)贔PGA開發(fā)板上完成設(shè)計(jì)的工程實(shí)現(xiàn)。考慮到很多普通高校計(jì)算機(jī)組成原理的實(shí)踐教學(xué)中以CPU仿真設(shè)計(jì)為主[10-15],本文著重探討CPU仿真設(shè)計(jì)的問題。
LogiSim是一款開源的數(shù)字電路仿真軟件,勿需安裝,是一種符號(hào)圖設(shè)計(jì)語言[16]。它提供了硬件設(shè)計(jì)所需的各種基本器件,器件都是參數(shù)化設(shè)定的。邏輯設(shè)計(jì)過程中,對(duì)于連接錯(cuò)誤或者器件之間的邏輯不匹配時(shí),連接的總線或者器件會(huì)出現(xiàn)紅色、橙色的信息提示出錯(cuò),工作時(shí)連線上有有效電平出現(xiàn)時(shí)呈現(xiàn)綠色狀態(tài)。沒有邏輯錯(cuò)誤即可進(jìn)行仿真,設(shè)定好輸入數(shù)據(jù)/信號(hào),就可立即進(jìn)行仿真,不需要再度編譯。仿真上輸出界面可按需定制,每個(gè)器件或者每根連線上的數(shù)據(jù)都可以用數(shù)值、指示燈等方式顯式輸出,非常直觀。每個(gè)設(shè)計(jì)項(xiàng)目就是一個(gè)文件,在按照自頂向底或者自底向上的方式設(shè)計(jì)大系統(tǒng)時(shí),只需要調(diào)用該器件的一個(gè)電路文*.circ件即可。大系統(tǒng)中某個(gè)子模塊修改設(shè)計(jì)后,通過簡(jiǎn)單的重載(reload)操作即可進(jìn)行仿真輸出。這種基于Logisim仿真平臺(tái)的設(shè)計(jì),可以把不同硬件課程中完成的設(shè)計(jì)作品系統(tǒng)化地融為一體,以部件-模塊-系統(tǒng)的方式進(jìn)行設(shè)計(jì),培養(yǎng)學(xué)生的邏輯設(shè)計(jì)和計(jì)算機(jī)系統(tǒng)能力。
在定義好了ALU的9種功能類型和運(yùn)算數(shù)據(jù)長(zhǎng)度后,在LogiSim仿真平臺(tái)先后設(shè)計(jì)4位并行的無符號(hào)全加器FA/全減器FS,再根據(jù)先行進(jìn)位電路的邏輯關(guān)系設(shè)計(jì)CLA,完成8位并行的無符號(hào)FA/FS和補(bǔ)碼FA/FS。整個(gè)ALU設(shè)計(jì)項(xiàng)目中只需要包含4個(gè)子器件的電路設(shè)計(jì)文件*.circ,最終的ALU邏輯電路如圖1所示,ALU功能選擇操作碼有4位,可擴(kuò)展實(shí)現(xiàn)共16種運(yùn)算。ALU功能仿真截圖如圖2所示,對(duì)于2個(gè)輸入數(shù)據(jù),可以同時(shí)查看到不同運(yùn)算類型的結(jié)果和特征位。
CPU控制器是模型機(jī)中的核心部件,負(fù)責(zé)產(chǎn)生所有的微命令,并在時(shí)序信號(hào)的同步下完成指令的取出與執(zhí)行。設(shè)計(jì)CPU控制器的方法主要有微程序思想和硬布線思想,前者是存儲(chǔ)器型控制器,后者是邏輯電路(布爾)型。限于篇幅,本文給出一個(gè)8位字長(zhǎng)經(jīng)典指令的CPU控制器微程序設(shè)計(jì),指令類型及數(shù)量如表1所示。首先根據(jù)指令系統(tǒng)和數(shù)據(jù)通路繪制出指令的周期流程圖和微程序流程圖,然后定義好微指令格式并進(jìn)行微程序編碼。接下來,在LogiSim仿真平臺(tái)著手控制器uC設(shè)計(jì):調(diào)用參數(shù)化ROM存儲(chǔ)微程序,根據(jù)微地址修改邏輯表達(dá)式調(diào)用基本門器件設(shè)計(jì)微地址轉(zhuǎn)移邏輯電路,最后添加輔助器件完成控制器的設(shè)計(jì)。uC設(shè)計(jì)電路和仿真界面如圖3所示。
圖1 9種運(yùn)算功能ALU的邏輯電路
圖2 ALU功能仿真界面
表1 8位字長(zhǎng)的機(jī)器指令格式
(a)微程序控制器uC邏輯電路
圖3 uC設(shè)計(jì)電路與仿真界面
由圖3可見,設(shè)計(jì)和仿真過程非常簡(jiǎn)單??梢愿鶕?jù)需要用二進(jìn)制、十六進(jìn)制形式顯示需要觀察的數(shù)據(jù),P位是微程序發(fā)生分支轉(zhuǎn)移的重要標(biāo)志,可以同時(shí)輔以LED指示該條件是否有效。對(duì)照微程序編碼表格,逐步改變指令OP和需要的ZF、CF等標(biāo)志信息,就可以快速完成微程序控制器邏輯功能的驗(yàn)證。
應(yīng)用前面基于微程序思想設(shè)計(jì)好的微程序控制器uC和多功能ALU,輔以寄存器和存儲(chǔ)器,在單總線連接方式下完成模型機(jī)的電路設(shè)計(jì),如圖4所示。圖5為功能仿真過程中取指微指令階段的各種信息。
圖5表達(dá)的是取指微指令在一個(gè)CPU周期內(nèi)的數(shù)據(jù)信息,當(dāng)前ROM中地址0處取出的指令I(lǐng)R是54H,下一順序指令地址是1,當(dāng)前取指微指令的地址是00H,后繼微地址是20H,P1有效,當(dāng)T4上升沿到達(dá)后,下一關(guān)聯(lián)微指令地址被修改為25H。圖6表達(dá)的是LAD指令執(zhí)行期間的數(shù)據(jù)信息,uA值為26H表示處于LAD第二條微指令工作期間,訪存地址是06H,RAM輸出數(shù)據(jù)是08H,輸入數(shù)據(jù)無效表明是讀訪存,T4上升沿到達(dá)后R2寄存器值由0變?yōu)?H。
圖4 多周期CPU模型機(jī)邏輯電路
基于RISC指令系統(tǒng)MIPS 32,選取算術(shù)邏輯運(yùn)算指令(R類型)、訪存指令/條件分支轉(zhuǎn)移指令(I類型)和無條件轉(zhuǎn)移指令(J類型),在LogiSim仿真平臺(tái)完成硬布線控制器、通用寄存器堆、流水線緩沖器(IF/ID,ID/EX,EX/MEM,MEM/WB)、數(shù)據(jù)真相關(guān)前推電路和數(shù)據(jù)真相關(guān)冒泡電路等器件,最后連接成一個(gè)基于經(jīng)典五段流水線IF、ID、EXE、MEM、WB的流水線模型機(jī),圖7是邏輯設(shè)計(jì)電路,圖8是功能仿真界面。
CPU的仿真設(shè)計(jì)可以幫助學(xué)生理解計(jì)算機(jī)的工作原理,提高他們的計(jì)算機(jī)思維能力和系統(tǒng)設(shè)計(jì)能力。當(dāng)前主流的做法是在Quartus II平臺(tái)中完成設(shè)計(jì),Quartus II或者M(jìn)odelSim中完成仿真[4-6]。本文介紹的CPU設(shè)計(jì)方法,融設(shè)計(jì)與功能仿真于一體,學(xué)習(xí)效率高,無實(shí)驗(yàn)環(huán)境需求,教師可以在理論課堂上隨用隨講輔助教學(xué),可以在機(jī)房帶領(lǐng)學(xué)生從事實(shí)踐開發(fā),課后學(xué)生回到宿舍可在自己電腦上繼續(xù)開發(fā)。和Quartus II平臺(tái)的仿真設(shè)計(jì)過程相比具有如下分一些優(yōu)點(diǎn)。
圖7 MIPS指令五段經(jīng)典流水線CPU模型機(jī)
圖8 MIPS指令五段流水線CPU模型機(jī)功能仿真界面
在Quartus II設(shè)計(jì)和仿真,當(dāng)調(diào)用子器件完成當(dāng)前項(xiàng)目設(shè)計(jì)時(shí),需包含子項(xiàng)目符號(hào)圖文件和源文件,及子項(xiàng)目設(shè)計(jì)中調(diào)用的系統(tǒng)參數(shù)化器件的源文件和符號(hào)圖文件,缺少任意一個(gè)文件都會(huì)無法通過編譯。編譯成功后,生成功能仿真列表,才可以在新建的波形文件中逐一添加輸入、輸出信號(hào)節(jié)點(diǎn),設(shè)置好end time、grid time,預(yù)置輸入信號(hào)值,進(jìn)行仿真。仿真過程不能修改輸入信號(hào)值,如果修改了設(shè)計(jì)中的源文件,必須重新進(jìn)行編譯和生成功能仿真列表。
LogiSim中設(shè)計(jì)和仿真,當(dāng)前項(xiàng)目只需要裝載子項(xiàng)目的源文件*.circ,對(duì)調(diào)用系統(tǒng)的參數(shù)化器件不用考慮文件問題。設(shè)計(jì)過程就隱含著編譯過程,設(shè)計(jì)過程有邏輯上的錯(cuò)誤立刻會(huì)以紅色的線或者橙色的線/數(shù)字提示錯(cuò)誤。沒有錯(cuò)誤提示后,就可以設(shè)定輸入信號(hào)值立即開始仿真,仿真過程可以隨意改變?cè)次募O(shè)計(jì)和輸入信號(hào)值。
LogiSim和Quartus II仿真平臺(tái)都支持純符號(hào)圖語言的設(shè)計(jì)方法,但是在基于自頂向底的大系統(tǒng)大項(xiàng)目設(shè)計(jì)過程中,2個(gè)平臺(tái)上頂層設(shè)計(jì)實(shí)體對(duì)下層支撐模塊和子器件的需求是不同的,以設(shè)計(jì)8位并行FA_8bits為例分析,主要體現(xiàn)在以下幾個(gè)方面:(1)頂層調(diào)用子器件1位FA、超前進(jìn)位電路CLA和4位并行FA,LogiSim中只需要在頂層項(xiàng)目中包含3個(gè)子器件文件FA_1bits.circ、CLA.circ、FA_4bits.circ;而在Quartus II中需要包含6個(gè)子器件文件FA_1bits.bdf、FA_1bits.bsf、CLA.bdf、CLA.bsf、FA_4bits.bdf、FA_4bits.bsf;(2)頂層調(diào)用系統(tǒng)中參數(shù)化的數(shù)據(jù)選擇器、觸發(fā)器、寄存器或者存儲(chǔ)器時(shí),Quartus II平臺(tái)都會(huì)在項(xiàng)目文件夾FA_8bits中生成每個(gè)器件的lpm_*.vhd和lpm_*.bsf文件,而LogiSim平臺(tái)不會(huì)產(chǎn)生任何文件。如果在后續(xù)更高層級(jí)的項(xiàng)目設(shè)計(jì)中,例如ALU_8bits或者模型機(jī)的設(shè)計(jì)中,若漏了添加這些系統(tǒng)自動(dòng)產(chǎn)生的lpm_*.vhd和lpm_*.bsf文件,編譯將會(huì)出錯(cuò),這也是學(xué)生在從事大系統(tǒng)設(shè)計(jì)時(shí)最容易出現(xiàn)遺漏導(dǎo)致編譯不成功的地方。表2給出了2種仿真平臺(tái)下純符號(hào)圖語言設(shè)計(jì)器件及模型機(jī)時(shí)所需下層器件的子文件情況。
表2 兩種不同仿真平臺(tái)設(shè)計(jì)相同目標(biāo)所包含子器件文件數(shù)量比較
Quartus II或者M(jìn)odelSim仿真界面是固定的,不能根據(jù)用戶需要進(jìn)行改變,顯示的是波形文件或者數(shù)字,Quartus II中多周期CPU構(gòu)成的模型機(jī)仿真界面如圖9所示。當(dāng)要觀察某個(gè)器件的輸出數(shù)據(jù)時(shí),需要在原設(shè)計(jì)圖增加輸出引腳output,重新編譯、生成功能仿真列表,并在仿真的波形文件中添加這個(gè)output后,運(yùn)行功能仿真才可以輸出該仿真數(shù)據(jù),但是該數(shù)據(jù)與其它器件之間的數(shù)據(jù)關(guān)系、時(shí)間關(guān)系卻難以直觀體現(xiàn)。
而在LogiSim中仿真界面可以根據(jù)需要靈活設(shè)置,便于設(shè)計(jì)者跟蹤數(shù)據(jù)的流動(dòng)和器件的工作狀態(tài)。如圖5或者6所示,在本文的CPU設(shè)計(jì)仿真界面中給出了4類信息。第一列是對(duì)應(yīng)于時(shí)序信號(hào)發(fā)生器的輸入控制信號(hào),連續(xù)仿真過程中,如果想停止下來看某個(gè)器件或某條總線上的數(shù)據(jù),可以用鼠標(biāo)點(diǎn)擊設(shè)置EN=0,仿真程序暫停。同樣,如果某條機(jī)器指令工作不正確,可以在任意時(shí)鐘周期T內(nèi)停下來,在設(shè)計(jì)電路中查看相關(guān)數(shù)據(jù)通路上的數(shù)據(jù)及相關(guān)工作器件的控制信號(hào)是否正確。第二列跟蹤微程序工作時(shí)的信息,便于學(xué)生輸入理解微程序控制器的原理,同時(shí)可以隨時(shí)檢查自己的微程序控制器是否按照微程序流程圖定義的順序工作。第三列顯示的是機(jī)器指令構(gòu)成的測(cè)試程序運(yùn)行情況,紅色的LED亮表示對(duì)應(yīng)的指令正在工作,LED前面的數(shù)字是該機(jī)器指令的存儲(chǔ)地址。第四列顯示的是數(shù)據(jù)通路上通用寄存器和數(shù)據(jù)存儲(chǔ)器的信息,尤其是在執(zhí)行訪存指令時(shí),訪存的地址和數(shù)據(jù)會(huì)直接展現(xiàn)在眼前。
圖9 Quartus II中多周期CPU模型機(jī)運(yùn)行1~15累加測(cè)試程序仿真界面
Quartus II平臺(tái)中,圖9的仿真數(shù)據(jù)顯示時(shí)鐘信號(hào)clk周期為20ns時(shí),經(jīng)過93us后完成了1~15的累加運(yùn)算,輸出結(jié)果ALU_out為78H。但是仿真波形中,什么時(shí)候是指令的取值階段,什么時(shí)候是指令的執(zhí)行階段,執(zhí)行指令時(shí)哪些器件在工作,器件之間流動(dòng)的數(shù)據(jù)是多少等信息難以直觀看清楚,尤其是對(duì)于剛學(xué)會(huì)使用Quartus II從事硬件設(shè)計(jì)的學(xué)生來講,通過這個(gè)仿真數(shù)據(jù)分析邏輯功能的正確性,理解CPU的指令控制、操作控制、時(shí)序控制原理非常困難。
LogiSim平臺(tái)中,圖5截圖表達(dá)的是取值微指令在一個(gè)CPU周期內(nèi)的數(shù)據(jù)信息,當(dāng)前ROM中地址0處取出的指令I(lǐng)R是54H,下一順序指令地址是1,當(dāng)前取指微指令的地址是00H,后繼微地址是20H,P1有效,當(dāng)T4上升沿到達(dá)后,下一關(guān)聯(lián)微指令地址被修改為25H。圖6截圖表達(dá)的是LAD指令執(zhí)行期間的數(shù)據(jù)信息,uA值為26H表示處于LAD第二條微指令工作期間,訪存地址是06H,RAM輸出數(shù)據(jù)是08H,輸入數(shù)據(jù)無效表明是讀訪存,T4上升沿到達(dá)后R2寄存器值由0變?yōu)?H??梢栽诜抡孢^程的每個(gè)T周期停止下來查看器件工作狀態(tài)和數(shù)據(jù)的變化,輕松理解CPU的操作控制功能。
LogiSim仿真界面的多樣可視化效果,可以在計(jì)算機(jī)組成原理實(shí)踐教學(xué)中提供許多幫助。例如在講授機(jī)器碼及補(bǔ)碼的加法/減法運(yùn)算時(shí),直接在FA的數(shù)據(jù)仿真過程建立溢出的概念和真值與補(bǔ)碼之間的關(guān)系,講授存儲(chǔ)器容量擴(kuò)展與連接時(shí)可以在仿真過程中,形象描述出不同訪存地址選中不同芯片中的單元進(jìn)行訪問。
計(jì)算機(jī)組成原理的實(shí)踐教學(xué)過程中,給學(xué)生布置了多功能ALU、通用寄存器陣列等模塊的設(shè)計(jì)任務(wù)后,教師可以在仿真平臺(tái)設(shè)計(jì)一個(gè)自動(dòng)檢測(cè)并給予評(píng)分的仿真測(cè)試工具,極大提高工作效率,減少教師審閱學(xué)生設(shè)計(jì)項(xiàng)目的工作量。圖10給出了ALU模塊的自動(dòng)檢測(cè)仿真界面,要求學(xué)生提交的ALU輸入輸出引腳按規(guī)范的要求設(shè)置,檢測(cè)時(shí)只需要把ALU載入就可以自動(dòng)完成連接,運(yùn)行仿真就可以在圖(b)的評(píng)分界面看到該器件設(shè)計(jì)的錯(cuò)誤之處和按權(quán)值設(shè)定給出的評(píng)分[17]。
(a)ALU設(shè)計(jì)模塊檢測(cè)界面
(b)ALU設(shè)計(jì)模塊評(píng)分界面
CPU設(shè)計(jì)在《計(jì)算機(jī)組成原理》課程的學(xué)習(xí)過程中具有非常重要的意義,基于LogiSim仿真平臺(tái)的CPU設(shè)計(jì)方法,能夠幫助學(xué)生快速完成設(shè)計(jì)過程。仿真時(shí)能夠以一種直觀、易懂的形式給出輸出,可以按需設(shè)計(jì)輸出的仿真界面,學(xué)生分析仿真數(shù)據(jù)更簡(jiǎn)單明了,有助于理解CPU的工作過程與模型機(jī)中的數(shù)據(jù)驅(qū)動(dòng)。同時(shí)也方便教師在理論教學(xué)中應(yīng)用仿真過程描述抽象的概念,設(shè)計(jì)檢測(cè)和評(píng)分工具實(shí)現(xiàn)對(duì)學(xué)生設(shè)計(jì)項(xiàng)目的自動(dòng)校驗(yàn)。和其它硬件設(shè)計(jì)語言的仿真平臺(tái)相比,在培養(yǎng)以邏輯設(shè)計(jì)能力為主的計(jì)算機(jī)系統(tǒng)思維能力方面,本文給出的設(shè)計(jì)方法具有突出的優(yōu)勢(shì)?!队?jì)算機(jī)組成原理》課程中,還存在許多內(nèi)容重要、概念抽象、晦澀難懂的知識(shí)點(diǎn),例如IEEE754浮點(diǎn)數(shù)的四則運(yùn)算過程及流水線工作方式,Cache、主存、輔存三級(jí)存儲(chǔ)體系之間的地址轉(zhuǎn)換,及多級(jí)中斷嵌套工作模式等。后續(xù)我們將應(yīng)用LogiSim仿真平臺(tái)完成這些知識(shí)點(diǎn)的設(shè)計(jì),給學(xué)生提供更多易懂的仿真界面,幫助學(xué)生深入掌握相應(yīng)知識(shí),提高他們的計(jì)算機(jī)系統(tǒng)思維能力和設(shè)計(jì)能力。