Menu Close

RISC-V CSR寄存器(1)CSR简介和CSR指令

1.CSR简介

 

相关参考文章:

RISC-V教学教案

 

除去之前介绍的32个通用寄存器之外,还有一类扩展寄存器,称为CSR(control and status register,控制和状态寄存器)。顾名思义,这类寄存器与控制CPU和表明CPU状态相关。

特权指令除了包括CSR指令外,还有其他的特权指令,这里将介绍6条操作CSR寄存器的CSR指令。

CSR寄存器中有些指定字段行为的定义和缩写,有以下几种[1]:

  1. WIRI:Reserved Writes Ignored,Read Ignore Values(保留写入忽略,读取忽略值)
  2. WPRI:Reserved Writes Preserve Values, Reads Ignore Values(保留写入保留值,读取忽略值)
  3. WLRL:Write/Read Only Legal Values(读写合法值)
  4. WARL:Write Any Values, Reads Legal Values(任意写,读合法值)

这里只做介绍,也不多做讨论。

所有的CSR指令都是每次只能对一个CSR寄存器操作,其机器码如图1所示。

可以看到CSR指令类似于I-type指令。虽然也有12位的立即数域,但是实际上机器码的bit 20-31是用来 索引相应CSR寄存器的地址。所以理论上,一共可以实现2^12 = 4096位CSR寄存器。

按照惯例,CSR地址的高位(CSR[11:8]/机器码的bit 31-28)用于根据权限级别对CSR的读写可访问性进行编码。

前两位(CSR[11:10]/机器码的bit 31-30)指示该CSR寄存器是可读可写(00,01或10)还是只读(11)。

接下来两位(CSR[9:8]/机器码的bit 29-28)编码表明可以访问该CSR寄存器的最低特权级别 [1]。 00 => user CSR;  01 => supervisor CSR; 10 => hypervisor CSR; 11 => machine CSR

CSR的opcode 是111_0011,被称为SYSTEM。根据不同的funct3,可以确定不同的CSR指令。

 

 

图1 CSR指令机器码 [1]

这6条CSR指令又可以分为两类:

  • 一类是寄存器操作:CSRRW,CSRRS,CSRRC
  • 一类是立即数操作:CSRRWI,CSRRSI,CSRRCI。对于立即数操作的3个指令,5位的立即数被放在了rs1的位置,被称为uimm[4:0],因为这些立即数是无符号(unsigned immediate)的。

这6条CSR指令的rd与一般指令的目的寄存器没有差别,位于机器码的bit 7-11,共5位的索引。

常用的CSR寄存器可以分为4组,分别为:

  • 用户模式(user mode)
  • 监控模式(supervisor mode)
  • 超级监控模式(hypervisor mode)
  • 机器模式(machine mode)。

机器模式是基础的,所有的RISC-V CPU必须实现的模式。其他三种是可选的。这里将只会介绍机器模式下的CSR寄存器。

 

2.CSR指令

2.1.CSRRW

CSRRW(control and status register read and write,读后立即写控制状态寄存器)指令格式为CSRRW rd,csr,rs1。t = CSRs[csr]; CSRs[csr] = x[rs1]; x[rd] = t

其机器码如图2所示,CSRRW的funct3是001。该指令是把CSR寄存器中的值读出并赋值到rd寄存器中,再把rs1寄存器中的值写入CSR寄存器。

举例说明:

CSRRW x13,mie,x12

将mie寄存器里的值读出并赋值给x13寄存器,再把x12寄存器中的值写进mie寄存器

可以看到,其机器码如图2所示,CSRRW的

opcode为111_0011

funct3为001

mie寄存器索引地址为12’b0011_0000_0100

rs1为 5’b0_1100

rd为 5’b0_1101

所以CSRRW x13,mie,x12对应的机器码为0011_0000_0100_01100_001_01101_1110011,对应的16进制为32’h3046_16f3

 

图 2 CSRRW机器码格式 [2]

2.2.CSRRS

CSRRS(control and status register read and set,读后置位控制状态寄存器)指令格式为CSRRS rd,csr,rs1。t = CSRs[csr]; CSRs[csr] = t | x[rs1]; x[rd] = t

其机器码如图3所示,CSRRS的funct3是010。该指令是把CSR寄存器中的值读出并赋值到rd寄存器中,且将CSR寄存器中的值和寄存器rs1中的值按位或(bitwise OR)的结果写入CSR寄存器。

指令示例:

CSRRS x13,mie,x12

将mie寄存器里面的值读出并赋值给x13寄存器,并将mie寄存器里的值和x12寄存器里的值按位或的结果写入mie寄存器中。

 

图3 CSRRS机器码格式 [2]

2.3.CSRRC

CSRRC(control and status register read and clear,读后清除控制状态寄存器)指令格式为CSRRC rd,csr,rs1。t = CSRs[csr]; CSRs[csr] = t &~x[rs1]; x[rd] = t

其机器码如图4所示,CSRRC的funct3是011。该指令是把CSR寄存器中的值读出并赋值到rd寄存器中,且将CSR寄存器中的值和寄存器rs1中的值取反后按位与(bitwise AND)的结果写入CSR寄存器。

指令示例:

CSRRC x13,mie,x12

将mie寄存器里面的值读出并赋值给x13寄存器,并将mie寄存器里的值和x12寄存器里的值取反后按位与的结果写入mie寄存器中。

 

图4 CSRRC机器码格式 [2]

2.4.CSRRWI

CSRRWI(control and status register read and write immediate,立即数读后写控制状态寄存器)指令格式为CSRRWI rd,csr,zimm[4:0]。x[rd] = CSRs[csr]; CSRs[csr] = zimm

这里的zimm[4:0]表示高位由0(zero)扩展的立即数。其机器码如图5所示,CSRRWI的funct3是101。该指令是把CSR寄存器中的值读出并赋值到rd寄存器中,再把五位的零扩展的立即数zimm写入CSR寄存器。

指令示例:

CSRRWI x13,mie,5

将mie寄存器里的值读出并赋值给x13寄存器,再把5’b0_0101高位扩展0成32’h0000_0005写进mie寄存器

 

图5 CSRRWI机器码格式 [2]

2.5.CSRRSI

CSRRSI(control and status register read and set immediate,立即数读后设置控制状态寄存器)指令格式为CSRRSI rd,csr,zimm[4:0]。t = CSRs[csr]; CSRs[csr] = t | zimm; x[rd] = t

其机器码如图6所示,CSRRSI的funct3是110。该指令是把CSR寄存器中的值读出并赋值到rd寄存器中,且将CSR寄存器中的值和五位的零扩展的立即数zimm按位或(bitwise OR)的结果写入CSR寄存器(CSR寄存器的第五位及更高位不变)。

指令示例:

CSRRSI x13,mie,5

将mie寄存器里的值读出并赋值给x13寄存器,再把5’b0_0101高位扩展0成32’h0000_0005和mie寄存器里的值按位或写进mie寄存器

 

图 6 CSRRSI机器码格式 [2]

2.6.CSRRCI

CSRRCI(control and status register read and clear immediate,立即数读后清除控制状态寄存器)指令格式为CSRRCI rd,csr,zimm[4:0]。t = CSRs[csr]; CSRs[csr] = t &~zimm; x[rd] = t

其机器码如图7所示,CSRRCI的funct3是111。该指令是把CSR寄存器中的值读出并赋值到rd寄存器中,且将CSR寄存器中的值和五位的零扩展的立即数zimm取反后按位与(bitwise AND)的结果写入CSR寄存器(CSR寄存器的第五位及更高位不变)。

指令示例:

CSRRCI x13,mie,5

将mie寄存器里的值读出并赋值给x13寄存器,再把5’b0_0101高位扩展0成32’h0000_0005,取反后为32’hFFFF_FFFA和mie寄存器里的值按位与写进mie寄存器

 

图7 CSRRCI机器码格式 [2]

3.文章参考

[1] Riscv.org, 2021. [Online]. Available: https://riscv.org/wp-content/uploads/2019/12/riscv-spec-20191213.pdf. [Accessed: 22- Feb- 2021].

[2] D. Patterson and A. Waterman, The RISC-V reader. Berkeley: Strawberry Canyon LLC, 2018.

Posted in RISC-V, RISC-V 教材教案, 应用开发, 文章

发表评论

您的电子邮箱地址不会被公开。

Leave the field below empty!

相关链接