RiscV架構則定義了一些控制和狀態寄存器(CSR),用於配置或記錄一些運行的狀態。CSR寄存器是處理器內核內部的寄存器,使用專有的12位地址編碼空間,對一個hart,可以配置4k的CSR寄存器。
蜂鳥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)
Write/Read Only Legal Values (WLRL)
Write Any Values, Reads Legal Values (WARL)
misa
misa寄存器用於指示當前處理器所支持的架構特性。
最高兩位表示當前處理器支持的架構位數,值為1表示當前為32位架構(RV32),值為2表示當前為RV64架構,值為3表示當前為128位架構(RV128)。
低26位表示當前支持的擴展指令集模塊,如果支持某模塊,則對應的位為1。比如E203,支持IMAC,則低26位為:
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
fflags 為浮點控制狀態寄存器(fcsr)中的異常標志位域的別名。
詳見https://www.cnblogs.com/mikewolf2002/p/9878603.html
frm
frm寄存器為浮點控制狀態寄存器中浮點舍入模式域的別名。
詳見https://www.cnblogs.com/mikewolf2002/p/9878603.html
fcsr
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
mepc是xlen位的讀寫寄存器,mepc[0]總是等於0,如果IALIGN=32,則mepc[1:0]總是等於0。
xlen-1 | 0 | ||||||||||||
mepc | |||||||||||||
xlen |
Riscv架構定義異常的返回地址由機器模式異常PC寄存器mepc保存。在進入異常時候,硬件將自動更新mepc寄存器的值為當前遇到異常的指令PC值(即當前程序的停止執行點)。該寄存器的值將作為異常的返回地址,在異常結束后,能夠使用它保存的pc值返回之前停止執行的程序點。注意:mepc雖然被自動更新,但它是可讀可寫的,軟件可以直接讀寫該寄存器的值。
對於狹義的中斷和狹義的異常而言,RiscV架構定義其返回地址,稍有差異。
- 出現中斷時候,中斷返回地址mepc的值被更新為下一條尚未執行的指令。
- 出現異常時候,中斷返回地址mepc的值被更新為當前發生異常的指令pc。注意:如果異常是有ecall和ebreak產生,由於mepc的值被更新為ecall或者ebreak指令自己的PC。因此,在異常返回時候,如果直接使用mepc保存的pc值作為返回地址,則會再次進入異常,形成死循環。正確的做法是在異常處理程序中軟件改變mepc指向下一條指令,由於現在ecall/ebreak(c.ebreak)是4字節(2字節)指令,因此更改設定mepc=mepc+4(或+2)即可。
mtval(mbadaddr)
mtval是一個讀寫寄存器,它的格式如下:
mtval | xlen-1 | 0 | ||||||||||||
mtval | ||||||||||||||
xlen |
Riscv規定,在進入異常時候,硬件將自動更新機器模式異常值寄存器mtval,以反映引起當前異常的存儲器訪問地址或者指令編碼。
- 如果是由訪問存儲器造成的異常,比如硬件斷點,取指令,存儲器讀寫造成的異常,則將存儲器訪問的地址更新到mtval。
- 如果是由非法指令造成的異常,則將該指令的指令編碼更新到mtval寄存器中。
mstatus
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 |
- MIE域表示全局中斷使能。當該MIE域值為1時,表示所有中斷的全局開關打開,當MIE域的值為0時候,表示全局關閉所有中斷。
- MPIE用於保存進入異常之前MIE域的值。
- XS作用於FS域類似,用於維護和反映用戶自定義的擴展指令單元狀態,標准riscv架構中,XS域是只讀的,在e200中,將XS域設計為可讀可寫,用它來打開和關閉協處理器。
- SD域是一個只讀域,其反映了XS域或者FS域處於臟(dirty)狀態,其邏輯關系表達式為:SD=((FS==11) or (XS==11))
- MPP用於保存進入異常之前特權模式的值。處理器進入異常時候:MPIE域的值被更新為MIE的值。MIE的值被更新為0(意味着進入異常,中斷被屏蔽)。MPP的值被更新為異常發生前的模式(如果只實現機器模式,則MPP的值永遠為11)。
- FS域用於維護和反映浮點單元的狀態,編碼如下:
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指令后,硬件行為如下:
- 停止執行當前程序流,轉而從csr寄存器mepc定義的pc地址開始執行。
- 執行mret指令不僅會讓處理器跳轉到上述的pc地址開始執行,還會讓硬件同時更新csr寄存器機器模式狀態寄存器mstatus。mstatus寄存器MIE域被更新為當前MPIE的值。MPIE 域的值則更新為1。
mie/mip
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寄存器中,然后在退出異常處理程序之前,將mscratch寄存器中的值讀出恢復至通用寄存器。
mcycle和mcycleh
riscv架構定義了一個64位的時鍾周期計數器,用於反映處理器成功執行了多少個時鍾周期。只要處理器處於執行狀態,此計數器便會自增計數,其自增的頻率由處理器硬件實現自定義。
mcycle寄存器反映了該計數器低32位的值,mcycleh寄存器反映了該計數器高32位的值
minstret和minstreth
riscv架構定義了一個64位的執行指令計數器,用於反映處理器成功執行了多少條指令。只要處理器每成功執行一條指令,此計數器便會自增計數。
minstret寄存器反映了該計數器低32位的值,minstreth寄存器反映了該計數器高32位的值。
mtime/mtimecmp/msip
Riscv架構定義了系統平台中必須有一個計時器,並給該計時器定義了兩個64位寬的寄存器mtime和mtimecmp。mtime寄存器用於反應當前計數器的計數值,mtimecmp用於設置計數器的比較值。當mtime中的計數值大於或者等於mtimecmp中設置的比較值時,計時器便會產生計時器中斷。計時器中斷會一直拉高,直到軟件重寫mtimecmp寄存器的值,使得其大於mtime中的值,從而清除計時器中斷。
Riscv架構並沒有定義mtime和mtimecmp寄存器為csr寄存器,而定義其為存儲器地址映射的系統寄存器。具體的存儲器映射,riscv並沒有規定,而是交於soc系統集成者實現。
riscv架構定義的mtime定時器為實時計時器,系統必須以一種恆定的頻率作為計時器的時鍾。該恆定的時鍾頻率必須為低速的電源常開的時鍾。低速是為了省電,常開是為了提供准確的及時。
counterstop
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.