姚英彪, 曾憲彬
(杭州電子科技大學 通信工程學院,杭州 310018)
嵌入式系統設計實驗的Qt MIPS仿真軟件開發
姚英彪, 曾憲彬
(杭州電子科技大學 通信工程學院,杭州 310018)

針對嵌入式系統設計的實驗教學,采用Qt C++應用程序開發框架,開發了一款嵌入式軟硬件仿真平臺軟件Qt MIPS。Qt MIPS主要特點如下:集匯編代碼編輯、匯編、仿真和調試于一體,并具有友好的人機交互界面;支持周期準確的MIPS32指令仿真和分層存儲系統的參數化配置;提供多種性能統計工具,對學生開放仿真器源碼。Qt MIPS使用實踐表明,它能夠加深學生對嵌入式系統設計相關理論知識的理解,能夠培養學生的嵌入式系統編程能力和系統性能分析能力,有效提升嵌入式系統設計的實驗教學效果。
嵌入式系統; 仿真軟件; 實驗
近幾年來,隨著嵌入式系統在各行各業的應用,嵌入式系統設計已經成為高等院校電子信息類專業的一門重要基礎課程。在其理論和實踐教學過程中,如何讓學生更直觀的理解嵌入式系統組成和嵌入式處理器指令集,以及部件級(如CPU、內存)和系統級的性能評價與優化方法,一直是一個難點問題[1-2]。利用仿真技術,可以在沒有硬件實驗平臺的條件下(如各種開發板),通過軟件抽象建模嵌入式硬件系統的“軟”平臺,然后模擬指令序列在目標處理器上的執行[3-5]。這種方法因為可以更好的觀察指令執行過程,分析系統的部件和整體的性能,因此在嵌入式系統設計實踐教學過程中被廣泛采用。
目前,常見的嵌入式仿真軟件有ARM ADS1.2[6]、MIPS SPIM[7]、CCS[8]等。這些仿真軟件都是CPU廠家提供的商業軟件,主要面向嵌入式系統開發,存在源碼不開放、參數固定等諸多缺點,不適合應用于嵌入式系統設計課程的實踐教學。SimpleScalar[9]作為一款開源的仿真軟件,支持多種類型的處理器,但它沒有提供圖形用戶界面,需要在Linux系統中利用命令行進行相關參數配置,操作極其麻煩,因而也不適合嵌入式系統設計課程的實驗教學。MARS[10]雖然是面向教學開發的仿真軟件,但同樣存在源碼不開放,功能少等缺點。因此,專門面向嵌入式系統設計實驗教學的仿真軟件還是比較缺乏。
針對上述問題,本文設計了一款面向嵌入式系統設計課程實踐教學的仿真軟件Qt MIPS。Qt MIPS采用Qt C++應用程序開發框架開發,可以跨平臺運行[11];面向MIPS指令集[12-13],可以實現MIPS32指令集的周期準確仿真;支持參數化的存儲系統配置,可以進行存儲系統設計探索[14];支持處理器內部寄存器、存儲器的實時查看和修改,以及各種性能統計;為基于MIPS的嵌入式系統設計實驗提供了一個集匯編程序編輯、匯編、配置、調試、運行于一體的集成實驗環境。
Qt MIPS采用模塊化的設計方法和C++語言開發完成。它可以分為5個模塊,分別為編輯器(Editor)、匯編器(Assembler)、仿真器(Simulator)、調試器(Debugger)、性能分析與展示器(Profiler),如圖1所示。圖中實線表示仿真流程,虛線表示控制流程。

圖1 Qt MIPS總體結構
Qt MIPS核心是仿真器,它由CPU流水線、片上內存和片外內存三部分組成,如圖2所示。CPU流水線采用經典5級流水線建模[12-13],分為取指(IF)、譯碼(ID)、執行(EXE)、訪存(MEM)和回寫(WB)。片上內存采用Scratch-Pad RAM(SPM)和高速緩存(Cache)建模[14]。

圖2 Qt MIPS的仿真器總體結構
Qt MIPS作為一款集編輯器、匯編器、仿真器、調試器于一體的面向“嵌入式系統設計”課程實驗教學的仿真平臺軟件,其基本功能包括:
(1) 編輯功能。Editor實現指令高亮顯示,字符查找等功能,方便進行匯編代碼編輯。
(2) 匯編功能。Editor里的匯編代碼,可以通過Assembler進行匯編,然后仿真執行。
(3) 仿真功能。Simulator支持周期準確的MIPS32指令集仿真,并且支持仿真時單步/多步執行時指令跳轉高亮動態跟蹤功能。
(4) 調試功能。Debugger支持快捷的仿真執行控制功能,如斷點,執行次數,多步執行的步數設置,寄存器與內存內容查看等。
此外,為方便“嵌入式系統設計”課程實驗教學,還具有如下特色功能:
(1) 跨平臺特性。采用Qt編程實現,可以運行于Windows、Linux等多種操作系統下,實現了仿真軟件的跨平臺性。
(2) 參數化設計。CPU的時鐘、片上/片外內存的大小、性能,以及Cache的組織方式都是參數化設計。在實驗過程中,通過設置這些參數,就能改變嵌入式系統的性能,這樣學生更容易理解嵌入式系統性能的影響因素。
(3) 詳盡的性能統計工具。仿真器在仿真時,實時統計程序執行時鐘周期數,片上內存命中次數,片外內存訪問次數等各種統計數據,便于學生深入理解嵌入式系統的部件級和系統級的性能評價。
(4) Simulator源碼開放。對嵌入式系統設計特別感興趣的同學,可以查看Simulator源碼,深入理解嵌入式系統組成、軟件執行過程、現代CPU的原理等內容,甚至在提供的Simulator源碼基礎上還可以進行二次開發。
2.1 編輯器
Editor實現匯編程序新建、打開、保存、編輯等功能。Qt MIPS支持的匯編程序為*.s結尾的文本文件,打開效果如圖3所示??梢钥吹?,Editor支持不同類型關鍵字用不同顏色表示,所在行代碼高亮顯示。此外,Editor也可以打開機器碼文件(工具欄第3個按鈕)。最后,Editor也實現了常用的文本編輯器所具有的字符查找、剪切、復雜等功能,方便學生編輯和調試MIPS匯編代碼。

圖3 Editor打開*.s匯編文件
2.2 調試器
調試器主要實現寄存器設置、存儲設置、斷點設置、運行設置(單步、多步、執行次數等)等。其中,存儲設置是Qt MIPS的一個亮點,它包括內存結構設置和內存顯示控制設置,分別如圖4和圖5所示。從圖4中可以看到,Qt MIPS可以實現SPM添加及其大小配置,Cache的大小及組織方式設置,具體包括Cache的組數、塊大小、相聯映射方式、替換策略、寫策略、寫缺失策略等。由圖5可見,Qt MIPS內存顯示設置包括顯示數據類型、內存類型、起始地址及長度設置、訪問次數統計地址設置等。

圖4 內存結構設置圖5 內存顯示設置
2.3 性能分析與展示器
在指令仿真運行期間,Qt MIPS重載匯編代碼的機器碼,在Profiler展示,如圖6所示。Text Segment窗口實現了單步/多步執行時指令跳轉高亮動態跟蹤,最左邊的是機器碼,中間是指令的存儲地址,右邊是對應的匯編代碼。Console窗口實時顯示程序指令執行條數t1,數據內存總訪問次數t2,SPM的訪問次數t3,以及數據Cache的訪問次數t4,命中次數t5,以及指令Cache的訪問次數t6,命中次數t7等實時仿真統計結果。Registers和Memory窗口實時顯示寄存器或內存的值。Labels窗口顯示匯編代碼中的標號情況(數據對象和函數對象的首地址)。
根據圖6Console窗口輸出的性能統計結果,可粗略評價嵌入式系統的處理性能,即程序執行時間T可以近似為:
T=[t1+t3(Nspm-1) +(t5+t7)(Nhit-1)+ (t4+t6-t5-t7)Nmiss]·CCT
式中:CCT是處理器的時鐘周期(假設指令都為單周期指令);Nspm是SPM訪問時鐘周期;Nhit是Cache訪問命中時的時鐘周期;Nmiss是Cache訪問缺失時訪問外存的時鐘周期。
3.1 匯編器
Qt MIPS的匯編器是利用Flex和Bison這兩個開源工具實現[15]。Flex是一款詞法分析器生成工具,利用Flex可以快速地生成詞法分析器,識別文本中的詞素。Bison則是一款語法分析器生成工具,可以根據用戶設定好的語法,快速生成相應的語法識別程序。因為它們生成的匯編器是串行匯編,分支、跳轉、子程序調用及存取指令若在符號地址定義之前出現的話,就會出現匯編錯誤。

圖6 Profiler結構
圖3中Edit窗口第14行“la$16, my_bs+4”與第18行“sw 0, my_bs+1036”這兩條匯編指令,由于my_bs符號在18行之前未定義,在沒有進行任何處理的情況下,匯編器會串行匯編將my_bs的值設定為0,然而在圖3 Labels窗口中可見,my_bs的地址是0x10005430,所以匯編器會發生串行匯編錯誤。為解決這個問題,本文提出了SR(保存恢復)算法,它用到兩種映射容器類Map和Multimap。Map容器是一對一映射容器,Multimap是一對多映射容器,如圖7所示。其中,infoLine是一個用戶定義的結構體,用來保存含符號的指令行信息。

main0x00400024my_bs0x10005430……

Map
Multimap
圖7 Map與Multimap容器類
SR算法是根據符號label出現位置分別處理。①label出現在定義處:此時先將label保存到Map中,然后判斷label是否出現在Multimap中;如果出現,說明在label定義之前已經有指令用到該label,需要恢復Multimap中的使用該label的指令;如果沒出現,不需要做任何處理。②label出現在指令中:此時需要判斷label是否出現在Map中,如果出現,說明label已經在之前定義好,可以直接使用Map中該label的值匯編該指令;否則,說明label還未定義,需要將該label保存到Multimap容器,等到該label定義后再恢復。
3.2 仿真器
3.2.1 CPU流水線仿真
Qt MIPS的仿真器采用經典的5級流水線,分別為IF、ID、EXE、MEM和WB,每級流水線的功能為:
IF——訪問指令內存,得到32 bit的指令。
ID——對指令進行譯碼,根據譯碼結果讀取CPU寄存器的內容。
EXE——完成指令執行。
MEM——Load/Store指令完成數據內存訪問。
WB——指令執行結果保存到寄存器文件中。
為便于學生理解CPU硬件結構,這5級流水線分別編寫相應函數。在程序實現時,碰到的一個難點問題是MIPS體系結構的延遲槽指令的程序流程控制,它反映在IF和EXE流水級。為此,在Qt MIPS的仿真器設計中,使用了兩個指針PC和Delay_PC,以及一個分支跳轉指令狀態標志BJ_Flag來實現指令執行順序的控制。程序執行流程控制的偽代碼為:
(1) IF階段的流水線控制
1. if (BJ_Flag=0)
2. Access(PC); Delay_PC=PC+4;
3. else if (BJ_Flag==1)
4. Access(Delay_PC); Delay_PC=PC; BJ_Flag=2;
5. else
6. Access(Delay_PC); PC=Delay_PC; Delay_PC=PC+4; BJ_Flag=0;
IF階段:①BJ_Flag=0,代表EXE級的指令不是跳轉指令,下一條指令地址在PC處,因而通過Access(PC)取指,并設置延遲槽指令地址Delay_PC為PC+4。②BJ_Flag=1,代表EXE級的指令是跳轉指令,下一條指令需要取延遲槽里面的指令,即在Delay_PC處,因而通過Access(Delay_PC)到延遲槽中取指,然后設置Delay_PC為上一條跳轉指令真正的目標地址PC,最后設置BJ_Flag=2進入跳轉狀態。③BJ_Flag=2,代表需要執行跳轉指令真正目標地址處的指令,因而通Access(Delay_PC)取指,最后將PC、Delay_PC和BJ_Flag恢復為正常指令執行狀態。
(2) EXE階段的流水線控制
1. if跳轉指令
2. BJ_Flag=1;
3. if跳轉成功
4. PC=目標地址;
5. else
6. PC+=8;
7. else
8. BJ_Flag=0; PC+=4;
EXE階段:需要對指令類型進行判斷,①如果該指令不是跳轉指令,設置BJ_Flag=0,PC=PC+4,表示流水線處于正常狀態;②如果該指令是跳轉指令,設置BJ_Flag=1,表示流水線即將進入延遲狀態;然后判斷跳轉指令跳轉是否成功,如果成功,設置PC為新的目標地址,否則設置PC=PC+8(由于存在延長槽)。
3.2.2 存儲系統仿真
Qt MIPS的存儲系統支持片上SPM大小,Cache塊數、塊大小、地址映射策略、替換策略、寫策略等的參數化配置。其中,Cache地址映射策略包括直接映射、組相聯映射策略;替換策略包括最近最少使用(LRU)策略和先入先出(FIFO)策略;寫策略包括寫透(Write Through)和寫回(Write Back)策略[16]。Qt MIPS存儲系統建模的難點在于Cache的建模,其模型如圖8所示。圖中,FIFO/LRU替換策略的主要差別在于:
(1) 在訪問Cache命中時,采用FIFO策略,不需要更新FIFO隊列順序;采用LRU策略,需要將命中項調整到LRU隊列的最近訪問位置。這一點體現在圖9中的第4和第6請求,此時FIFO隊列順序不變,而LRU隊列順序發生變化。
(2) 在Cache未命中需要選擇剔除項時,雖然形式上都是選擇隊尾的項進行剔除,但是物理意義不一樣。FIFO隊尾項代表該項是最先進入隊列,而LRU隊尾項代表該項是最近最少使用。這一點體現在圖9中的第5請求,此時FIFO策略選擇剔除“0”,LRU策略選擇剔除“1”。
由于這兩點的不同,故FIFO/LRU替換策略的性能不一樣。例如,在圖9示例中,當處理第4請求“0”時,隊列順序已經不一樣;當處理第5請求“3”時,隊列內容已經不一樣;當處理第7請求“0”時,命中情況已經不一樣,即性能不一樣。

圖8 Qt MIPS的Cache讀寫模型

圖9 FIFO/LRU替換策略舉例(假設Cache的容量為3,初始為空)
針對嵌入式系統設計的實驗教學,采用Qt跨平臺C++應用程序開發框架,開發了一款支持MIPS32指令集的嵌入式軟硬件仿真軟件Qt MIPS。它集MIPS32匯編代碼編輯、匯編、仿真和調試于一體,并且其仿真器的源碼開放。學生在學習嵌入式系統設計相關理論知識的同時,通過使用Qt MIPS仿真和學習其源碼,可以更直觀地理解嵌入式系統的組成、嵌入式CPU的指令集和流水線,以及部件級(如CPU、存儲)和系統級的性能評價與優化方法等。Qt MIPS在我校的“嵌入式系統設計”實驗教學中使用結果表明,它能明顯加深學生對嵌入式系統設計相關理論知識的理解和融會貫通,同時對增強學生的嵌入式系統設計興趣也起到意外的效果。
[1] 仲偉波, 包亞萍, 付躍文, 等. 關于嵌入式系統教學的幾點思考[J]. 實驗室研究與探索, 2006, 25(12),1565-1568.
[2] 左冬紅, 羅 杰, 張 林, 等. 計算機原理與接口技術實踐教學改革[J]. 實驗室研究與探索, 2015, 34(10), 187-190.
[3] 龔 軍, 羅 杰, 汪小燕. 基于仿真的嵌入式系統教學實驗方法[J]. 實驗室研究與探索, 2009, 28(5), 53-56.
[4] 付琳 , 胡 錦, 梁利平. 指令集仿真器的關鍵技術[J]. 計算機應用, 2015, 35(5): 1421-1425.
[5] 王盛朋, Vania Joloboff, 鄧仰東. 一種基于近似計時模型的嵌入式CPU仿真器[J]. 計算機仿真, 2014, 31(5): 238-242.
[6] 李哲英, 駱 麗, 劉元盛. ARM 核嵌入式系統的開發平臺ADS[J]. 半導體技術, 2002, 27(2): 13-16.
[7] Larus. J. SPIM: A MIPS32 simulator[EB/OL]. http://pages.cs.wisc.edu/~larus/spim.html.
[8] 陽 華, 劉海濤. 新一代TI集成開發環境Code Composer Studio[J]. 微處理機, 2001(2): 24-26.
[9] SimpleScalar[EB/OL]. http://www.simplescalar.com/.
[10] K. Vollmar and P. Sanderson. MARS: an education-oriented MIPS assembly language simulator[J]. ACM SIGCSE Bulletin, 2006, 38 (1): 239-243.
[11] Qt參考文檔[EB/OL]. http://www.qtopia.org.cn/doc/qiliang.net/qt/index.html.
[12] 左冬紅. 計算機原理與接口技術——基于MIPS架構[M]. 北京: 清華大學出版社, 2014.
[13] 趙俊良, 張福新, 陶 品. MIPS處理器設計透視[M]. 北京:北京航天航空大學出版社, 2005.
[14] Kumar T.S. Rajesh, Ravikumar C.P, Govindarajan R. Memory Architecture Exploration Framework for Cache Based Embedded SOC[C]. 21st International Conference on VLSI Design, 2008: 553-559.
[15] 曾憲彬. MIPS仿真器設計與應用[D]. 浙江: 杭州電子科技大學, 2013.
[16] J. L. Hennessy and D. A. Patterson, Computer Architecture: A Quantitative Approach[M]. San Francisco: Morgan Kaufmann Publishers Inc, 2002.
Development of Qt MIPS Software for Embedded System Design Experiments
YAOYing-biao,ZENGXian-bin
(College of Communication Engineering, Hangzhou Dianzi University, Hangzhou 310018, China)
Focusing on the experimental teaching of embedded system design, we developed a simulation platform for an embedded software and hardware, briefly called as Qt MIPS. The platform is based on Qt C++ application development framework. The features of Qt MIPS include that it has integrated the editor, assembler, simulator and debugger together, and has friendly man-machine interface; it supports cycle-accurate MIPS32 instruction simulation and parameterizes hierarchical memory system; it provides several performance statistics tools and source codes of its simulator are open for students. The usage practice of Qt MIPS shows that it can help students to have a better understanding the relevant theoretical knowledge and train students programming capability and performance analytical ability of embedded system design. Therefore, it can greatly improve the experimental teaching effect of embedded system design.
embedded systems; simulation software; experiments
2016-03-01
杭州電子科技大學《單片機與嵌入式系統》教學模式改革項目;高教重點改革項目(SYZD1108)
姚英彪(1976-),男,湖北松滋人,博士,副教授,碩士生導師,研究方向為嵌入式系統設計。E-mail:yaoyb@hdu.edu.cn
TP 391.9
A
1006-7167(2017)01-0098-06