RISC-V(发音同“risk-five”)是一种免费开源指令集架构(ISA),通过开放标准协作开创处理器创新的崭新纪元。RISC-V基金会创立 于2015年,由超过235家成员组织组成,建立了首个开放、协作的软硬件创新者社区,开创了处理器创新的新时代。RISC-V ISA发端于深厚的学术研究,将免费且可扩展的软硬件架构自由度提升至新的水平,为未来50年的计算设计与创新铺平了道路,国产CPU逆袭之路。
RISC-V是由U.C. Berkeley开发的自由和模块化的RISC指令集,“V”包含两层意思,一是这是Berkeley从RISC I开始设计的第五代指令集架构,二是它代表了变化(variation)和向量(vectors)。
不同于x86、Arm架构高昂的IP费用,RISC-V架构使用BSD开源协议给予使用者很大自由,允许使用者修改和重新发布开源代码,也允许基于开源代码开发商业软件发布和销售。
国产CPU
MIPS——龙芯和君正
x86系——北大众志、兆芯、海光
Power——中晟宏芯
Alpha——申威
ARM——飞腾、华为海思、展讯、华芯通
RISC-V——华米、GD、芯来科技、乐鑫、华大、平头哥、
GD32VF103采用RISC-V的Bumblebee处理器内核。Bumblebee内核设计了二级变长流水线微架构,配备了精简的指令预取单元和动态分支预测器,并融入多种低功耗设计方法,能够以二级流水线的代价,达到传统架构三级流水线的性能和频率,实现了优秀的能效比与成本优势。所以GD32VF103在最高主频下的工作性能可达153 DMIPS,CoreMark测试也取得了360分的优异表现,相比GD32 Cortex-M3内核产品性能提升15%的同时,动态功耗还降低了50%,待机功耗更是降低了25%。
指令集就是一个处理器的硬件可以支持的基本操作(符号化的抽象描述)的集合。(wiki:“An instruction set, with its instruction set architecture (ISA), is the interface between a computer's software and its hardware, and thereby enables the independent development of these two computing realms; it defines the valid instructions that a machine may execute.”)。
通常,处理器的指令集架构(ISA:Instruction Set Architecture)确定它的功能。最著名的x86就是intel CPU的指令集。一个通用处理器,为了适应所有的应用,其指令集必须考虑最大的灵活性。这种灵活性主要表现在指令功能是不是完备和粒度是不是够细。
RISC-V的不同寻常之处,除了在于它是最近诞生的和开源的以外,还在于:和几乎所有以往的ISA不同,它是模块化的。它的核心是一个名为RV32I的基础ISA,运行一个完整的软件栈。 RV32I是固定的,永远不会改变。这为编译器编写者,操作系统开发人员和汇编语言程序员提供了稳定的目标。模块化来源于可选的标准扩展,根据应用程序的需要,硬件可以包含或不包含这些扩展。这种模块化特性使得RISC-V具有了袖珍化、低能耗的特点,而这对于嵌入式应用可能至关重要。 RISC-V编译器得知当前硬件包含哪些扩展后,便可以生成当前硬件条件下的最佳代码。惯例是把代表扩展的字母附加到指令集名称之后作为指示。例如, RV32IMFD将乘法(RV32M),单精度浮点(RV32F)和双精度浮点(RV32D)的扩展添加到了基础指令集(RV32I)中。
架构师希望保持 ISA 的简洁性,从而缩小实现 ISA 的处理器的尺寸。我们将在随后的章节看到, RISC-V ISA 比 ARM-32 ISA 简洁得多。就简洁性造成的影响举例,我们把使用相同大小缓存(16KiB)的 RISC-V Rocket 处理器和采用相同技术(TSMC40GPLUS)的 ARM-32 Cortex A5 处理器进行比较。 RISC-V 晶粒的大小是 0.27mm2,而 ARM-32 晶粒的大小是0.53mm2。由于面积大一倍, ARM-32 Cortex A5 的晶粒成本是 RISC-V Rocket 的约 4(22)倍。即使晶粒的大小只缩小 10%,成本也将以 1.2(1.12)倍的比例缩小。
ARM-32 的架构师后来试图通过向以前统一的 32 位 ISA 中添加 16 位指令来缩减代码长度,但根本就没有空间了。因此,唯一的解决方案是先用 16 位指令来创建一个新的 ISA(Thumb),然后同时用 16 位指令和 32 位指令来组成另外一个 ISA(Thumb-2),并用一个模式位在两种长度的指令间切换。为了切换模式,程序员或编译器会跳转到一个最低有效位为 1 的字节地址。这种方法有效的前提是,在正常的 16 位和 32 位指令中, 该位应该是 0
|