【原创】MIPS中断系统的板级验证及实例测试
生活随笔
收集整理的這篇文章主要介紹了
【原创】MIPS中断系统的板级验证及实例测试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
“五一”假期前后這約五天時間,終于將MIPS中斷系統進行了板級驗證及實例測試。因為老師給的交叉編譯工具不會用,所以測試代碼完全用MIPS匯編編寫。使用MARS而沒有用QtSpim,其實我覺得SPIM這個東西比較復雜,但是確實很好用,但是MARS是開源,可以根據你的需求修改這個匯編器(這個匯編器功能很強大,筆者至今沒有用熟練)。據傳說MARS可以支持link異常處理程序,但是我沒有這么做,手動鏈接也是一樣的,本來我們做的就是最底層的事情。 首先,必須要強調的是MIPS中斷有別于Intel中斷,兩者用本質上的區別。Intel中斷使用中斷控制器8259控制中斷,但是MIPS體系架構不同,它僅僅使用了很簡單巧妙的方式處理中斷。據我個人淺薄認識,8259是用來擴展中斷源,而并不能認為只有8259可以控制中斷,它控制的更多的是優先級。其實對中斷響應等更具備控制權限的是CPU,所有的外部信號都需要由處理器控制是否響應等等。筆者,已經模仿8259的功能寫了一個片上中斷控制器,而今天所講的中斷系統并不包含8259,僅僅是捕獲最原始的中斷源,即將中斷源的輸出信號直接與Cause(IP)位的某一位相連。 為什么講這么多有關8259的事情,因為這里有一個誤區,也是我們做中斷做了N多久遺留的誤區。就是我們認為中斷請求信號僅僅是一個脈沖,這個脈沖可能持續一個時鐘周期,也可能持續N個時鐘周期,然而這種想法一定是錯的。《Intel微處理器》P356頁有一個標準的INTR輸入和INTA輸出的時序圖。所有INTR信號都是一個從低電平越變到高電平的信號,并持續保持高電平。另外,《微機原理與接口技術》這本書中P273頁詳細描述了8253的方式0的功能:中斷信號發生器。如下圖所示。當計數到0后,將產生一個持續的高電平。 我想說的是,用FPGA去驗證和我們實際學到的知識理論可能會有很大的不同。就拿我現在最不理解的來說,《Intel微處理器》P357頁描述使INTR輸入為邊沿觸發信號,其處理辦法就是將中斷請求信號作為D觸發器的CLK,如下圖所示。 這種方式在FPGA中絕對是沒法實現的,因為所有人都知道做SOC最重要的就是時鐘。時鐘是所有時序電路的靈魂,用一個中斷請求信號作為CLK,非常不穩定,我甚至懷疑是否允許這樣做。其實,還有更多的例子。我覺得不能講書中的電路圖或者設計方式生搬硬套到FPGA設計中,而是要自己進行設計和轉換。還有,Intel的東西只是一種參考、一種理論,并不是絕對的,并不是一成不變的。 說了那么多有關Intel的東西,只是想做個比較。與之對照的自然是MIPS。MIPS采用很簡單的方式處理中斷。其實,說簡單點而就是僅使用CP0的部分處理器實現,很多工作都由軟件來進行。同時,N多MIPS手冊或者《see mips run》都強調MIPS更樂于使用Compability方式而非Intel的向量化方式。首先,我覺得采用向量化的方式最大的好處就是快速,快速地定位到產生向量的中斷處理程序中。須知Intel可以處理256個中斷。而此中斷包含了異常(如溢出)。而MIPS僅有不多的異常,此異常包含中斷。這個概念最開始讓我們很是琢磨不清,一會兒異常包含中斷,一會兒中斷包含異常。但是仔細想想,無論哪種方式都只是非正常執行外的一種處理方式。道理很類似,非常類似。所有的中斷都只對系統不會產生負面影響的內部或外部的要求系統處理的信號,系統可以不理睬。而一場則是負面影響,系統若不長時間處理會產生極大的危害。 所謂Compatibility中斷模式,其實我個人認為也是由于在MIPS中,一場包含中斷,系統只提供8個中斷源接口(2個軟件、6個硬件)。不要認為,接口少。可以講中斷控制器的INTR信號直連如其信號源,很多MIPS處理器都是這樣。由于我們只是做一個有關學習的SOC,所以直接將硬件中斷源與之相連。因此,很多按鍵燈外設需要認為地將INTP信號持續拉高。 處理流程可以完全按照MIPS手冊的General Exception Handler來處理。這里唯一需要注意的是,異常也是有優先級的。這個優先級可以使用全譯碼的方式控制,也可以使用諸如硬件排隊器、菊花鏈的方式控制。而Cause(ExcCode)位是保持最近的一次產生異常的編碼。一定是最近的一次,比如,在一條ADD指令的Fetch階段產生了一個外部中斷,而當執行后發現產生了OverFlow,那么Cause(ExcCode)位也必須按照優先級的不同修改,盡管中斷是先發生的。當然這也解釋了中斷優先級最低的原因,中斷pending信號是一直保持的,就算我的處理器不響應也不會對處理器產生危害,但是溢出等其它異常就可以,因此中斷具有最低優先級。 其實,做中斷與CP0這塊仿真時,我建議大家不要怕搓,大膽嘗試,大膽地去設計和驗證。當你發現你的設計不穩定或者有bug時就證明你的設計一定有問題,就需要修改。這部分的仿真我大概前前后后陸陸續續做了近兩個月,雖不是一直在做,但是確實在一直在思考。我看到很多書,或者很多碩士論文,或者很多pudn的代碼。這個部分的東西都做的很爛。這個部分最重要的不是完全和MIPS的一模一樣,而是可以用,可以響應中斷,我覺得就可以了。有的學校的MIPS處理器聲稱可以6級中斷嵌套,我覺得這是完全沒必要的。中斷嵌套只是保護處理器、保護堆棧區的一種方式,只要有穩定的中斷處理程序誰都可以中斷嵌套。因此,只要攻破了一級中斷,你也就一定可以攻破多級中斷。因為非向量化式的中斷完全由INT-entry程序判斷中斷優先級。向量化的中斷我也實現過,那個優先級是由譯碼或者排隊器做的。可以說嵌套靠的不是控制單元,而是優先級。所以最重要的是單級中斷。一定要做出一個可以板級驗證的單級中斷,再去思考多級中斷。筆者就犯了冒進的例子。血的教訓。 處理中斷還有一個難點就是理解原子性,這個概念其實是在OS課中才接觸到的。我也是因為不明白為什么一定要原子,去看了AST的《現代操作系統》。有疑問的推薦那本書。 就中斷系統而言,會發生原子操作的地方在于即將處理異常的時候,需要同時利用時鐘上升沿做三件事情:1)將EXL置位;2)將PC保存入EPC;3)修改Cause(ExcCode)。另外,當異常處理程序結束時,也要進行原子操作:1)將EPC的值返回給PC;2)清楚EXL位。 這就是一個經典的生產者——消費者模型。很多指令解決了這一問題,比如set and lock(IBM的好型),XCHG指令等等。這是MIPS體系結構中一個很經典的設計,完全由簡單的控制信號控制同時寫入,簡單迅速。 剩下的所有內容其實都是靠軟件來實現,硬件就做這么些事情。筆者的中斷系統是靠秒閃燈驗證,這也是老師給的驗證方式(真心簡單方便還好)。主程序和中斷程序共同維護一段兒內存,該內存變量為second。使用TC0(FPGA實現的8253)方式0每隔1S產生一個中斷信號,進入中斷處理程序。在中斷處理程序中,將second增加1寫入內存。主程序初始化TC0,隨后進入死循環,不斷讀入second值,與pre second比較,若相等則繼續循環,若不等,則將當前second值寫入LED地址,繼續循環。
其實,說起來很簡單,但是實現起來走的彎路會很多。很多人做了這東西,認為自己可以正常處理了或者可行了,我覺得都是很不負責任的。這東西是必須由特定的程序來驗證的,而并不是指令集,只要一條指令就可以驗證了。還有一點,我覺得很重要。就是搞FPGA設計不要完全參照別人的,有些網上的代碼或者什么的都是很取巧的,比如我印象最深的讀取RAM地址中的值時,諸多的程序都寫成assign rd <= RAM[addr];試問,如果一個RAM可以用assign語句來如此迅速的讀取內容,那么我們為什么還要GPR了呢?地址一邊,RAM_rd立刻就改變,這是組合電路,并不是存儲器讀的真正時序。我覺得搞FPGA,不能用語言的技巧使你的仿真可以正確,而是要先設計,所有的程序必須完全按照你自己的設計來,這樣就夠了。你的設計可以不好,但是這種東西,一定可以實現,一定可以拿到板子上跑。
轉載于:https://www.cnblogs.com/bombe1013/p/3294677.html
總結
以上是生活随笔為你收集整理的【原创】MIPS中断系统的板级验证及实例测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 田家四季歌好词好句摘抄
- 下一篇: 委托的那些事