彭蔓蔓,吳 強,李建江
(1.湖南大學 信息科學與工程學院,湖南 長沙 410082;2. 北京科技大學 計算機與通信工程學院,北京 100083)
ACM/IEEE在2016年公布的計算機工程課程體系指南(CE2016)和2013年公布的計算機科學課程體系指南(CS2013)都把計算機體系結構和組成(architecture and organization)列為核心知識模塊之一[1-2]。各個大學為計算機及相關專業開設了計算機組成或類似課程,并安排了對應的課程實驗[3-4]。
計算機組成課程實驗通常以硬件設計為主要內容,其中CPU設計一般作為核心,輔之以運算器、存儲器、I/O接口等硬件模塊的設計,目的在于使學生理解和掌握如何運用前期數字邏輯或類似課程所學的邏輯電路設計知識完成計算機系統主要硬件部件的設計[5]。
由于硬件設計較為繁雜,在實際教學中,學生往往會因為對硬件工作流程理解不夠,在設計初期不知如何開始而產生畏難情緒。為便于學生理解硬件工作原理,不少學校采用軟件模擬器或仿真程序的方式為學生展示硬件工作過程,使學生易于理解有關知識,完成硬件電路的設計[6-7]。
隨著現場可編程門陣列(FPGA)的發展和應用,計算機組成課程實驗的硬件設計越來越多地轉移到基于FPGA的實驗平臺上[8-10]。采用基于FPGA的實驗平臺進行計算機組成課程實驗常常遇到的問題是學生缺乏對FPGA設計流程和相應軟件工具的了解,在設計中容易因為一些簡單問題,如軟件設置、器件選擇、流程狀態等,不知如何解決而使設計過程陷入停頓,需要教師在實驗內容和教學方法上進行改進,以適應新的實驗平臺。
考慮到硬件設計尤其是CPU設計不僅僅是硬件設計,也涉及軟件相關知識,如編譯原理,硬件設計的流程也少不了相關的軟件工具,如模擬驗證程序等,因此,我們提出一種軟硬件協同的計算機組成實驗方案,主要包括:①把匯編器、模擬器等軟件工具納入實驗項目中;②設定匯編器、模擬器的輸出形式與硬件設計測試所需的格式一致;③利用上述工作構建一個閉環的設計流程。
計算機組成課程在教學計劃中作為必修課,被安排在大二下學期,開設給計算機科學與技術、軟件工程、通信工程等學科及相關專業的學生。計算機組成課程的先修課數字邏輯或數字電路會被安排在大二上學期。另外,所有專業的學生都會在大一下學期學習C/C++程序設計課程。因此,在學習計算機組成課程時,學生已經修完了軟件和硬件方面的必要課程,具備一定的軟件和硬件設計能力。
按照學校的要求,計算機組成課程采用“大班授課,小班討論”,輔之以課程實驗的方式組織教學[3]。課程的總學時為96課時,其中課堂教學64課時,課程實驗32課時,每次4節課,共計8次實驗課。每次實驗課通常會安排一個實驗項目,要求當場完成并演示,課后提交實驗報告,但是對于較大或者較難的實驗項目,會安排兩次實驗課來完成。
實驗項目以CPU設計為核心,包括主要硬件部件和相關的模擬器、匯編器等軟件工具,結合課程教學進度的考慮,安排如表1所示的實驗項目。
實驗項目中主要包括運算器、存儲器和CPU三大部件,每個部件都有硬件設計和對應的模擬器設計。模擬器設計的主要目的是為相應的硬件電路設計提供一個可用于驗證的參考,因此,通常安排在硬件電路設計之前完成。不過,因為存儲器功能比較簡單,所以存儲器模擬器和硬件電路設計合并在了一個實驗項目中。
實驗項目中的匯編器設計主要是為CPU模擬器和CPU硬件電路提供二進制指令代碼輸入,這個工具一方面可以使學生不必手工把指令翻譯成二進制代碼,減少出錯概率,另一方面也有利于學生在測試CPU時采用更多的測試指令序列,提高實驗效率。
計算機組成課程實驗的6個實驗項目計劃安排8次實驗課,需要在8周時間內完成。考慮到實驗項目之間有圖1所示的邏輯關系,實驗項目也要遵循由簡到繁、由部分到整體的循序漸進過程,同時考慮到CPU模擬器設計和CPU硬件設計較復雜、工作量較大,因此,CPU模擬器設計和CPU硬件設計2個實驗安排2次實驗課(2周),其余4個實驗項目都安排1次實驗課(1周)。具體的進度計劃為:第1周,運算器模擬器設計;第2周,運算器硬件設計;第3周,匯編器設計;第4周,存儲器模擬器和存儲器硬件設計;第5—6周,CPU模擬器設計;第7—8周,CPU硬件設計。
實驗項目和進度計劃的核心思想是通過軟硬件協同的設計流程來幫助學生理解和掌握相關知識及技能。設計流程的基本步驟有:①設計軟件模擬器,模擬所需的功能;②設計硬件電路,實現所需的功能;③針對測試輸入,利用第①步中的軟件模擬器產生參考輸出,并與第②步所設計電路的輸出做比較,驗證結果的正確性;④如果發現模擬器和電路的輸出不一致,檢查軟件模擬器和硬件電路的實現,修改錯誤,直到結果一致。

表1 實驗項目

圖1 實驗項目邏輯關系
圖2展示了上述設計流程在CPU設計過程中的實際運用,這一設計流程使得CPU設計形成了從測試程序輸入到設計結果驗證的一個閉環,學生可以利用這個閉環不斷測試和改進設計,直到達到設計目標。

圖2 CPU設計流程
第1周和第2周安排的運算器模擬器和硬件設計是讓學生按照這種軟硬件協同的設計流程進行初步的訓練。第4周安排的存儲器模擬器和硬件設計是對這種軟硬件協同設計流程的強化。第3周的匯編器設計和最后4周的CPU模擬器和硬件設計則是對學生是否掌握這種軟硬件協同設計流程的綜合考核。
我們在2016和2017兩年的計算機組成課程中采用了軟硬件協同的實驗方案,學生的課程評價顯示他們對這一實驗方案是接受和歡迎的。課程討論和課后交流中,學生反映設計模擬器和匯編器的實驗項目對他們理解硬件運行原理,完成硬件設計的幫助很大。
學生在實驗中需要設計3個模擬器,運算器模擬器、存儲器模擬器和CPU模擬器。預估的教學難點為CPU模擬器的設計,但在教學中,學生針對運算器和存儲器模擬器的設計提出的問題更多。這主要是學生在以前的課程中很少接觸模擬器,因此對于如何設計模擬器沒有可借鑒的思路。在教學中,我們以學生學過的數字邏輯課程中的加法電路為例來說明模擬器進行功能模擬的方法。雖然這個例子比較簡單,但是從學生反映來看,這樣舉例說明比單純地講解模擬器設計方法更易于理解。
經過運算器和存儲器模擬器的設計訓練后,學生對于模擬器的設計有了了解,在設計CPU模擬器時主要問題是如何確定CPU的輸入和輸出。我們提示他們考慮CPU與存儲器的接口,CPU取指的指令序列,以及CPU內部寄存器和存儲器的內容變化,學生往往很快就理解并可以繼續進行設計。
學生在匯編器設計中提出的問題集中在“偽指令”方面。我們在匯編器設計中,為了方便數據的放置,增加了數據偽指令。由于數據偽指令不屬于CPU指令集,學生往往不理解為什么需要這些偽指令,也容易把它們與CPU指令混淆,以為CPU有這些數據偽指令。我們通過匯編過程舉例講解、實際程序反匯編的方式來向學生解釋需要數據偽指令的原因,數據偽指令的特點和匯編器對其的處理。經過講解后,學生普遍能夠理解數據偽指令的目的及其翻譯方法。
在采用基于FPGA的實驗平臺后,硬件設計工具往往是FPGA廠商提供的設計軟件。這些軟件本身通常是商業軟件的免費版本,功能和設計流程復雜,在實際教學中需要學生花大量時間了解和掌握。
為了減輕學生學習這些硬件設計工具的負擔,幫助他們盡快熟悉設計流程,我們要求學生采用硬件描述語言進行硬件設計,并把實驗項目中模擬器和匯編器的輸出都設定為硬件描述語言能接收或規定的形式。這樣模擬器和匯編器的輸出結果能由硬件描述語言文件接口讀取,為測試驗證所用,從而使設計流程運轉起來。
學生的反應肯定了軟硬件協同的設計流程,雖然學生在初期對于輸出格式的要求存在疑問,不理解為什么采用這種格式,但在經歷過一次硬件測試之后,都極為認可這種利用模擬器產生參考輸出,與電路輸出做比較的方式,因為這顯著提高了測試的效率。學生在熟悉這一流程后,能夠不斷改進他們的硬件設計,達到設計目標。
通過把模擬器和匯編器設計納入計算機組成課程實驗項目中,與相關的硬件部件設計相結合,構建一個軟硬件協同的設計流程,使學生能有效地生成參考結果,用于測試和驗證,從而不斷地改進硬件設計,達到設計目標。近兩年的實驗教學效果表明這一軟硬件協同的實驗方案有利于學生理解計算機系統主要硬件部件的工作原理,掌握它們的設計方法和設計技能。我們也將通過更多教學實踐持續改進這個軟硬件協同的實驗方案。