E203 CSR寄存器


    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


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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM