E203 CSR寄存器

    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

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

fflags 爲浮點控制狀態寄存器(fcsr)中的異常標誌位域的別名。orm

詳見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


mtvec

      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




mcause

      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


  1. MIE域表示全局中斷使能。當該MIE域值爲1時,表示全部中斷的全局開關打開,當MIE域的值爲0時候,表示全局關閉全部中斷。
  2. MPIE用於保存進入異常以前MIE域的值。
  3. XS做用於FS域相似,用於維護和反映用戶自定義的擴展指令單元狀態,標準riscv架構中,XS域是隻讀的,在e200中,將XS域設計爲可讀可寫,用它來打開和關閉協處理器。
  4. SD域是一個只讀域,其反映了XS域或者FS域處於髒(dirty)狀態,其邏輯關係表達式爲:SD=((FS==11) or (XS==11))
  5. MPP用於保存進入異常以前特權模式的值。處理器進入異常時候:MPIE域的值被更新爲MIE的值。MIE的值被更新爲0(意味着進入異常,中斷被屏蔽)。MPP的值被更新爲異常發生前的模式(若是隻實現機器模式,則MPP的值永遠爲11)。
  6. 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.

相關文章
相關標籤/搜索