王力生, 余智銘, 張冬冬
(同濟大學 電子與信息工程學院, 上海 201800)
“計算機組成原理”是計算機專業基礎課程,其課程內容與計算機多門專業課程聯系緊密,學生對其內容的理解直接或間接地影響到對其他專業課程的學習,并關系到學生對計算機系統的整體認識[1-5]。
在教授這門課程時加入CPU設計實驗可以幫助學生理解計算機的組成結構[6],但是,由于CPU設計實驗本身具有較高的難度,致使許多學生不能很好地完成課程實驗。主要問題在于學生設計CPU時,數據通路設計不清[7]、信號傳輸錯誤﹑各部件連接混亂等。針對這些實驗教學問題[8],本文提出了一種幫助學生更好地設計出單周期CPU的方法[9]。
本文所設計的CPU是基于MIPS32構架,由31條指令集組成。使用的設計語言為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設計思路由以下步驟組成。
根據指令功能和格式列出完成指令功能所需的部件,用部件關系表將每個部件的數據來源列出,根據關系表用連線將每個部件連接起來,設計該指令的數據通路[10]。每條指令的數據通路單獨設計完后,再將所有數據通路合并成總的數據通路。
(1) 繪制指令流程圖。根據初步設計好的數據通路,把每一條機器指令分解為一系列微操作,并排列為有先后次序、互相銜接的指令流程圖。
(2) 編排指令操作時間表。依據各條機器指令的操作流程圖,編排指令取指到執行的操作時間表。
(3) 進行微操作綜合。按照所有機器指令的操作時間表,把相同的微操作綜合起來,得到每個微操作的邏輯表達式。
(4) 畫出控制器CU邏輯電路。根據各微操作的邏輯表達式設計CPU控制單元。
由于31條指令集中的一些指令的數據通路和指令流程具有相似性,只是在指令拓展之后,需要加上相應的數據選擇器,以確保數據能正確傳輸。因此在本文中,僅以部分具有代表性的指令進行分析設計,起到以小見大的作用。
取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。各部件之間數據輸入輸出關系如表1所示。

表1 Addu指令部件數據輸入輸出關系
通過對指令功能的分析和數據的傳輸關系,可以畫出如圖1所示的Addu指令數據通路:

圖1 Addu指令數據通路
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(數據存儲器),部件之間數據輸入輸出關系如表2所示,數據通路如圖2所示。

表2 Lw指令部件數據輸入輸出關系

圖2 Lw指令數據通路
2.1.3 J指令格式

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

表3 J指令部件數據輸入輸出關系

圖3 J指令數據通路
然后合并3條指令的數據通路,先將3條指令的部件關系表合并,如表4所示。某個部件有來自不同部件的輸入就用多路選擇器,合并的數據通路如圖4所示。

表4 3條指令部件數據輸入輸出關系

圖4 3條指令數據通路
2.2.1 繪制指令流程圖
獲得指令的數據通路圖后,可根據指令的運行流程,繪制出指令流程圖。在指令流程圖中,應標明每一步所需要的信號,這樣有助于理清各個信號的作用階段。圖5給出了Addu,Lw以及J指令的指令流程圖。

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

表5 指令操作時間表
2.2.3 進行綜合微操作
根據第三步(2.2.2節)的操作時間表,可將相同的微操作綜合起來,得到每個微操作的邏輯表達式。Addu,Lw,J這3條指令的微操作綜合邏輯表達式結果為:
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 三條指令完整數據通路
2.2.4 畫出CPU的CU邏輯電路
根據微操作邏輯表達式可以畫出對應的邏輯電路圖(邏輯圖省略)。
通過前述的設計流程,得到了一個CPU的基本框架。通過Verilog語言實現CPU設計,并使用ModelSim仿真工具進行驗證CPU的正確性并下板。
3.1.1 單條指令功能驗證
在此步驟中,需要對設計好的CPU進行每條指令功能的驗證。將匯編語言編寫每一條指令的測試代碼,導入CPU的指令存儲器,在ModelSim下仿真運行,通過輸出波形判斷指令執行是否正確。以下舉一個簡單的例子來說明:
sll $0, $0, 0
ori $1, 0x00000001
ori $2, 0x00000002
addu $3, $2, $1
此匯編指令用于測試Addu指令(假設所用到的Sll指令和Ori指令已經測試通過)。將該指令放入CPU中運行,并使用ModelSim進行仿真后,結果如圖7所示,通過輸出波形判斷指令執行是否正確。

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