Design of the RISC-V Instruction Set Architecture笔记(chapter3)
本帖最后由 皋陶 于 2020-8-27 15:41 编辑Design of the RISC-V Instruction Set Architecture笔记(chapter1-2)
Design of the RISC-V Instruction Set Architecture笔记(chapter3)
Design of the RISC-V Instruction Set Architecture笔记(chapter4)
Design of the RISC-V Instruction Set Architecture笔记(chapter5)
Design of the RISC-V Instruction Set Architecture笔记(chapter3)
[*]The guiding principle in defining RISC-V was to make an ISA suitable for nearly any computing device
[*]RISC-V不应该针对于任何特定的微体系结构模式,结构实现进行over-architected(过度的结构设计)
[*]RISC-V应该开放,可以免费实现,从而使得它无处不在,更加广泛。如果学术界和工业界共享共同的标准和实现,那么学术与工业互动的障碍就会降低。
[*]为了使得RISC-V有更广的可用性,在设计ISA之前,需要设定一些目标:
[*]将ISA分为一个小的基本集和可选的扩展集
[*]同时支持32和64地址空间,同时也定义了128位的地址空间
[*]促进自定义ISA扩展,包括紧密耦合的功能单元和松散耦合的协处理器
[*]支持变长指令集扩展
[*]为现代标准提供高效的硬件支持,包括IEEE-754浮点标准,和C11,C++11
[*]用户ISA和特权架构完全不相关,正交。支持全虚拟化,
[*]RV32I is the base 32-bit integer ISA。
[*]包含47条指令,但它足以形成编译器目标并满足现代操作系统和运行时的基本要求
[*]其中8条指令是系统指令,包括系统调用和性能计数器
[*]编码特征:寄存器区分符通常在指令中占用着同样的位置。该属性允许寄存器提取与指令解码并行进行,从而改善了许多实现中的关键路径。同时这种编码格式可以非常容易从指令中提取立即数。
[*]RV32I:
[*]21条计算指令,包括有符号数运算和无符号数运算
[*]所有立即数都是符号扩展,尽管有些上下文中,这应该是无符号(减少ISA描述的复杂性)
[*]RISC-V使用XORI进行符号扩展,而为了实现零扩展,MIPS增加了NOR指令,但是NOR很少用
[*]AUIPC指令是RISC-V基本的PC相关索引策略:在与位置无关的代码中,它对于合理的代码大小和性能至关重要
[*]五条load指令和三条store指令。明确允许未对齐的加载和存储,但不保证它们以原子方式或高性能执行。这个附加说明允许简单的实现捕获这些指令,并通过非原子操作相邻的单词来模拟低级系统软件中的未对齐访问,但为高性能系统留下了灵活性,以便在硬件中本地实现它们。非对齐访问keen那个产生的问题太多
[*]a relaxed memory model。提供了FENCE指令保证存储操作之前的顺序,针对指令流和数据流之前的同步,提供了FENCE.I指令
[*]六条条件转移指令。RISC-V没有使用延迟槽,而是使用了其他的技术结果分支问题。同时相对于其他指令系统为了更快的解决分支而提供的简单分支,RISC-V提供了较为复杂的分支比较,保证了更好的代码密度和动态指令数。(精确的BHT和BTB带来的性能保证)
[*]不支持条件move指令和predication(分支断定)指令(两个分支都执行,根据条件选择接受哪个分支的结果,就叫Branch Predication分支断定)。这两种指令都可能使得控制冒险变换成数据冒险。这两种技术都会使得寄存器重命名的实现更加复杂
[*]增加JAL指令,jump-and-link,可以将pc设置到任何位置。JAL指令是pc相关的,因此可以在与位置无关的代码中自由使用。JALR指令常用于table jump(C的switch语句)。MIPS的J和JAL指令是将立即数作为PC的低28进行跳转。SPARC提供了pc相关的call指令,但是没有提供相应的JMP指令
[*]八条系统指令。RV32I确实要求提供一些用户级CSR,以提供基本的性能诊断工具,但是都是read-only。同时提供cycle计数器和time寄存器,这两者都是衡量性能的因子,但是不一定是线性关系。
[*]RV32E:为了某些嵌入式系统削减寄存器的数量,减少功耗和硬件开销
[*]15个寄存器,其他所有指令基本一致,但是如果指令试图访问16-31号寄存器,就会产生异常。CSR寄存器成为可选项。RV32E is not ABI-compatible
[*]RV64I:扩展了RV32I的地址空间,增加可用性。
[*]用户可见状态和RV32I非常相似,不同在于定点寄存器宽度和PC都是64位。
[*]相较于RV32I,64I有12条新指令。为了支持64位系统中的32位计算,增加了一些针对低32位的指令。这些计算结果会符号扩展到64位。(在寄存器中保持32位数据符号扩展可以保持C类型int和unsigned int之间,以及int和long的无成本转换)
[*]RV128I:定点寄存器宽度变为128位,新的load/store,基本的运算变为64位运算,同时包含处理低64位的指令
页:
[1]