RISC-V 指令集介绍

Posted by Taolee on May 12, 2016

什么是RISC-V?

RSIC-V(读作 risk five)指令集是UC Berkeley 研发的一款CPU指令集,该指令集最初的目的是为了支持计算机体系结构的研发和教学,但是后来Berkeley希望 该指令集能够成为一个可以被产业界真正实现的开源架构。之所以叫RSIC-V是因为该架构是伯克利研发的第五代主要的RISC指令集结构(前面四代分别是 RISC-I,II,SOAR和SPUR)。伯克利自己也已经设计并六篇了8个不同版本的(截至本文)该架构的处理器。受限于传统的晶体管尺寸逐渐变小带来的功率约束,该研究组现有的 主要研究方向是将RISC-V指令集的特殊定制以及与异构加速器的整合。

为什么需要研究新的指令集?

既然现在市场上已经有了主流的商业化的指令集,包括ARM,X86,以及开源的指令集OpenRISC为什么需要研究一款全新的开源指令集呢?主要的原因有以下几个方面:

和现有的商业指令集相比

  • 商业的指令集都是有产权保护的(公司的私有财产)
  • 商业的指令集只在特定的市场领域中很受欢迎,ARM主要在移动市场而X86则主要在服务器和桌面市场。
  • 商业的指令集不足以满足应用
  • 商业的指令集的扩展性不够好
  • 经过改进的商业指令集就完全是新的指令集了

和OpenRISC相比

  • OpenRISC的条件跳转和分支延迟(branch delay slot)使得高性能的实现变得很复杂
  • OpenRISC使用32-bits的固定编码和16-bits的立即数,限制了指令集扩展的空间
  • OpenRISC不支持IEEE 754浮点标准(2008修订版)
  • OpenRISC 64bit的版本还没有完成

RISC-V 概览

RSIC-V的设计使得它具有良好的扩展性和定制化。在基本的整数指令上可以添加一个或者多个可选的指令集扩展,但是基础的整数指令不能修改。为了支持更通用的软件开发工作,RISC-V提供了一些标准的扩展模块,这些扩展模块提供了整数乘法/除法,原子操作,单精度浮点和双精度浮点算术运算等。

“I”开头的指令集定义为标准整数指令集(前缀RV32或者RV64取决于整数寄存器的宽度,分别表示32位架构和64位架构)。“I”指令集和中包括的主要指令有:整数计算指令,整数加载,整数存储,控制流指令,这部分指令对于所有的RSIC-V实现都是完全一样的。

“M”开头的扩展为包含整数的乘法和除法,并且添加了对整数寄存器中的数据相乘或者相除的指令。

“A”开头的扩展为包含原子指令,其中的指令有为实现处理器间同步的原子性读,修改和写入存储器指令。

“F“开头的扩展为单精度浮点指令,包括单精度浮点数的加载和存储以及单精度浮点数的算术运算。

”D“开头的扩展为双精度指令,扩展单精度的寄存器以及双精度数的计算,加载和存储。

标准整数指令集以及包含的这四个扩展(”IMAFD“)指令集简称为“G”,“G”指令集提供了一个通用的标量指令集合。RV32G和RV64G是Berkeley开发的编译器工具链的默认指令集。

除过标准的指令集和上述的标准扩展,想要开发出一个能够为所有应用场景带来非常大的好处的指令集的可能性是很小的。尽管,一些新的指令可能在特定的领域中非常有用。由于能效的压力越来越促使开发出更针对特定领域的指令集,所以尽可能简化ISA Specification中所要求的部分是非常重要的。尽管其他的架构通常把它们的指令集认为是单个的不可分割的整体,当需要添加新的指令时就更新一个版本,但是RSIC-V指令集将尽可能的保持整数指令和标准扩展指令集不变,作为替代,添加新的可选指令集时在更高的层次上添加。比如,所有的基础整数指令将会一直作为一个完整的单独的指令集,而不管之后其他任何的指令集的改变。

指令长度编码

基本的RV32I指令都是32bits长度的,并且保持32bits对齐。但是扩展集合可以使用任何16位对齐的指令,不论是小于32还是大于32。所有的32位指令的最低两位都是11,可选的16位扩展集合的低两位可以是00,01和10。大于32位的指令集可以定制。标准的RV32基础指令采用小端(little endian)格式,但是大端或者双端均是可选的。

异常,陷阱和终端(Exceptions, Traps, and Interrupts)

首先澄清几个概念,异常是指运行时出现的不正常的条件。陷阱是指在一个RISC-V线程当中出现了异常条件之后处理器的控制权被同步的转移到Supervisor环境中,中断是指由由RISC-V线程之外的事件引发的处理器控制权转移到Supervisor模式。

参考来源:

The RISC-V Instruction Set Mannual Volume I: User-Level ISA.(Version 2.0)
RISC-V Fundation
Tech Report USB/EECS-2014-54