risc-v指令集手册(非特权架构)- ‘Zicsr’控制和状态寄存器(CSR)指令V2.0(已批准)

本文详细介绍了RISC-V架构中与每个hart关联的CSR的地址空间和指令集,包括原子读/写、读取和设置/清除位的指令。这些指令主要服务于特权架构,但也用于非特权代码中的计数器和计时器。CSR访问遵循特定的顺序规则,并且可能有副作用,如触发陷阱或影响其他指令执行。
摘要由CSDN通过智能技术生成

RISC-V定义了与每个hart关联的4096个控制和状态寄存器的独立地址空间。本章定义了在这些CSR上运行的完整CSR指令集。

虽然CSR主要由特权体系结构使用,但非特权代码中也有多种用途,包括用于计数器和计时器以及浮点状态。
计数器和计时器不再被视为标准基本ISA的必需部分,因此访问它们所需的CSR指令已从基本ISA章节移至这个单独的章节。

11.1. CSR指令

所有CSR指令都以原子方式读取、修改、写入一个CSR,其CSR指示符编码为12位的csr字段,保存在指令中的31–20位。立即数形式使用以rs1字段编码的5位立即数,并以零扩展。
在这里插入图片描述
CSRRW(原子读/写CSR)指令原子交换CSR和整数寄存器中的值。CSRRW读取CSR的旧值,将该值以零扩展为XLEN位,然后将其写入整数寄存器rd。rs1中的初始值被写入CSR。如果rd=x0,则该指令不读取CSR,也不应引起读取CSR时可能发生的任何副作用。
决定一个CSR指令是否产生读或者写指定CSR的条件CSRRS(原子读取和设置CSR中的位)指令读取CSR的值,将该值以零扩展为XLEN位,然后将其写入整数寄存器rd。整数寄存器rs1中的初始值被视为位掩码,指定了要在CSR中设置的位的位置。rs1中的任何为高的位都会导致CSR中的相应位置1,只要该CSR的位可写。CSR中的其他位不会被写。
CSRRC(原子读取和清除CSR中的位)指令读取CSR的值,将该值以零扩展为XLEN位,然后将其写入整数寄存器rd。整数寄存器rs1中的初始值被视为位掩码,指定了要在CSR中清除的位的位置。rs1中的任何为高的位都会导致CSR中的相应位被清除,只要该CSR位可写。CSR中的其他位不会被写。
对于CSRRS和CSRRC,如果rs1=x0,则指令将根本不会写CSR,因此不会引起在CSR写入中可能发生的任何副作用,也不会在访问只读CSR时引发非法指令异常。CSRRS和CSRRC始终读取寻址的CSR,并且无论rs1和rd字段如何,都会引起任何读方面的影响。请注意,如果rs1指定一个寄存器,该寄存器值为0,但不是x0,则该指令仍将尝试将未修改的值写回CSR,并且会引起任何副作用。rs1=x0的CSRRW将尝试将零写入目标CSR。
CSRRWI、CSRRSI和CSRRCI变体分别类似于CSRRW、CSRRS和CSRRC,不同之处在于它们使用以零扩展5位无符号立即数(uimm[4:0])得到的XLEN位值更新CS,这5位立即数编码在rs1字段,而不是整数寄存器。对于CSRRSI和CSRRCI,如果uimm[4:0]字段为零,则这些指令将不会写入CSR,也不会引起在CSR写入时可能发生的任何副作用。对于CSRRWI,如果rd=x0,则该指令不读取CSR,也不应引起CSR读取时可能发生的任何副作用。CSRRSI和CSRRCI都将始终读取CSR并引起任何读取侧影响,而与rd和rs1字段无关。
表11.1总结了有关CSR指令是否读取和/或写入CSR的行为。
对于由于CSR具有特定值而发生的任何事件或后果,如果对CSR的写入使其具有该值,则所产生的事件或后果被当做是写入的间接影响。RISC-V ISA不把CSR写入的间接影响当做该写入的副作用。

CSR访问的一个副作用示例是,读取一个特定CSR会导致灯泡亮起,而向同一CSR写入奇数会导致灯熄灭。假设写入偶数没有影响。在这种情况下,读取和写入都会对控制灯泡是否点亮产生副作用,因为这种情况不仅仅是由CSR值决定的。(请注意,在将奇数值写入CSR以关灯,然后读取以打开灯后,再次写入相同的奇数值会导致灯再次熄灭。因此,在最后一次写入时,不是CSR值的变化导致灯熄灭。)
另一方面,如果灯泡在特定CSR的值为奇数时点亮,则打开和关闭灯泡不被视为写入CSR的副作用,而只是此类写操作的间接影响。
更具体点说,第二卷中定义的RISC-V特权体系结构规定了CSR值的某些组合会导致陷阱的发生。当对CSR的显式写入创造了触发陷阱的条件时,陷阱不被视为写入的副作用,而只是间接作用。
标准CSR对读取没有任何副作用。标准CSR可能会对写入产生副作用。自定义扩展可能会添加一些在对其读取或写入时会产生副作用的CSR。

一些CSR,例如指令失效计数器instret,有可能会作为指令执行的副作用被修改。在这些情况下,如果CSR访问指令读取了CSR,它将在执行该指令之前读取该值。如果CSR访问指令写入这样的CSR,则会执行写操作,而不是执行增量操作。特别是,一条指令写入instret的值将是下一条指令读取的值。
读取CSR的汇编程序伪指令CSRR rd,csr被编码为CSRRS rd,csr,x0。写入CSR的汇编程序伪指令CSRW csr,rs1编码为CSRRW x0,csr,rs1,而CSRWI csr,uimm编码为CSRRWI x0,csr,uimm。
当不需要旧值时,可以定义其他汇编程序伪指令以设置和清除CSR中的位:CSRS/CSRC csr,rs1; CSRSI/CSRCI csr,uimm

CSR访问顺序

每个RISC-V hart通常会观察到它自己的CSR访问以程序顺序那样执行。特别的,除非另有规定,一个CSR访问的执行会发生在程序顺序中先前的指令(那些修改CSR状态或者被CSR状态修改的指令)执行之后,以及程序顺序中后续的指令(那些修改CSR状态或者被CSR状态修改的指令)执行之前。此外,显式CSR读取访问指令在执行该指令之前返回所访问的CSR状态,而显式CSR写入访问指令会抑制并覆盖由同一指令产生的对同一CSR的隐式写入或修改。
同样,通常观察到来自显式CSR访问的任何副作用都会按程序顺序中那样同步发生。除非另有规定,否则任何此类副作用的全部后果都可以在下一条指令中观察到,并且在之前的指令中观察不到任何乱序后果。(请注意之前CSR写入的副作用和间接作用之间的区别。)
对于RVWMO存储器一致性模型(第17章节)来说,默认情况下CSR访问是弱保序的,所以其他harts或者设备可能会以与程序顺序不同的顺序观察到CSR访问。此外,CSR访问不会与显示存储器访问进行排序,除非CSR访问修改了执行显式内存访问的指令的执行行为,或者除非CSR访问和显式内存存取是根据内存模型定义的语法依赖性或本手册第二卷存储器保序PMAs部分定义的排序要求排序的。为了在所有其他情况下强制排序,软件应在相关访问之间执行FENCE指令。出于FENCE指令的目的,CSR读访问被分类为设备输入(I),CSR写访问被归类为设备输出(O)。

非正式地说,CSR空间充当了一个如本手册第二卷内存排序PMA部分所定义的弱排序内存映射I/O区域。结果,CSR访问相对于所有其他访问的顺序受到的约束与存储器映射I/O访问相对于同样区域访问的顺序受到的约束具有相同的机制。
这些CSR排序约束是为了支持相对于设备或其他hart可见或受其影响的CSR访问相对于主存储器和内存映射I/O访问进行排序。示例包括time、cycle和mcycle CSR,以及反映未决中断的CSR,如mip和sip。注意,这种CSR的隐式读取(例如,由于mip的变化而中断)也被排序为设备输入。
大多数CSR(包括例如fcsr)对其他hart不可见;它们的访问可以在不违反本规范的情况下相对于FENCE指令以全局存储器顺序自由地重新排序。

硬件平台可能会定义对某些CSR的访问是强保序的,如本手册第二卷的“内存排序PMAs”部分所定义。相比于访问弱排序的CSR和访问内存映射的I/O区域,对强排序CSR的访问具有更强的排序约束。

对全局内存顺序中的CSR访问进行重排序的规则可能应该移到第17章中关于RVWMO存储器一致性模型的部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值