

關鍵詞:計算機組成與結構;SystemC;總線仿真;系統級建模;硬件模擬
中圖分類號:G642 文獻標識碼:A
文章編號:1009-3044(2025)03-0131-03 開放科學(資源服務) 標識碼(OSID) :
0引言
計算機組成與結構作為計算機系統類課程的基礎,是學生全面了解計算機各個部件工作原理和主要功能的課程,也是集成電路相關領域的直接相關核心課程。該課程中近1/2的內容圍繞中央處理器CPU展開,包括運算方法、指令系統、CPU的組成與結構、控制系統、中斷系統等章節,1/4的課程圍繞存儲器展開,包括存儲器芯片的基本單元電路,存儲器與CPU 的連接,存儲器的校驗等。由于這門課難度較大,理論性較強,且涉及大量硬件知識,學生感覺到抽象、難以理解,因此采用合適的實踐方式,對于增強學生對課程的深入理解尤為關鍵。
傳統硬件實驗箱[1]的方式主要靠插拔電線完成,學生根據不同仿真部件的電路圖,利用杜邦線連接各個電路接口,并通過可視化界面觀察模型機的實驗數據通路圖。這種實驗方式將計算機的主要模塊封裝成為黑匣子,學生難以看到模塊內部的細節,不容易理解計算機各個模塊的基本工作原理,逐漸被其他方式所取代。近些年,Logisim [2-3]仿真軟件和FPGA硬件實驗箱的方式[4-5]已成為該課程的主要實踐平臺,其中Logisim仿真軟件是一個用于設計和模擬數字邏輯電路的仿真工具箱,該軟件提供了各種邏輯門(AND、OR、NOT) 和多種復雜的組合邏輯電路,借助于各種邏輯門和組合邏輯電路,可以進行加減法器、CPU、存儲器和總線等不同計算機模塊的設計。但是Logisim仿真需要學生對數字邏輯電路基本知識和仿真組件有扎實的基礎,能夠靈活地利用各種組件搭建復雜電路。FPGA方式盡管能夠較好地與實驗原理相結合,但前提是必須要有較強的FPGA動手能力,通常電子專業的學生有較強的FPGA開發能力,但是對于計算機專業的學生而言,往往較為欠缺。
對于計算機相關專業的學生,由于系統地學習了C/C++語言,使得他們已具備該語言的扎實編程能力。為了充分利用計算機專業學生較強的C/C++專業基礎和編程實踐能力,采用C++類庫的仿真方式不失為一種更好地調動學生積極性和能動性的方式。盡管SystemC仿真已應用到相關領域[6-7],文獻[8-9]也提到了基于SystemC的一些總線仿真方案,但是將SystemC 引入到計算機組成相關課程的教學設計和教學實踐中的相關研究較少。
在現有計算機語言中,不同語言所能夠建模的計算機層次并不相同,圖1給出了不同語言在計算機軟件、硬件中的應用范圍。從這幅圖可以看出,不同的開發語言適合不同的開發層級,對于門電路層、RTL層、IP驗證層和Soc[10]驗證層而言,Verilog比較適合,VHDL 一般不用于Soc驗證層的開發,而SystemC Verilog[11]能夠用于從門電路層到行為層的所有層次開發。相比而言,SystemC適用于從RTL層一直到算法架構層的開發,對于偏頂層的需求層以及算法和架構層開發,高級語言如C/C++、Matlab、Python和Java則比較適合。
從圖1可以看出,SystemC涵蓋了從RTL層到算法和架構層的所有系統層級,因此在系統級建模和開發上具有較大的優勢。
SystemC作為C++類庫, 在C/C++語言基礎上引入了時間概念和并發概念,時間概念的引入有助于事件先后次序的仿真,并發概念則契合了硬件內部的并發性特征。因此,基于SystemC的語言特點,SystemC可以完成以下幾種硬件仿真:1) 軟件算法的周期精確模型;2) 硬件架構探索;3) 片上系統的接口設計;4) 系統級設計;5) 執行過程驗證。
為此,本課程采用了SystemC[12-13]的仿真手段輔助本課程的實踐環節,通過SystemC的項目實踐,一方面讓學生深入體會如何利用軟件語言搭建硬件組件,另一方面也能夠進一步增強學生的代碼編寫能力。
1總線仿真分析
系統總線是計算機各個部件的傳輸介質,所有系統部件之間的數據傳輸和通信都需要系統總線實現。如何讓學生直觀地體會總線的傳輸特性對于學生理解并深刻認識總線的基本特性至關重要。
本課程在進行系統總線的理論講解時,分別講述了單總線結構、雙總線結構、多總線結構以及PCI Ex?press總線結構。考慮到學生對總線的直觀理解以及仿真的難度,開展實踐設計時,側重要求學生仿真單總線的結構,但是針對不同的學生層次,提供如下兩種總線的設計方案:單總線-單主從設備仿真和單總線-多主從設備仿真。其中單總線-單主從設備仿真為必做項,單總線-多主從設備仿真為選做項。圖2 和圖3分別為單總線-單主從設備仿真示意圖以及單總線-多主從設備仿真示意圖。其中單總線-單主從設備仿真只需模擬總線與總從設備的數據通信,單總線-多設備仿真在考慮數據通信的前提下,還需要考慮設備之間相互競爭時的判優方式。在判優方式的選擇上,建議學生使用先來先服務的輪轉優先級判優方法,該方法比教材[14]中的鏈式查詢更為有效,并且也比計時器定時方式和獨立請求方式簡單。該判優方式的基本思想是:根據不同主設備請求的先后次序,將其放入到一個先進先出的隊列中,依次進行響應,每次請求入隊前,要先進行判滿,請求出隊前先要進行判空。但是總線判優的這部分不作為必做項。因為判優的前提要保證所有的主從設備保持時鐘和進程的同步,對于剛入門SystemC系統級建模的初學者而言,這部分的難度較大,因此只作為選做內容供學有余力的同學進行實踐。
在總線仿真設計時,無論是采用上述圖2和圖3 中的哪一種仿真方案,都需要學生先考慮如下一些問題:1) 如何建模總線仿真模塊?2) 主設備、從設備和總線模塊之間的接口連接方式該如何設計?3) 每個模塊的必要結構應該包含哪些?這些前置問題的深入思考,有助于仿真過程的順利開展。
2基于SystemC的總線仿真實現
2.1 SystemC語言概述
SystemC作為一種系統級的仿真建模語言,既能夠進行周期精確級(CABA) [15]建模,又可以進行事務級(TLM) [16]建模,周期精確級建模需要仿真出每個周期的狀態,只能在全部的硬件設計完成之后才能進行軟件的測試和系統的集成,無法進行早期的系統架構設計。而事務級建模能夠在更高抽象層次上對芯片進行分析,從而讓設計人員快速地構建原型平臺。該方法不僅能夠進行硬件系統的架構探索和嵌入式軟件程序的開發,而且系統仿真速度很快。本課程著重向學生講述計算機各大部件系統級的功能,因此選擇事務級建模方法較為合適。
SystemC在對系統進行建模時,針對系統運行的要素,分別抽象出模塊、接口、端口、通道、進程等組件。從硬件角度來看,模塊是一個特定的功能單元,比如存儲器、總線、CPU均可以作為模塊,一個接口轉換電路也可以作為模塊。SystemC中的模塊除了具有C++類中必備的構造函數和析構函數以外,還需要在構造函數里面指定敏感表,比如可以指定模塊對clk 的上升沿敏感。在進行總線建模時,總線本身,以及與總線互連的主設備和從設備都可以抽象為一個SystemC的模塊。
在SystemC 中,接口實際上是一個C++抽象類,所有的接口都直接或間接繼承于sc-interface,接口用來定義模塊之間的通信方法。比如在總線建模時,需要定義讀接口和寫接口。
端口是一個對象,它是模塊的一個組成部分,它將模塊內部的行為與外部環境相連接。端口綁定到一個接口上后,就可以使用該接口定義的方法來進行通信。在SystemC中,有3種基本的端口:sc-in 、sc-out與sc-inout ,它們都從基類sc-port繼承而來,每一種端口都提供接口方法,如read()與 write() 等。比如總線建模時,需要將端口分別與讀寫接口綁定。
通道實現一個或多個接口,可視為一個通信容器,通道必須繼承一個或多個接口,這些接口中定義的抽象方法必須在通道中實現。通過端口,模塊中的進程可以連接到通道并使用通道提供的方法。在端口、接口與通道都定義完成后,模塊能夠使自己的端口與實現了相應接口的通道互連。在SystemC中,通道用于實現模塊間的異步通信,模塊通過通道將數據在發送方和接收方之間傳遞。
進程具有并發性,SystemC中的進程有如下特征:1) 一個進程不能包含或者調用0其他進程;2) 進程可以調用非進程的函數和方法;3) 進程通常會有一個敏感表,當敏感表中的信號上有事件發生時,進程就會被激活。在總線建模時,每個主從設備仿真模塊都需要有相應的進程。
2.2總線仿真設計
根據SystemC的仿真思想,可將主設備建模為主模塊,從設備建模為從模塊,總線建模為總線模塊,那么主要仿真要素如表1所示。需要定義主模塊、從模塊、總線模塊和頂層模塊。在主模塊內定義一個寫端口、從模塊內定義一個寫端口,并且要在主從模塊中分別設置進程敏感表,并將時鐘上升沿作為敏感表中的事件,而總線判優設定為選做模塊。
下面對表1中的主模塊、從模塊、總線通道、頂層模塊分別做簡單介紹。
1) 主模塊:主模塊定義為一個SC_MODULE 的C++類,類中需定義輸出端口,端口類型為寫接口類型,用于向總線模塊里寫入數據。定義自己的時鐘信號clk和構造函數,構造函數中除了實現一些初始化功能,還需指定進程和敏感表。進程采用SC_THREAD線性進程,敏感表使用sensitive指定,設置為對時鐘上升沿敏感,主模塊的main函數中使用rand函數模擬隨機寫入,使用wait函數實現模擬寫入頻率。
2) 從模塊:與主模塊類似,只需將端口類型改為讀接口類型,用于讀取數據。
3) 總線模塊:總線模塊也定義為一個SC_MODULE的C++類,該類中需定義傳輸的數據數組,讀寫事件、定義讀寫接口,用于主從模塊對總線的讀寫操作;由于該模塊主要用于數據傳輸,因此寫入數據還需要判滿,讀取數據判空等。若總線需要連接多個主從模塊,需要增加判優方法。
4) 頂層模塊:用于主從模塊和總線模塊之間的綁定,需要實例化這三個類的對象,再將先前定義的端口綁定在一起即可。最后在main函數定義時鐘信號,將主從模塊的時鐘與之綁定,并啟動仿真。
表1中的總線判優為選做項,仿真難度較大。若考慮總線判優,那么學生在仿真中首先必須實例化多個主設備模塊和從設備模塊,并且每個主設備模塊和從設備模塊必須預留多個輸入輸出端口。然后在此基礎上,需要實現不同的判優方法,每次總線在傳輸數據時,需要選出優先級最高的設備進行響應。
圖4給出了總線仿真各個模塊及其相互連接示意圖。主設備(Master)、從設備(Slave)、總線(Bus)和頂層模塊(Top)分別為4個SC_MODULE的類,在這4個類中,SC_MODULE(Master)和SC_MODULE(Slave)都需要定義一個SC_THREAD的進程。在主設備類中,需要定義寫接口與總線模塊進行端口綁定。在從設備類中,需要定義讀接口與總線模塊進行端口綁定。在總線類中,需要同時定義寫接口和讀接口,分別與主設備和從設備進行端口綁定。所有端口綁定的過程需要在頂層類中進行實現。當所有的模塊包括頂層模塊均已經定義完成,啟動sc_start 便可以進行仿真啟動。
3學生仿真中存在問題及原因分析
通過在仿真過程中對學生的引導,發現在建模方面,學生基本能夠抽象出主模塊、從模塊和總線模塊,但是存在如下突出問題:1) 仿真初期無法回歸到總線信息傳輸這一根本任務,難以建構清晰的仿真框架,比如學生在缺乏引導時,較難想到將主從設備以及總線建模為一個SystemC模塊;2) 頂層模塊之間的互聯機制理解不清,比如如何進行端口的綁定,如何進行時鐘的設置;3) 僅能夠實現單總線-單主從設備的仿真,總線判優方法難以實現。
以上問題的出現主要歸結為以下一些原因:1) 用軟件仿真硬件,需要對軟件的仿真思想有比較深刻的認識,而這方面可查閱的中文資料較少,學生普遍感到難以入門;2) SystemC有一套嚴謹的仿真邏輯,盡管在課程中為學生梳理了相關知識要點,但學生還需要花一些時間深入思考;3) 多設備仿真時的判優邏輯較為復雜,既要考慮到多個端口之間的相互綁定,又要考慮到不同設備之間的進程統一,對初學者難度較大,因此這一部分作為選做內容也較為合適。
為了改善這一情況,課程計劃采用如下解決方案:1) 建立一些優秀的案例庫,以案例學習帶動學生對理論的理解;2) 錄制一些優秀視頻,輔助學生對SystemC基礎理論知識的理解。
4結論
由于計算機組成與結構課程現有實踐方式不能充分培養學生的系統級建模和開發能力,結合計算機專業學生在C/C++程序設計方面的扎實基本功,引導學生利用系統級建模語言SystemC對總線傳輸過程進行仿真實踐。詳細闡述了總線仿真方案與思路,仿真實現的關鍵要素與相關細節,并對學生仿真中存在的問題進行了具體討論,下一步將深入研究如何利用SystemC進行更復雜模塊的建模,比如CPU和存儲器,研究這些復雜模塊的建模和設計方法,從而更好地指導課程教學。