王力生, 余智銘, 張冬冬
(同濟大學(xué) 電子與信息工程學(xué)院, 上海 201800)
“計算機組成原理”是計算機專業(yè)基礎(chǔ)課程,其課程內(nèi)容與計算機多門專業(yè)課程聯(lián)系緊密,學(xué)生對其內(nèi)容的理解直接或間接地影響到對其他專業(yè)課程的學(xué)習(xí),并關(guān)系到學(xué)生對計算機系統(tǒng)的整體認識[1-5]。
在教授這門課程時加入CPU設(shè)計實驗可以幫助學(xué)生理解計算機的組成結(jié)構(gòu)[6],但是,由于CPU設(shè)計實驗本身具有較高的難度,致使許多學(xué)生不能很好地完成課程實驗。主要問題在于學(xué)生設(shè)計CPU時,數(shù)據(jù)通路設(shè)計不清[7]、信號傳輸錯誤﹑各部件連接混亂等。針對這些實驗教學(xué)問題[8],本文提出了一種幫助學(xué)生更好地設(shè)計出單周期CPU的方法[9]。
本文所設(shè)計的CPU是基于MIPS32構(gòu)架,由31條指令集組成。使用的設(shè)計語言為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ù)指令功能和格式列出完成指令功能所需的部件,用部件關(guān)系表將每個部件的數(shù)據(jù)來源列出,根據(jù)關(guān)系表用連線將每個部件連接起來,設(shè)計該指令的數(shù)據(jù)通路[10]。每條指令的數(shù)據(jù)通路單獨設(shè)計完后,再將所有數(shù)據(jù)通路合并成總的數(shù)據(jù)通路。
(1) 繪制指令流程圖。根據(jù)初步設(shè)計好的數(shù)據(jù)通路,把每一條機器指令分解為一系列微操作,并排列為有先后次序、互相銜接的指令流程圖。
(2) 編排指令操作時間表。依據(jù)各條機器指令的操作流程圖,編排指令取指到執(zhí)行的操作時間表。
(3) 進行微操作綜合。按照所有機器指令的操作時間表,把相同的微操作綜合起來,得到每個微操作的邏輯表達式。
(4) 畫出控制器CU邏輯電路。根據(jù)各微操作的邏輯表達式設(shè)計CPU控制單元。
由于31條指令集中的一些指令的數(shù)據(jù)通路和指令流程具有相似性,只是在指令拓展之后,需要加上相應(yīng)的數(shù)據(jù)選擇器,以確保數(shù)據(jù)能正確傳輸。因此在本文中,僅以部分具有代表性的指令進行分析設(shè)計,起到以小見大的作用。
取R類型的Addu指令、I類型的lw指令、J類型的j指令進行分析:
2.1.1 Addu指令格式
Addu指令功能:rd←rs+rt , PC←NPC(PC+4)
該指令所涉及到的部件有PC,NPC(完成PC+4),IMEM(指令存儲器),RegFile以及ALU。各部件之間數(shù)據(jù)輸入輸出關(guān)系如表1所示。
表1 Addu指令部件數(shù)據(jù)輸入輸出關(guān)系
通過對指令功能的分析和數(shù)據(jù)的傳輸關(guān)系,可以畫出如圖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(指令存儲器)、RegFile、ALU、S_Ext16(將16位二進制符號擴展到32位)和DMEM(數(shù)據(jù)存儲器),部件之間數(shù)據(jù)輸入輸出關(guān)系如表2所示,數(shù)據(jù)通路如圖2所示。
表2 Lw指令部件數(shù)據(jù)輸入輸出關(guān)系
圖2 Lw指令數(shù)據(jù)通路
2.1.3 J指令格式
J指令功能:該指令無條件跳轉(zhuǎn)到一個絕對地址,instr_index長度26位,在左移2位后為28位,再與PC的最高4位(PC31-28)并接成32位轉(zhuǎn)移地址。
該指令所涉及的部件有PC、NPC(完成PC+4)、IMEM(指令存儲器)和 ||(并接器),部件之間數(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所示。某個部件有來自不同部件的輸入就用多路選擇器,合并的數(shù)據(jù)通路如圖4所示。
表4 3條指令部件數(shù)據(jù)輸入輸出關(guān)系
圖4 3條指令數(shù)據(jù)通路
2.2.1 繪制指令流程圖
獲得指令的數(shù)據(jù)通路圖后,可根據(jù)指令的運行流程,繪制出指令流程圖。在指令流程圖中,應(yīng)標明每一步所需要的信號,這樣有助于理清各個信號的作用階段。圖5給出了Addu,Lw以及J指令的指令流程圖。
圖5 Addu、Lw、J指令流程圖
2.2.2 編排指令操作時間表
獲得數(shù)據(jù)通路圖和指令流程圖后,將所需要的所有信號和寄存器列出,再根據(jù)每條指令需要的信號,編排指令操作時間表(假設(shè)所有控制信號高電平有效),如表5所示。從表中看到Rdc4-0來自2個輸入,所以加1個多路選擇器MUX4。3條指令完整的數(shù)據(jù)通路如圖6所示。
表5 指令操作時間表
2.2.3 進行綜合微操作
根據(jù)第三步(2.2.2節(jié))的操作時間表,可將相同的微操作綜合起來,得到每個微操作的邏輯表達式。Addu,Lw,J這3條指令的微操作綜合邏輯表達式結(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 畫出CPU的CU邏輯電路
根據(jù)微操作邏輯表達式可以畫出對應(yīng)的邏輯電路圖(邏輯圖省略)。
通過前述的設(shè)計流程,得到了一個CPU的基本框架。通過Verilog語言實現(xiàn)CPU設(shè)計,并使用ModelSim仿真工具進行驗證CPU的正確性并下板。
3.1.1 單條指令功能驗證
在此步驟中,需要對設(shè)計好的CPU進行每條指令功能的驗證。將匯編語言編寫每一條指令的測試代碼,導(dǎo)入CPU的指令存儲器,在ModelSim下仿真運行,通過輸出波形判斷指令執(zhí)行是否正確。以下舉一個簡單的例子來說明:
sll $0, $0, 0
ori $1, 0x00000001
ori $2, 0x00000002
addu $3, $2, $1
此匯編指令用于測試Addu指令(假設(shè)所用到的Sll指令和Ori指令已經(jīng)測試通過)。將該指令放入CPU中運行,并使用ModelSim進行仿真后,結(jié)果如圖7所示,通過輸出波形判斷指令執(zhí)行是否正確。
圖7 單條指令測試波形
3.1.2 指令邊界數(shù)據(jù)驗證
在單指令驗證都正確的情況下,還需要對各指令的邊界數(shù)據(jù)進行測試,對CPU進行指令的完備性測試[10]。例如,對Addu指令進行測試時,選取邊界數(shù)據(jù):0x00000000,0xffffffff,0x0000ffff,0xffff0000,0x0f0f0f0f,0xf0f0f0f0,0x55555555,0xaaaaaaaa等。
多個測試單元可以作為多個測試程序執(zhí)行,也可以放在一個測試程序中順序執(zhí)行。然后將這些指令放入CPU中運行,并用ModelSim仿真,觀察波形驗證結(jié)果的正確性。
3.1.3 隨機指令序列驗證
在此步驟中,可以自行編寫一些符合MIPS規(guī)范的指令序列。為了方便結(jié)果驗證與比較,可先將這些指令序列放入MIPS仿真工具中運行[11],如MARS,獲得仿真結(jié)果后,再將指令序列放入CPU中運行,將其運行結(jié)果與MIPS仿真器中運行的結(jié)果進行比較,從而驗證CPU功能的正確性。
3.1.4 程序驗證
在完成了上面3步驗證后,就可以運行一個有意義的程序,觀察其運行結(jié)果,檢測自己的CPU是否正確運行。例如可以使用類似快速排序和斐波拉契數(shù)列的程序來驗證。
時序仿真不同于功能仿真,時序仿真使用布局布線后器件給出的模塊和連線的延時信息,在最壞的情況下對電路的行為作出實際的評價[12]。兩者的差別在于時序仿真加載到仿真器的設(shè)計,包括基于實際布局布線設(shè)計的最壞情況的布局布線延時,并且在仿真結(jié)果波形圖中,時序仿真后的信號加載了時延,而功能仿真沒有。
后仿真分為2個步驟,先做指令序列測試,再做程序測試。但是要注意initial塊不可綜合,后仿真和下板時需要使用ip核初始化iram。如在后仿真出現(xiàn)時序問題時,先采取降低CPU主頻的方法來解決,如果不行的話,就必須分析問題所在,修改或優(yōu)化CPU數(shù)據(jù)通路或部件。
當(dāng)仿真驗證都通過后,便可使用Vivado工具生成bitstream文件,進行下板驗證。使用的開發(fā)板為XILINX公司的NEXYS4板。下板前,根據(jù)需要設(shè)計的功能,在Vivado工程中添加相應(yīng)的外設(shè)代碼,N4板可以提供led和7端數(shù)碼管等外設(shè)功能。之后再編寫相應(yīng)的匯編代碼通過CPU對外設(shè)進行控制,從而驗證下板CPU的設(shè)計是否正確。
本文提出了一種教學(xué)用的CPU設(shè)計過程,通過對指令功能的分析,設(shè)計數(shù)據(jù)通路圖,再到使用集成開發(fā)工具編寫CPU設(shè)計代碼,最后進行仿真驗證和下
板。這一過程從簡單到復(fù)雜,從理論到實踐,循序漸進,逐步提高。學(xué)生通過完成CPU的設(shè)計過程,不僅鞏固了課本上的知識,還拓展了工程實踐視野。本文所提出的實驗設(shè)計方法,已經(jīng)在我校數(shù)屆學(xué)生中進行了應(yīng)用,通過對學(xué)生的問卷調(diào)查和實驗結(jié)果的驗收統(tǒng)計,學(xué)生CPU設(shè)計成功率從最開始的不到30%,逐漸提升到了50%,現(xiàn)今已經(jīng)達到了76%以上。而設(shè)計CPU的累計時長,也從最初的34 h以上,下降到如今的25 h左右,取得了良好的效果。
參考文獻(References)
[1] 鄒惠,王建東. 以CPU設(shè)計為核心的“計算機組成原理”課程教學(xué)改革探討[J]. 福建電腦,2016(3):84-85.
[2] 袁春風(fēng),陳貴海,黃宜華,等. “計算機組織與系統(tǒng)結(jié)構(gòu)”課程的教學(xué)現(xiàn)狀和改革思路[J].計算機教育,2009(16):153-156.
[3] 朱凌云. 對計算機組成原理教學(xué)的思考[J]. 計算機教育,2011(10):37-39.
[4] 鄒惠,王建東,劉坤起,等. “計算機組成原理”課程教學(xué)探討[J]. 工業(yè)和信息化教育,2014(12):45-48.
[5] 周剛,師維,陳潤,等.計算機組成原理實驗創(chuàng)新性改革探索與實踐[J].實驗技術(shù)與管理,2016,33(11):26-29.
[6] 徐愛萍,張玉萍,涂國慶. 基于VHDL之CPU設(shè)計與實踐[J]. 實驗室研究與探索,2014,33(5):120-124.
[7] 黃明,陳龍. 基于MIPS指令的CPU邏輯電路設(shè)計[J]. 科技展望,2014(18):100-101.
[8] 王力生,王煜. 計算機組成原理實驗教學(xué)方法改進[J]. 電腦知識與技術(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ù),2005,36(3):51-54.