王力生, 余智銘, 張冬冬
(同濟(jì)大學(xué) 電子與信息工程學(xué)院, 上海 201800)
“計(jì)算機(jī)組成原理”是計(jì)算機(jī)專(zhuān)業(yè)基礎(chǔ)課程,其課程內(nèi)容與計(jì)算機(jī)多門(mén)專(zhuān)業(yè)課程聯(lián)系緊密,學(xué)生對(duì)其內(nèi)容的理解直接或間接地影響到對(duì)其他專(zhuān)業(yè)課程的學(xué)習(xí),并關(guān)系到學(xué)生對(duì)計(jì)算機(jī)系統(tǒng)的整體認(rèn)識(shí)[1-5]。
在教授這門(mén)課程時(shí)加入CPU設(shè)計(jì)實(shí)驗(yàn)可以幫助學(xué)生理解計(jì)算機(jī)的組成結(jié)構(gòu)[6],但是,由于CPU設(shè)計(jì)實(shí)驗(yàn)本身具有較高的難度,致使許多學(xué)生不能很好地完成課程實(shí)驗(yàn)。主要問(wèn)題在于學(xué)生設(shè)計(jì)CPU時(shí),數(shù)據(jù)通路設(shè)計(jì)不清[7]、信號(hào)傳輸錯(cuò)誤﹑各部件連接混亂等。針對(duì)這些實(shí)驗(yàn)教學(xué)問(wèn)題[8],本文提出了一種幫助學(xué)生更好地設(shè)計(jì)出單周期CPU的方法[9]。
本文所設(shè)計(jì)的CPU是基于MIPS32構(gòu)架,由31條指令集組成。使用的設(shè)計(jì)語(yǔ)言為Verilog,采用的集成工具為Xilinx公司的Vivado。31條指令分別為[9]:
R型指令:add,addu,sub,subu,and,or,xor,nor,slt,sltu,sll,srl,sra,sllv,srlv,srav,jr;
I型指令:addi,addiu,andi,ori,xori,lw,sw,beq,bne,slti,sltiu,lui;
J型指令:j,jal。
本文所提出的CPU設(shè)計(jì)思路由以下步驟組成。
根據(jù)指令功能和格式列出完成指令功能所需的部件,用部件關(guān)系表將每個(gè)部件的數(shù)據(jù)來(lái)源列出,根據(jù)關(guān)系表用連線將每個(gè)部件連接起來(lái),設(shè)計(jì)該指令的數(shù)據(jù)通路[10]。每條指令的數(shù)據(jù)通路單獨(dú)設(shè)計(jì)完后,再將所有數(shù)據(jù)通路合并成總的數(shù)據(jù)通路。
(1) 繪制指令流程圖。根據(jù)初步設(shè)計(jì)好的數(shù)據(jù)通路,把每一條機(jī)器指令分解為一系列微操作,并排列為有先后次序、互相銜接的指令流程圖。
(2) 編排指令操作時(shí)間表。依據(jù)各條機(jī)器指令的操作流程圖,編排指令取指到執(zhí)行的操作時(shí)間表。
(3) 進(jìn)行微操作綜合。按照所有機(jī)器指令的操作時(shí)間表,把相同的微操作綜合起來(lái),得到每個(gè)微操作的邏輯表達(dá)式。
(4) 畫(huà)出控制器CU邏輯電路。根據(jù)各微操作的邏輯表達(dá)式設(shè)計(jì)CPU控制單元。
由于31條指令集中的一些指令的數(shù)據(jù)通路和指令流程具有相似性,只是在指令拓展之后,需要加上相應(yīng)的數(shù)據(jù)選擇器,以確保數(shù)據(jù)能正確傳輸。因此在本文中,僅以部分具有代表性的指令進(jìn)行分析設(shè)計(jì),起到以小見(jiàn)大的作用。
取R類(lèi)型的Addu指令、I類(lèi)型的lw指令、J類(lèi)型的j指令進(jìn)行分析:
2.1.1 Addu指令格式

Addu指令功能:rd←rs+rt , PC←NPC(PC+4)
該指令所涉及到的部件有PC,NPC(完成PC+4),IMEM(指令存儲(chǔ)器),RegFile以及ALU。各部件之間數(shù)據(jù)輸入輸出關(guān)系如表1所示。

表1 Addu指令部件數(shù)據(jù)輸入輸出關(guān)系
通過(guò)對(duì)指令功能的分析和數(shù)據(jù)的傳輸關(guān)系,可以畫(huà)出如圖1所示的Addu指令數(shù)據(jù)通路:

圖1 Addu指令數(shù)據(jù)通路
2.1.2 Lw指令格式

lw指令功能:rt ← memory[base+offset],PC←NPC(PC+4)
該指令所涉及的部件有PC,NPC(完成PC+4),IMEM(指令存儲(chǔ)器)、RegFile、ALU、S_Ext16(將16位二進(jìn)制符號(hào)擴(kuò)展到32位)和DMEM(數(shù)據(jù)存儲(chǔ)器),部件之間數(shù)據(jù)輸入輸出關(guān)系如表2所示,數(shù)據(jù)通路如圖2所示。

表2 Lw指令部件數(shù)據(jù)輸入輸出關(guān)系

圖2 Lw指令數(shù)據(jù)通路
2.1.3 J指令格式

J指令功能:該指令無(wú)條件跳轉(zhuǎn)到一個(gè)絕對(duì)地址,instr_index長(zhǎng)度26位,在左移2位后為28位,再與PC的最高4位(PC31-28)并接成32位轉(zhuǎn)移地址。
該指令所涉及的部件有PC、NPC(完成PC+4)、IMEM(指令存儲(chǔ)器)和 ||(并接器),部件之間數(shù)據(jù)輸入輸出關(guān)系如表3所示,數(shù)據(jù)通路如圖3所示。

表3 J指令部件數(shù)據(jù)輸入輸出關(guān)系

圖3 J指令數(shù)據(jù)通路
然后合并3條指令的數(shù)據(jù)通路,先將3條指令的部件關(guān)系表合并,如表4所示。某個(gè)部件有來(lái)自不同部件的輸入就用多路選擇器,合并的數(shù)據(jù)通路如圖4所示。

表4 3條指令部件數(shù)據(jù)輸入輸出關(guān)系

圖4 3條指令數(shù)據(jù)通路
2.2.1 繪制指令流程圖
獲得指令的數(shù)據(jù)通路圖后,可根據(jù)指令的運(yùn)行流程,繪制出指令流程圖。在指令流程圖中,應(yīng)標(biāo)明每一步所需要的信號(hào),這樣有助于理清各個(gè)信號(hào)的作用階段。圖5給出了Addu,Lw以及J指令的指令流程圖。

圖5 Addu、Lw、J指令流程圖
2.2.2 編排指令操作時(shí)間表
獲得數(shù)據(jù)通路圖和指令流程圖后,將所需要的所有信號(hào)和寄存器列出,再根據(jù)每條指令需要的信號(hào),編排指令操作時(shí)間表(假設(shè)所有控制信號(hào)高電平有效),如表5所示。從表中看到Rdc4-0來(lái)自2個(gè)輸入,所以加1個(gè)多路選擇器MUX4。3條指令完整的數(shù)據(jù)通路如圖6所示。

表5 指令操作時(shí)間表
2.2.3 進(jìn)行綜合微操作
根據(jù)第三步(2.2.2節(jié))的操作時(shí)間表,可將相同的微操作綜合起來(lái),得到每個(gè)微操作的邏輯表達(dá)式。Addu,Lw,J這3條指令的微操作綜合邏輯表達(dá)式結(jié)果為:
PC_CLK=CLK;
IM_R=1;
M1=Addu+Lw
Rsc4-0= IM25-21;
Rtc4-0= IM20-16;
M3=Lw
Add=Addu+Lw;
M2=Addu
Rdc4-0= IM15-11(Addu)+ IM20-16(Lw);
RF_W=Addu+Lw;
RF_CLK=(Addu+Lw)CLK;
DM_CS=Lw;
DM_R=Lw;
DM_W=0。
M4=Addu

圖6 三條指令完整數(shù)據(jù)通路
2.2.4 畫(huà)出CPU的CU邏輯電路
根據(jù)微操作邏輯表達(dá)式可以畫(huà)出對(duì)應(yīng)的邏輯電路圖(邏輯圖省略)。
通過(guò)前述的設(shè)計(jì)流程,得到了一個(gè)CPU的基本框架。通過(guò)Verilog語(yǔ)言實(shí)現(xiàn)CPU設(shè)計(jì),并使用ModelSim仿真工具進(jìn)行驗(yàn)證CPU的正確性并下板。
3.1.1 單條指令功能驗(yàn)證
在此步驟中,需要對(duì)設(shè)計(jì)好的CPU進(jìn)行每條指令功能的驗(yàn)證。將匯編語(yǔ)言編寫(xiě)每一條指令的測(cè)試代碼,導(dǎo)入CPU的指令存儲(chǔ)器,在ModelSim下仿真運(yùn)行,通過(guò)輸出波形判斷指令執(zhí)行是否正確。以下舉一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明:
sll $0, $0, 0
ori $1, 0x00000001
ori $2, 0x00000002
addu $3, $2, $1
此匯編指令用于測(cè)試Addu指令(假設(shè)所用到的Sll指令和Ori指令已經(jīng)測(cè)試通過(guò))。將該指令放入CPU中運(yùn)行,并使用ModelSim進(jìn)行仿真后,結(jié)果如圖7所示,通過(guò)輸出波形判斷指令執(zhí)行是否正確。

圖7 單條指令測(cè)試波形
3.1.2 指令邊界數(shù)據(jù)驗(yàn)證
在單指令驗(yàn)證都正確的情況下,還需要對(duì)各指令的邊界數(shù)據(jù)進(jìn)行測(cè)試,對(duì)CPU進(jìn)行指令的完備性測(cè)試[10]。例如,對(duì)Addu指令進(jìn)行測(cè)試時(shí),選取邊界數(shù)據(jù):0x00000000,0xffffffff,0x0000ffff,0xffff0000,0x0f0f0f0f,0xf0f0f0f0,0x55555555,0xaaaaaaaa等。
多個(gè)測(cè)試單元可以作為多個(gè)測(cè)試程序執(zhí)行,也可以放在一個(gè)測(cè)試程序中順序執(zhí)行。然后將這些指令放入CPU中運(yùn)行,并用ModelSim仿真,觀察波形驗(yàn)證結(jié)果的正確性。
3.1.3 隨機(jī)指令序列驗(yàn)證
在此步驟中,可以自行編寫(xiě)一些符合MIPS規(guī)范的指令序列。為了方便結(jié)果驗(yàn)證與比較,可先將這些指令序列放入MIPS仿真工具中運(yùn)行[11],如MARS,獲得仿真結(jié)果后,再將指令序列放入CPU中運(yùn)行,將其運(yùn)行結(jié)果與MIPS仿真器中運(yùn)行的結(jié)果進(jìn)行比較,從而驗(yàn)證CPU功能的正確性。
3.1.4 程序驗(yàn)證
在完成了上面3步驗(yàn)證后,就可以運(yùn)行一個(gè)有意義的程序,觀察其運(yùn)行結(jié)果,檢測(cè)自己的CPU是否正確運(yùn)行。例如可以使用類(lèi)似快速排序和斐波拉契數(shù)列的程序來(lái)驗(yàn)證。
時(shí)序仿真不同于功能仿真,時(shí)序仿真使用布局布線后器件給出的模塊和連線的延時(shí)信息,在最壞的情況下對(duì)電路的行為作出實(shí)際的評(píng)價(jià)[12]。兩者的差別在于時(shí)序仿真加載到仿真器的設(shè)計(jì),包括基于實(shí)際布局布線設(shè)計(jì)的最壞情況的布局布線延時(shí),并且在仿真結(jié)果波形圖中,時(shí)序仿真后的信號(hào)加載了時(shí)延,而功能仿真沒(méi)有。
后仿真分為2個(gè)步驟,先做指令序列測(cè)試,再做程序測(cè)試。但是要注意initial塊不可綜合,后仿真和下板時(shí)需要使用ip核初始化iram。如在后仿真出現(xiàn)時(shí)序問(wèn)題時(shí),先采取降低CPU主頻的方法來(lái)解決,如果不行的話,就必須分析問(wèn)題所在,修改或優(yōu)化CPU數(shù)據(jù)通路或部件。
當(dāng)仿真驗(yàn)證都通過(guò)后,便可使用Vivado工具生成bitstream文件,進(jìn)行下板驗(yàn)證。使用的開(kāi)發(fā)板為XILINX公司的NEXYS4板。下板前,根據(jù)需要設(shè)計(jì)的功能,在Vivado工程中添加相應(yīng)的外設(shè)代碼,N4板可以提供led和7端數(shù)碼管等外設(shè)功能。之后再編寫(xiě)相應(yīng)的匯編代碼通過(guò)CPU對(duì)外設(shè)進(jìn)行控制,從而驗(yàn)證下板CPU的設(shè)計(jì)是否正確。
本文提出了一種教學(xué)用的CPU設(shè)計(jì)過(guò)程,通過(guò)對(duì)指令功能的分析,設(shè)計(jì)數(shù)據(jù)通路圖,再到使用集成開(kāi)發(fā)工具編寫(xiě)CPU設(shè)計(jì)代碼,最后進(jìn)行仿真驗(yàn)證和下
板。這一過(guò)程從簡(jiǎn)單到復(fù)雜,從理論到實(shí)踐,循序漸進(jìn),逐步提高。學(xué)生通過(guò)完成CPU的設(shè)計(jì)過(guò)程,不僅鞏固了課本上的知識(shí),還拓展了工程實(shí)踐視野。本文所提出的實(shí)驗(yàn)設(shè)計(jì)方法,已經(jīng)在我校數(shù)屆學(xué)生中進(jìn)行了應(yīng)用,通過(guò)對(duì)學(xué)生的問(wèn)卷調(diào)查和實(shí)驗(yàn)結(jié)果的驗(yàn)收統(tǒng)計(jì),學(xué)生CPU設(shè)計(jì)成功率從最開(kāi)始的不到30%,逐漸提升到了50%,現(xiàn)今已經(jīng)達(dá)到了76%以上。而設(shè)計(jì)CPU的累計(jì)時(shí)長(zhǎng),也從最初的34 h以上,下降到如今的25 h左右,取得了良好的效果。
參考文獻(xiàn)(References)
[1] 鄒惠,王建東. 以CPU設(shè)計(jì)為核心的“計(jì)算機(jī)組成原理”課程教學(xué)改革探討[J]. 福建電腦,2016(3):84-85.
[2] 袁春風(fēng),陳貴海,黃宜華,等. “計(jì)算機(jī)組織與系統(tǒng)結(jié)構(gòu)”課程的教學(xué)現(xiàn)狀和改革思路[J].計(jì)算機(jī)教育,2009(16):153-156.
[3] 朱凌云. 對(duì)計(jì)算機(jī)組成原理教學(xué)的思考[J]. 計(jì)算機(jī)教育,2011(10):37-39.
[4] 鄒惠,王建東,劉坤起,等. “計(jì)算機(jī)組成原理”課程教學(xué)探討[J]. 工業(yè)和信息化教育,2014(12):45-48.
[5] 周剛,師維,陳潤(rùn),等.計(jì)算機(jī)組成原理實(shí)驗(yàn)創(chuàng)新性改革探索與實(shí)踐[J].實(shí)驗(yàn)技術(shù)與管理,2016,33(11):26-29.
[6] 徐愛(ài)萍,張玉萍,涂國(guó)慶. 基于VHDL之CPU設(shè)計(jì)與實(shí)踐[J]. 實(shí)驗(yàn)室研究與探索,2014,33(5):120-124.
[7] 黃明,陳龍. 基于MIPS指令的CPU邏輯電路設(shè)計(jì)[J]. 科技展望,2014(18):100-101.
[8] 王力生,王煜. 計(jì)算機(jī)組成原理實(shí)驗(yàn)教學(xué)方法改進(jìn)[J]. 電腦知識(shí)與技術(shù),2014(28):6704-6706
[9] MIPS Technologies, MIPS32TM Architecture For Programmers, Volume I[M]. Introduction to the MIPS32TM Architecture,Revision 0.95,2001.
[10] MIPS Technologies, Inc. MIPS32TMArchitecture For Programmers Volume II[M]. The MIPSTMInstruction Set, 2003.
[11] Lu S, Li G, Wang Y. CPU Design for Computer Integrated Experiment[J]. FECS12, 2012(8):594-600.
[12] 戚新宇. 基于FPGA設(shè)計(jì)的功能仿真和時(shí)序仿真[J]. 航空電子技術(shù),2005,36(3):51-54.