RiscV架構則定義了一些控制和狀態寄存器(CSR),用於配置或記錄一些運行的狀態。CSR寄存器是處理器內核內部的寄存器,使用專有的12位地址編碼空間,對一個hart,能夠配置4k的CSR寄存器。html
蜂鳥203支持如下的CSR寄存器:編程
類型 | CSR地址 | 讀寫屬性 | 名稱 | 全稱 |
riscv標準csr | 0x001 | MRW | fflags | 浮點累積異常(Floating accrued Exception) |
0x002 | MRW | frm | 浮點動態舍入模式(floating-point dynamic rounding mode) | |
0x003 | MRW | fcsr | 浮點控制和狀態寄存器(floating-point control and status register) | |
0x300 | MRW | mstatus | 機器模式狀態寄存器(machine status register) | |
0x301 | MRW | misa | 機器模式指令集架構寄存器(machine ISA register) | |
0x304 | MRW | mie | 機器模式中斷使能寄存器(machine interrupt enable register) | |
0x305 | MRW | mtvec | 機器模式異常入口基地址寄存器(machine trap-vector base-address register) | |
0x340 | MRW | mscratch | 機器模式擦寫寄存器(machine srcatch register) | |
0x341 | MRW | mepc | 機器模式異常pc寄存器(machine exception program counter) | |
0x342 | MRW | mcause | 機器模式異常緣由寄存器(machine cause register) | |
0x343 | MRW | mtval(mbadaddr) | 機器模式異常值寄存器(machine trap value register) | |
0x344 | MRW | mip | 機器模式中斷等待寄存器(machine interrupt pending register) | |
0xb00 | MRW | mcycle | 週期計數器的低32位(lower 32bits of cycle counter) | |
0xb80 | MRW | mcycleh | 週期計數器的高32位(upper 32bits of cycle counter) | |
0xb02 | MRW | minstret | 退休指令計數器的低32位(lower 32bits of instruction-retired counter) | |
0xb82 | MRW | minstreth | 退休指令計數器的高32位(upper 32bits of instruction-retired counter) | |
0xf11 | MRW | mvendorid | 機器模式供應商編號寄存器(machine vendor ID register),readonly, 供應商編號,若是爲0,表示此寄存器未實現或不是一個商業核 | |
0xf12 | MRW | marchid | 機器模式架構編號寄存器(machine architecture ID register),readonly,微架構編號,若是爲0,表示未實現該寄存器 | |
0xf13 | MRO | mimpid | 機器模式硬件實現編號寄存器(machine implementation ID register),readonly,硬件實現編號,若是爲0,表示未實現該寄存器 | |
0xf14 | MRO | mhartid | hart編號寄存器(hart ID register),readonly,hart的編號。多hart系統中,起碼有一個hart編號爲0 | |
N/A | MRO | mtime | 機器模式計時器寄存器(machine-mode timer register) | |
N/A | MRW | mtimecmp | 機器模式計數器比較寄存器(machine-mode timer compare register) | |
N/A | MRW | msip | 機器模式軟件中斷等待寄存器(machine-mode software interrupt pending register) | |
e203自定義 | 0xbff | MRW | mcounterstop | 自定義寄存器用於中止mtime, mcycle, mcycleh,minstret,minstreth對應的計數器 |
經常使用的CSR寄存器詳細介紹以下,先來看下一些概念。架構
Reserved Writes Preserve Values, Reads Ignore Values (WPRI)ide
Write/Read Only Legal Values (WLRL)編碼
Write Any Values, Reads Legal Values (WARL)spa
misa寄存器用於指示當前處理器所支持的架構特性。設計
最高兩位表示當前處理器支持的架構位數,值爲1表示當前爲32位架構(RV32),值爲2表示當前爲RV64架構,值爲3表示當前爲128位架構(RV128)。調試
低26位表示當前支持的擴展指令集模塊,若是支持某模塊,則對應的位爲1。好比E203,支持IMAC,則低26位爲:code
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 1 | x | x | x | x | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
bits | 擴展指令集 | 描述 |
0 | A | Atomic extension |
1 | B | Tentatively reserved for Bit-Manipulation extension |
2 | C | Compressed extension |
3 | D | Double-precision floating-point extension |
4 | E | RV32E base ISA |
5 | F | Single-precision floating-point extension |
6 | G | Additional standard extensions present |
7 | H | Hypervisor extension |
8 | I | RV32I/64I/128I base ISA |
9 | J | Tentatively reserved for Dynamically Translated Languages extension |
10 | K | Reserved |
11 | L | Tentatively reserved for Decimal Floating-Point extension |
12 | M | Integer Multiply/Divide extension |
13 | N | User-level interrupts supported |
14 | O | Reserved |
15 | P | Tentatively reserved for Packed-SIMD extension |
16 | Q | Quad-precision floating-point extension |
17 | R | Reserved |
18 | S | Supervisor mode implemented |
19 | T | Tentatively reserved for Transactional Memory extension |
20 | U | User mode implemented |
21 | V | Tentatively reserved for Vector extension |
22 | W | Reserved |
23 | X | Non-standard extensions present |
24 | Y | Reserved |
25 | Z | Reserved |
fflags 爲浮點控制狀態寄存器(fcsr)中的異常標誌位域的別名。orm
詳見https://www.cnblogs.com/mikewolf2002/p/9878603.html
frm寄存器爲浮點控制狀態寄存器中浮點舍入模式域的別名。
詳見https://www.cnblogs.com/mikewolf2002/p/9878603.html
risc-v架構規定,若是支持單精度浮點指令或者雙精度浮點指令,則須要增長一個浮點控制狀態寄存器。該寄存器包含了浮點異常標誌位域和浮點舍入模式域。
詳見https://www.cnblogs.com/mikewolf2002/p/9878603.html
Riscv 架構規定,在處理器的程序執行過程當中,一旦發生異常,則終止當前的程序流,處理器被強行跳轉到一個新的PC地址。該過程在RiscV的架構中定義爲trap(陷阱)。
Riscv處理器trap後跳入的PC地址由一個叫作機器模式異常入口基地址寄存器mtvec的csr寄存器指定。mtvec是一個可讀可寫的寄存器,軟件能夠編程設定它的值。
mtvec格式以下,其中低2位是mode域,高30位是base域。
xlen-1 | 2 | 1 | 0 | ||||||||||
Interrupt | BASE[xlen-1:2](WARL) | ||||||||||||
xlen-2 | 2 |
假設mode的值爲0,則全部的異常響應時處理器均跳轉到base值指示的pc地址。
假設mode的值爲1,則狹義的異常發生時候,處理器均跳轉到base值指示的pc地址。狹義的中斷髮生時候,處理器跳轉到base+4*cause值指示的pc地址。cause的值表示中斷對應的異常編號(exception code)。譬如,機器計時器中斷(machine timer interrupt)的異常編號爲7,則跳轉地址爲base+4*7=base+28=base+0x1c
Riscv架構規定,進入異常時候,機器模式異常緣由寄存器mcause被同時更新,以反映當前的異常種類,軟件能夠經過讀此寄存器查詢形成異常的具體緣由。
mcause寄存器格式以下,其中最高位爲Interrupt位,爲1表示是中斷,不然爲異常,低31位(對於RV32)爲異常編號域。
xlen-1 | xlen-2 | 0 | |||||||||||
Interrupt | 異常編碼(WLRL) | ||||||||||||
1 | xlen-1 |
異常編號域定義了中斷和異常類型,以下表所示:
是否中斷 | 異常編碼 | 描述 |
1 | 0 | User software interrupt |
1 | 1 | Supervisor software interrupt |
1 | 2 | Reserved for future standard use |
1 | 3 | Machine software interrupt |
1 | 4 | User timer interrupt |
1 | 5 | Supervisor timer interrupt |
1 | 6 | Reserved for future standard use |
1 | 7 | Machine timer interrupt |
1 | 8 | User external interrupt |
1 | 9 | Supervisor external interrupt |
1 | 10 | Reserved for future standard use |
1 | 11 | Machine external interrupt |
1 | 12–15 | Reserved for future standard use |
1 | ≥16 | Reserved for platform use |
0 | 0 | Instruction address misaligned |
0 | 1 | Instruction access fault |
0 | 2 | Illegal instruction |
0 | 3 | Breakpoint |
0 | 4 | Load address misaligned |
0 | 5 | Load access fault |
0 | 6 | Store/AMO address misaligned |
0 | 7 | Store/AMO access fault |
0 | 8 | Environment call from U-mode |
0 | 9 | Environment call from S-mode |
0 | 10 | Reserved |
0 | 11 | Environment call from M-mode |
0 | 12 | Instruction page fault |
0 | 13 | Load page fault |
0 | 14 | Reserved for future standard use |
0 | 15 | Store/AMO page fault |
0 | 16–23 | Reserved for future standard use |
0 | 24–31 | Reserved for custom use |
0 | 32–47 | Reserved for future standard use |
0 | 48–63 | Reserved for custom use |
0 | ≥64 | Reserved for future standard use |
mepc是xlen位的讀寫寄存器,mepc[0]老是等於0,若是IALIGN=32,則mepc[1:0]老是等於0。
xlen-1 | 0 | ||||||||||||
mepc | |||||||||||||
xlen |
Riscv架構定義異常的返回地址由機器模式異常PC寄存器mepc保存。在進入異常時候,硬件將自動更新mepc寄存器的值爲當前遇到異常的指令PC值(即當前程序的中止執行點)。該寄存器的值將做爲異常的返回地址,在異常結束後,可以使用它保存的pc值返回以前中止執行的程序點。注意:mepc雖然被自動更新,但它是可讀可寫的,軟件能夠直接讀寫該寄存器的值。
對於狹義的中斷和狹義的異常而言,RiscV架構定義其返回地址,稍有差別。
mtval是一個讀寫寄存器,它的格式以下:
mtval | xlen-1 | 0 | ||||||||||||
mtval | ||||||||||||||
xlen |
Riscv規定,在進入異常時候,硬件將自動更新機器模式異常值寄存器mtval,以反映引發當前異常的存儲器訪問地址或者指令編碼。
mstatus是機器模式下的狀態寄存器。在E203中咱們僅關注SD,XS,FS,MPP,MPIE,MIE。
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
SD | WPRI | TSR | TW | TVM | MXR | SUM | MPRV | XS[1] | XS[0] | FS[1] | FS[0] | MPP[1] | MPP[0] | WPRI | SPP | MPIE | WPRI | SPIE | UPIE | MIE | WPRI | SIE | UIE |
Status | FS Meaning XS | Meaning |
0 | Off | All off |
1 | Initial | None dirty or clean,some on |
2 | Clean | None dirty, some clean |
3 | Dirty | Some dirty |
FS域的更新準則以下:FS上電後默認值爲0,意味着浮點單元的狀態爲off。所以爲了可以正常使用浮點單元,軟件須要使用CSR寫指令將FS的值改寫爲非0值,以打開浮點單元的功能。若是FS的值爲1或2,當執行了任何的浮點指令以後,FS的值都會自動切換到3,表示浮點單元的狀態爲髒(dirty)(狀態發生了改變 ) 。若是處理器不想使用浮點運算單元,可使用csr寫指令將mstatus寄存器的FS域設置爲0,從而關閉浮點單元的功能。當浮點單元功能關閉後,任何訪問浮點csr或者執行浮點指令的行爲都會除法非法指令異常。
Riscv架構規定,進入異常時候,硬件自動更新機器模式狀態寄存器mstatus中的某些域。MPIE的值被更新爲異常發生前MIE域的值。MPIE的做用是在異常結束後,可以使用MPIE的值恢復出異常發生以前的MIE值。MIE的值被更新爲0,意味着進入異常服務程序後,中斷被全局關閉,全部的中斷不被響應。MPP的值被更新爲異常發生前的模式(若是隻實現機器模式,則MPP的值永遠爲11),MPP域的做用是在異常結束後,可以恢復到以前的工做模式。
當異常程序處理完成後,最終要從異常服務程序中退出,並返回主程序。riscv中定義了一組退出指令mret,sret,和uret,對於機器模式,對應mret。
在機器模式下退出異常時候,軟件必須使用mret。riscv架構規定,處理器執行完mret指令後,硬件行爲以下:
Riscv架構中定義的中斷類型分爲4種。
外部中斷是指來自於處理器核外部的中斷,好比uart,gpio等產生的中斷。
Riscv架構上定義的異常是不可屏蔽的,但狹義上的中斷是能夠屏蔽的,經過設置mie寄存器來屏蔽中斷。mip寄存器用於查詢中斷的等待狀態,軟件能夠經過讀mip寄存器達到查詢中斷狀態的結果。
機器模式下外部中斷的屏蔽由csr寄存器mie中MEIE域控制,等待標誌(pending)則反映在csr寄存器mip的MEIP域。mip和mie寄存器的高20位能夠用於擴展其它的自定義中斷類型。
機器模式下定時器中斷的屏蔽由mie中的MTIE域控制,等待標誌(pending)則反映在csr寄存器mip的MTIP域。
機器模式下軟件中斷的屏蔽由mie中的MSIE域控制,等待標誌(pending)則反映在csr寄存器mip的MSIP域。
mip | xlen-1 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
WPRI | MEIP | WPRI | SEIP | UEIP | MTIP | WPRI | STIP | UTIP | MSIP | WPRI | SSIP | USIP | |
xlen-12 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |
mie | xlen-1 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
WPRI | MEIE | WPRI | SEIE | UEIE | MTIE | WPRI | STIE | UTIE | MSIE | WPRI | SSIE | USIE | |
xlen-12 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
機器模式外部中斷能夠做爲處理器核的一個單比特輸入信號,若是處理器要支持多個外部中斷,能夠採用平臺級別的中斷控制器(PLIC),能夠用於多個外部中斷源的優先級仲裁和派發。
mscratch寄存器用於機器模式下的程序臨時保存某些數據。mscratch寄存器能夠提供一種快速的保存、恢復機制。好比,在進入機器模式的異常處理程序後,將應用程序的某個通用寄存器的值臨時存入mscratch寄存器中,而後在退出異常處理程序以前,將mscratch寄存器中的值讀出恢復至通用寄存器。
riscv架構定義了一個64位的時鐘週期計數器,用於反映處理器成功執行了多少個時鐘週期。只要處理器處於執行狀態,此計數器便會自增計數,其自增的頻率由處理器硬件實現自定義。
mcycle寄存器反映了該計數器低32位的值,mcycleh寄存器反映了該計數器高32位的值
riscv架構定義了一個64位的執行指令計數器,用於反映處理器成功執行了多少條指令。只要處理器每成功執行一條指令,此計數器便會自增計數。
minstret寄存器反映了該計數器低32位的值,minstreth寄存器反映了該計數器高32位的值。
Riscv架構定義了系統平臺中必須有一個計時器,並給該計時器定義了兩個64位寬的寄存器mtime和mtimecmp。mtime寄存器用於反應當前計數器的計數值,mtimecmp用於設置計數器的比較值。當mtime中的計數值大於或者等於mtimecmp中設置的比較值時,計時器便會產生計時器中斷。計時器中斷會一直拉高,直到軟件重寫mtimecmp寄存器的值,使得其大於mtime中的值,從而清除計時器中斷。
Riscv架構並無定義mtime和mtimecmp寄存器爲csr寄存器,而定義其爲存儲器地址映射的系統寄存器。具體的存儲器映射,riscv並無規定,而是交於soc系統集成者實現。
riscv架構定義的mtime定時器爲實時計時器,系統必須以一種恆定的頻率做爲計時器的時鐘。該恆定的時鐘頻率必須爲低速的電源常開的時鐘。低速是爲了省電,常開是爲了提供準確的及時。
counterstop是蜂鳥自定義csr寄存器。用於控制mtime,mcycle,minstreth,mtimeh,mcycleh,minstreth的運行和中止,以便節省功耗。
xlen-1 | 2 | 1 | 0 | |||||||||
reserved | reserved | reserved | reserved | reserved | reserved | reserved | reserved | reserved | reserved | instret | timer | cycle |
reserved | reserved | reserved | reserved | reserved | reserved | reserved | reserved | reserved | reserved | 1 | 1 | 1 |
0/1/2 三位若是爲1,則相應計數器中止工做,若是爲0,則開始工做,上電默認值爲0.