RISC-V 自定义指令如何保持软件的兼容性?
RISC-V ISA(指令集架构)是以模块化方式设计的。这意味着ISA有几组指令(ISA扩展),可以根据需要启用或禁用。这允许精确地实现应用程序所需的指令组,而无需为没有使用到的区域提供额外的功耗。其中有一点相当重要,设计人员可以为他们想要加速的应用程序添加所需的任何指令。这是一个强大的功能,因为它不会破坏任何软件兼容性,同时为新的发明和差异化留出空间。RISC-V指令集架构被设计为在基本指令集的基础上扩展出更多的指令。你可以随意混合搭配。例如,可能有一个实现最小值的RISC-V处理器,或者一个实现所有ISA扩展的RISC-V处理器,这取决于设计需求。下表列出了已被RISC-V基金会批准的主要ISA扩展,以及目前正在开发的ISA扩展。扩展指令正式批准说明I/E是基本整数操作指令。这是唯一的强制扩展。I 需要32个寄存器,E 只需要16个M是乘法和除法指令C是只有16位编码的紧凑指令。这种扩展对于需要低内存占用的应用程序非常重要。F是单精度浮点指令D是双精度浮点指令A是atomic 类型存储指令B否位操作指令。包含用于位操作的指令,例如旋转或位设置/清除指令。V否向量指令,可用于高性能计算。P否用于嵌入式DSP处理器的SIMD压缩指令随着更多ISA扩展的添加,上表的内容将会逐步被扩展到更多。但是如果这些基本扩展依然不能满足客户需求时,就需要采用RISC-V规范允许添加自定义指令扩展。这可能是公司的“秘密武器”和一个关键的区别。大家一定会有疑问,为什么采用了自定义指令依然可以保持软件的兼容性?由于RISC-V生态系统的特性,定制ISA扩展需要不会破坏与主要规范的一致性;即使有额外的指令,您的处理器仍然完全符合RISC-V,并且可以运行来自生态系统的通用软件堆栈。这就需要通过软件架构来协同实现。图1显示了自定义ISA扩展如何适合于软件堆栈。
图1在最底层上,有一个与RISC-V兼容的处理器和一个定制的ISA扩展。中间一层它运行一个操作系统,它可以用任何与标准RISC-V处理器兼容的编译器编译(没有特殊的ISA扩展)。除了操作系统之外,还有三个应用程序。App1是一个不需要任何加速的通用应用程序。您可以使用公开可用的现成编译器(例如GCC)来编译它,甚至可以使用预编译的应用程序;RISC-V处理器将能够直接运行它。App2和App3是需要尽可能快地运行的重要应用程序。这些必须由专门配置了定制ISA扩展的编译器来编译。编译器可以利用新的自定义指令来加速App2和App3图2显示了另一个具有定制ISA扩展的RISC-V兼容处理器示例。App1使用基本指令集,没有使用定制的ISA扩展。App2和App3使用通用API。这个API是由一个支持定制ISA扩展的库来实现的,它同样可以加速App2和App3。App2和App3都可以在现成的RISC-V处理器中重用。所需要的只是实现所需API的库。在这个系统中,将带有自定义ISA扩展的App2和App3从RISC-V迁移到没有扩展的RISC-V是很容易的,并且不需要做任何应用程序移植的工作。
图2