江繼堯,資深工程師,晶心科技股份有限公司
在現今 SOC 設計中,當周邊裝置(Peripheral IP)想要和中央處理器(CPU) 溝通時,最常使用的機制是透過中斷(Interrupt)。周邊裝置可觸發中斷給中央處理器,當中央處理器接收到中斷後,則可判斷是由那個周邊裝置觸發些中斷, 接著處理相對應的中斷處理程式(ISR,Interrupt Service Routine),藉此達到彼此溝通的目的。
而 AndesCore™在中斷處理方面,共支援兩種模式:內部中斷處理器(IVIC Mode,Internal Vector Interrupt Controller)和外部中斷處理器(EVIC Mode, External Vector Interrupt Controller)。其中最大的差異性,即是中斷控制器所存在的位置。在內部中斷處理模式下,AndesCore™本身即設置了一個中斷控制器存在於 CPU 內部,經由此中斷控制器來處理相關中斷的工作。而在外部中斷處理模式下,使用者必須在 CPU 外部實做一個中斷控制器來處理相關中斷工作。
除了上述的差異性之外,在硬體方面的整合和軟體方面的應用,也存在些許差異性。本文之目的除了介紹這些差異性外,也提供一個簡單的設計平台供使用者參考。期望能對使用者有所助益,也希望讀者不吝指教提供您寶貴的意見。
1. 中斷處理模式介紹
AndesCore™共支援兩種中斷處理模式:內部中斷處理器(IVIC Mode, Internal Vector Interrupt Controller)和外部中斷處理器(EVIC Mode,External Vector Interrupt Controller)。以下的介紹將架構於 AndesCore™ N968A-S 這顆中央處理器。帶領使用者循序漸進地,了解這兩種中斷處理模式的差異。
1.1 Definition
AndesCore™ N968A-S支援兩種中斷處理模式,首先,我們先介紹關於這兩種模式的定義。
1.1.1 IVIC Mode
AndesCore™ N968A-S內部設計了一個中斷控制器,所支援的中斷來源數目可透過配置來決定。目前最大可支援16個中斷來源,但可擴充至32個。請參考圖表 1。若使用這存在於CPU內部的中斷控制器來處理相關中斷工作時,則為IVIC模式。假若SOC的中斷來源大於32個時,使用者還是可以使用IVIC模式, 但是需要將多個中斷來源合為一個中斷訊號線(ex: OR function),且中斷處理程序(ISR)在該中斷訊號線觸發時,需要去判斷是由那個中斷來源所觸發。在N968A-S的IVIC mode之下,每個中斷來源可以選定值為0~3的優先權(priority). 優先權高的中斷來源可以打斷優先權低的中斷來源。
1.1.2 EVIC Mode
假若IVIC模式不符合使用者所設計的系統,使用者就需要選用EVIC模式。在此模式下,使用者需要額外設計一個中斷控制器,用來處理周邊裝置和中央處理器之間相關中斷的工作,做為兩者間溝通的橋樑。
1.1.3 Interruption Vector Entry Points
為了加速中斷處理的時間,AndesCore™ N968A-S內部實做了一個Interruption Vector Table。將不同的中斷事件分別對應到不同的Vector Entry, 當中斷發生時,CPU即可判斷中斷是由那個周邊裝置所觸發,並跳到該中斷所對應的Vector Entry,進而執行相關的中斷處理程式(ISR)。
在前面章節有介紹AndesCore™ N968A-S支援兩種不同的中斷處理模式。因此,在不同的中斷處理模式下,也對應了不同的Interruption Vector Table。
1.1.3.1 Interruption Vector Table of IVIC Mode
在IVIC模式下,所支援的中斷來源可由使用者來配置,支援的數目由2個到
32個。Interruption Vector Table相關資訊如下:
• 41 entry points (9 exceptions + 32 interrupts)
• Address = IVB.IVBASE + (entry number) * IVB.ESZ (VEP: Vector Entry Point)
1.1.3.2 Interruption Vector Table of EVIC Mode
在EVIC模式下,所支援的中斷來源數目可達到64個中斷。Interruption Vector Table相關資訊如下:
• 73 entry points (9 exceptions + 64 interrupts)
• Address = IVB.IVBASE + (entry number) * IVB.ESZ
1.2 Signal Descriptions
AndesCore™ N968A-S 提供相關中斷訊號線,使得 CPU 可與周邊裝置或是外部中斷控制器溝通。在 EVIC 模式下,除了中斷來源訊號線之外,還包含了和外部中斷控制器相互溝通的訊號線,詳細訊號線敘述如下:
其中,evic_ireqval 和 evic_ireqack 這兩個訊號線用來和外部中斷控制器溝通。在 IVIC 模式下,周邊裝置的中斷訊號可和 int_req[N:0]直接整合。當周邊裝置觸發中斷時,相對應的 int_req 訊號會拉起,告知 CPU 該周邊裝置觸發了中斷,CPU 即會跳到所對應的 Vector Entry 來執行相關的中斷處理程式。
而在 EVIC 模式下,外部中斷控制器會負責處理周邊裝置的中斷訊號。當周邊裝置觸發中斷時,外部中斷處理器會負責和周邊裝置溝通,並將相對應的中斷訊號(int_req)和中斷需求訊號(evic_ireqval)發給 CPU,當 CPU 接收到中斷時, 會將中斷接收訊號(evic_ireqack)拉起,告知外部中斷處理器收到中斷,並去處理相關中斷處理程式。
相關處理程序可參考圖表 5。在 ARC a 時,當 ireqack 訊號為 low 時,CPU 可等待周邊裝置觸發中斷。當周邊裝置觸發中斷,外部中斷控制器將相對應中斷訊號 int_req 和 ireqval 拉起,告知 CPU 有中斷發生。在 ARC b 時,當 CPU 收到中斷,則將 ireqack 訊號拉起,告知外部中斷控制器已收到中斷。在 ARC c 時,外部中斷控制器將 ireqval 訊號拉下,並等待 CPU 將 ireqack 訊號拉下(在ARC d 時),表示 CPU 可接收新的中斷觸發。
圖表5. EVIC Interrupt Request Level Transfer Sequence
1.3 System Register Setting
關於上述兩種中斷模式的選擇,使用者可透過設定 AndesCore™ N968A-S內部的一個 system register 來達到目的。
該 system register 為 Interruption Vector Base Register(ir3)。其中的第 13個 bit 決定不同的中斷模式。其格式如下:
2. Reference Design Architecture
在介紹完中斷處理模式相關定義之後,本章節提供在實際整合與應用上的範例,讓使用者可更了解在不同中斷處理模式下的差異。
2.1 主要架構
本次所實作的 Reference Design 主要是架構在 Andes mini-platform 上,搭配 AndesCore™ N968A-S 為主要 CPU 來控制相關周邊裝置。其主要架構如下圖:
圖表 8. Architecture of Reference Design
將 AndesCore™ N968A-S 整合在 AHB-Lite Bus 上,藉由 APB Bridge 和 APB Bus 溝通,而相關的周邊裝置則整合在 APB Bus 上。在本次範例中,主要會用到GPIO 和INTC(中斷控制器)這兩個周邊裝置,在不同的中斷模式下,利用GPIO 來觸發中斷,再透過 INTC 與 CPU 溝通,觀察不同中斷模式下中斷的處理方式。
2.1.1 Design Scenario in IVIC
在 IVIC 模式下,由 GPIO 觸發中斷(gpio_int signal),直接將中斷傳遞給CPU(int_req signal)。當 CPU 接收到中斷時,即可去處理相關的中斷處理程式。相關裝置之間的整合如下圖所示:
圖表 9. Design Scenario in IVIC
2.1.2 Design Scenario in EVIC
在 EVIC 模式下,由 GPIO 觸發中斷(gpio_int signal),INTC 收到中斷後, 會將中斷訊號和相關溝通訊號傳遞給 CPU(int_req signal & evic_ireqval signal)。當 CPU 接收到中斷時,會將回應訊號拉起(evic_ireqack signal),告知INTC 收到該中斷,並去處理相關的中斷處理程式。相關裝置之間的整合如下圖所示:
圖表 10. Design Scenario in EVIC
2.2 Example Code
以下將 Reference Design 中,就本次中斷處理模式相關的整合程式部分和測試程式部分,摘要出來說明。
2.2.1 整合程式部分
在系統整合部分,包含 AndesCore™ N968A-S 和 INTC 在不同的模式下, 整合相關的訊號線,其中透過 EVIC_MODE 參數來進行不同模式間的切換。
AndesCore™ N968A-S 相關 RTL 片斷:
evic_ireqval 訊號在 EVIC 模式下由 INTC 觸發給 CPU,在 IVIC 下可直接給予 0 值。int_req 由 INTC 或中斷來源傳遞給 CPU,告知 CPU 中斷產生。evic_ireqack 在 EVIC 模式下由 CPU 觸發給 INTC,告知 INTC 收到中斷。
INTC 相關 RTL 片斷:
此中斷控制器可透過 evic_mode 這個輸入訊號,來決定該裝置是處於 IVIC 模式或是 EVIC 模式,因此,在 EVIC 模式下,給予 1 值,設定為 EVIC 模式, 在 IVIC 下,給予 0 值,設定為 IVIC 模式。ireqack 訊號在 EVIC 模式下由 CPU 觸發給 INTC,告知 INTC 已收到中斷,在 IVIC 模式下則給予 0 值。
2.2.2 測試程式部分
在測試驗證部分,包含 AndesCore™ N968A-S 在不同中斷模式下的設置、INTC 相關中斷狀態的設置和 GPIO 觸發中斷的設置。
AndesCore™ N968A-S 相關程式片斷:
AndesCore™ N968A-S 支援兩種中斷處理模式,透過 CPU 內部的 system register 來設置。主要為設置 Interruption Vector Base Register,該 register 的第 13 個 bit 用來定義 CPU 處在何種中斷處理模式。在 EVIC 模式下,需將該 bit 設置為 1,在 IVIC 模式下,則將該 bit 設置為 0。
INTC 相關程式片斷:
INTC 通常支援不同的中斷觸發方式,包含 Interrupt Masking、Interrupt Trigger Mode、Interrupt Trigger Level …等。在開始使用每個中斷來源之前,這些控制選項都必須在 INTC 上設定正確。
3. 模擬結果
將上述的 Reference Design 整合完成後,搭配測試程式進行模擬,並藉由波形圖來觀察不同中斷模式下,相關中斷訊號線的變化。
3.1 IVIC 模擬結果
在 IVIC 模擬環境中,主要測試程序如下:
• 由 GPIO 觸發一中斷,並將中斷傳遞給 CPU
• CPU 接收到中斷後,執行相對應的中斷處理程式
模擬結果如圖表 11 所示,當 GPIO 觸發中斷後,將中斷直接傳遞給 CPU,在CPU 端的 int_req 訊號線會觸發,表示有中斷發生。當 CPU 收到中斷訊號後, 接著會處理相對應的中斷處理程式。
圖表 11.Simulation Waveform of IVIC
3.2 EVIC 模擬結果
在 EVIC 模擬環境中,主要測試程序如下:
• 由 GPIO 觸發一中斷
• 此時 INTC 設罝為 EVIC 模式,並將中斷訊號和相關溝通訊號傳遞給CPU
• CPU 接收到中斷後,會將回應訊號拉起,告知 INTC 收到該中斷,並執行相對應的中斷處理程式
模擬結果如圖表 12 所示,當 GPIO 觸發中斷後,INTC 將中斷和相關溝通訊號(ireqval)傳遞給 CPU,在 CPU 端的 int_req 訊號線和 evic_ireqval 訊號線會觸發, 表示有中斷發生。當 CPU 收到中斷訊號後,會將 evic_ireqack 訊號線拉起,告知 INTC 收到中斷。模擬結果如同章節 1.2 和圖表 5 所論述。
圖表 12. Simulation Waveform of EVIC