使用自定义 RISC-V ISA 指令创建领域特定处理器

文摘   2024-11-14 07:00   重庆  
1- 简介
当片上系统 (SoC) 开发人员在其设计中包含处理器时,他们在解决计算挑战时面临选择。复杂的 SoC 通常具有各种处理器内核,负责各种功能,例如运行主应用程序、通信、信号处理、安全性和管理存储。传统上,此类内核分为不同的类别,例如 MCU、DSP、GPU 和应用处理器。此外,还为非常专业的应用程序开发了一些独特的架构和指令集。然而,独特指令集的缺点是缺乏软件生态系统。
如今,经典内核类别之间的区别正在变得模糊。这是因为如果内核设计正确,该处理器可以满足多种用途。此外,通过创建适合 SoC 需求的处理器,可以提高硅片在面积和功率方面的效率。
RISC-V ISA(指令集架构)是创建特定领域处理器的最新催化剂。由于 ISA 的使用是开放且免版税的,因此它是实现处理器设计的有吸引力的基础。此外,每个字长都有一个基本指令集,这意味着使用基本指令集的软件可以移植到所有具有该字长的 RISC-V 处理器上。
RISC-V ISA 采用模块化设计,这意味着 ISA 有几组指令(ISA 扩展),可以根据需要启用或禁用。这允许精确实现领域所需的指令组,而无需支付不会使用的面积或功率。
其中一组很特殊;它没有标准的预定义指令。设计人员可以为他们想要加速的应用程序添加所需的任何指令。这是一个强大的功能,因为它不会破坏任何软件兼容性,同时为发明和差异化留下了空间。本白皮书介绍了如何添加领域特定指令(自定义 ISA 扩展)以及如何在 SDK 中构建所有所需的工具,以及如何在 HDL(例如 Verilog)中实现自定义 ISA 扩展。最终结果是优化的领域特定处理器。

2- RISC-V 指令集架构
RISC-V ISA 分为指令组(基本 ISA 和扩展)。您可以根据需要混合搭配它们。例如,您可能有一个实现最低限度的 RISC-V 处理器,或者一个实现所有 ISA 扩展的 RISC-V 处理器,具体取决于设计需求。
下表列出了 RISC-V 基金会批准的主要 ISA 扩展以及目前正在开发的 ISA 扩展。

随着更多 ISA 扩展的添加,该表将在未来得到扩展。
尽管列表已经很广泛,但可能会出现没有适合设计需求的现成 ISA 扩展的情况。在这种情况下,RISC-V 规范允许添加自定义 ISA 扩展。这可能是公司的“秘密武器”和关键的区别所在。由于 RISC-V 生态系统的性质,自定义 ISA 扩展不会破坏对主要规范的遵守——即使有额外的指令,您的处理器仍然完全符合 RISC-V 标准,并且可以运行从生态系统中获取的通用软件堆栈。
图 1 显示了自定义 ISA 扩展如何适应软件堆栈。在最低级别,有一个带有自定义 ISA 扩展的 RISC-V 兼容处理器。它运行操作系统,无论是实时操作系统 (RTOS) 还是丰富的操作系统。它可以使用任何与标准 RISC-V 处理器兼容的编译器进行编译(没有特殊的 ISA 扩展)。在操作系统之上,有三个应用程序。App1 是一个通用应用程序,不需要任何加速。您可以使用公开可用的现成编译器(例如 GCC)来编译它,甚至可以使用预编译的应用程序;无论哪种方式,RISC-V 处理器都能够运行它。App2 和 App3 是需要尽可能快地运行的重要程序。它们必须使用专门了解自定义 ISA 扩展的编译器进行编译。编译器可以利用将加速 App2 和 App3 的新指令。
图 1
图 2 显示了另一个具有自定义 ISA 扩展的 RISC-V 兼容处理器的示例。App1 不使用自定义 ISA 扩展。App2 和 App3 使用通用 API。该 API 由了解自定义 ISA 扩展的库实现,这又可以加速 App2 和 App3。App2 和 App3 都可以在现成的 RISC-V 处理器中重用。所需要的只是一个实现所需 API 的库。在这个系统中,将 App2 和 App3 从具有自定义 ISA 扩展的 RISC-V 移动到不带扩展的 RISC-V 很容易,不需要任何应用程序移植。
图 2

在以下部分中,我们将更详细地介绍自定义 ISA 扩展以及 Codasip 如何帮助设计和验证它们。

3- 自定义指令集扩展自定义指令集扩展
自定义指令集架构或自定义 ISA 扩展并不新鲜,已经存在了一段时间。但是,它们通常需要付出很多努力。首先,您需要确定改进处理器设计的指令。然后,您需要将它们添加到 C 编译器、模拟器、调试器和其他工具中,并验证更改是否将相同的内容添加到所有这些不同的工具中。添加自定义指令通常也需要一些手动工作。通常,您需要一个团队将新指令添加到 SDK 中,以便编程工具可以传递和编译指令。您还需要将新代码添加到指令集模拟器中。最后,必须扩展 RTL,并且必须验证对 RTL 的任何更改。根据手动工作量,ISA 扩展在时间和资源方面可能相当昂贵。
为了降低 ISA 扩展的成本,需要尽可能多地自动化工作,从识别合适的指令到 RTL 验证。这正是 Codasip 做得非常好的。Codasip 提供了一个名为 Studio 的 EDA 工具,使您能够自定义 Codasip 也提供的现成处理器。您可以使用 Codasip 提供的现成的 RISC-V 兼容处理器开始工作,只需根据需要添加自定义 ISA 扩展,或者您可以从头开始编写自己的 RISC-V 处理器。
自定义指令可以很简单,例如多次累加指令的变体,也可以是自定义控制指令,例如零开销循环(硬件循环)。您还可以使用带有后增量或预增量的特殊加载/存储指令。这说明自定义指令的复杂度不同,这会影响 C 编译器的功能和最终处理器的性能。C 编译器可以使用简单的指令,而无需更改原始 C 代码。换句话说,您可以拥有一个应用程序,并且可以为 x86 或 RISC-V 编译它。如果指令太复杂,则使用它的唯一方法是内联汇编或 C 内在函数。限制约为 ~25 个操作和 ~3 个输出。另一方面,更复杂的指令通常可以提高性能,因此结果是值得的。
有一种简单的方法可以将内联汇编或内在函数集成到库中。该库也有一个通用实现。这种库的好处是,您可以拥有最终应用程序的一个实现,并且可以为多个目标编译它。每个目标可能使用不同的实现。应用程序不需要知道最终的实现。
以下示例显示了此类库的代码片段。它代表一个简单的字节交换函数。如果存在指定的宏,则 C 编译器具有执行交换的特殊指令。否则,将使用标准方法。
第一部分生成的代码非常简单;只有一条指令。
第二部分在 RV32IMC 上用 12 条指令完成。X10 保存一个字的值,最后还保存返回值。
这不仅提高了应用程序的性能;它还显著减少了代码大小。您可以拥有许多类似的指令,包括弹出计数、各种位操作指令、控制指令等。
下一节将解释 Studio 如何处理自定义 ISA 扩展。

4- Codasip Studio
Studio 是一种用于处理器设计的 EDA 工具,被领先的公司用来创建特殊处理器,并被 Codasip 用来设计 Bk RISC-V 内核。它可以生成 SDK 中所有必要的工具以及处理器在 Verilog、SystemVerilog 或 VHDL 中的实现,以及基于 UVM 的验证环境。所有这些输出都是从 CodAL™ 中的处理器描述生成的。CodAL 是一种基于 C 语言的混合架构描述语言。CodAL 不仅捕获 ISA 本身,还捕获处理器的资源和处理器微架构的其他细节。
每个处理器描述由两部分组成:处理器的功能模型和实现模型。这两个模型共享共同的部分,例如操作码或指令编码。更重要的是,这些模型还使 Studio 能够生成基于 UVM 的验证环境。
当谈到 ISA 扩展时,设计人员通常从 Codasip 提供的用 CodAL 编写的完全符合 RISC-V 的处理器开始。他们需要做的就是添加自定义 ISA 扩展。请注意,我们也在内部使用 Studio — 构建我们自己的符合 RISC-V 的处理器。
该过程从识别合适的自定义指令开始。有很多方法可以做到这一点;一种方便的方法是使用 Studio 中的分析器。设计人员在现成的处理器上运行关键应用程序,分析器提供代表计算热点的特定指令序列以及需要大量计算时间的函数列表。这些信息有助于设计人员添加新指令。
第一步是更改处理器的功能模型。设计人员需要定义指令的汇编和二进制形式。然后,重要的是,指令的语义。语义也是用 CodAL 编写的。
在字节交换示例中,假设 32 位 RISC-V,代码将如下所示:
下一步是定义实现。让我们考虑在一个时钟周期内执行整个指令的简单直接的实现。这里唯一的任务是更新 ALU。
一旦我们有了 CodAL 描述,Studio 就可以生成 SDK、实现和基于 UVM 的验证环境中的所有工具。
SDK 中最重要的工具之一是 C 编译器。Codasip 同时使用 LLVM 和 GCC;通常,新指令是为 LLVM 编译器生成的。在这种情况下,我们可以看到 LLVM 识别出 byteswap 的模式,并在指令语义的中间表示中使用 bswap 函数。生成的表示如下:
所有其他工具都知道新指令,因此汇编器和反汇编器、调试器和分析器也可以识别 byteswap 指令。
关于 HDL 中的实现,Studio 支持三种主要的 HDL 语言:Verilog、SystemVerilog 和 VHDL。byteswap 示例的生成 Verilog 代码如下:
如图所示,Studio 根据 CodAL 代码生成所有必要的输出。生成 SDK 和 RTL 都是完全自动化的。
最后一步是验证。Studio 包括功能视图和实现视图。功能视图用于参考模型,实现视图用作 DUT,这意味着生成的实现是根据参考模型进行检查的。Studio 生成基于 UVM 的环境,该环境需要一些刺激。Studio 附带大量预定义测试,还支持生成随机指令流,包括自定义指令流。设计人员还可以添加自己的直接测试。三个来源(预定义测试、生成的测试和直接测试)确保全面覆盖,包括非典型极端情况。

5- 用例:针对音频处理优化的处理器
许多常用算法在通用核心上表现不佳。典型的例子是信号处理、加密和机器学习。一个真实的例子是 Microsemi 有意使用 RISC-V 替换其音频处理产品系列中一个知名的商业微控制器核心。
他们在新产品方面面临多项业务挑战:
  • 物联网 (IoT) 应用需要低功耗。
  • 希望最大限度地降低处理器 IP 成本,尤其是消除专利费。
  • 旨在最大限度地降低掩模制作和衍生设计成本。
  • 旨在缩短上市时间。
  • 希望提高计算性能和代码密度。

由于没有 ISA 专利费,RISC-V 出于成本原因是一个有吸引力的选择,并且评估了各种用于音频处理的核心选项。测试使用最小的 Codasip Bk3 RISC-V 核心作为起点,并使用 Codasip Studio 添加了一些标准扩展以及自定义指令。
起点是最小指令集 RV32I。相应的基本配置 RISC-V 核心有 16k 个门。由于基本指令集没有乘法指令,而算法包含许多乘法指令,因此计算性能太慢也就不足为奇了。
添加乘法扩展 RV32IM 并使用顺序乘法器可将性能提高 4 倍,同时将核心面积增加 20%。使用并行乘法器可使性能达到原始 RV32I 核心的 13 倍,而惩罚面积为 60%。
使用乘法扩展和硬件乘法直观上是合理的。然而,真正的改进是在对软件进行性能分析并设计一组自定义 DSP 扩展之后实现的。这两项任务都是在 Studio 中完成的。
在对最终的领域特定处理器进行性能分析后,最终性能比原始处理器高出 56 倍,而只需要 2.4 倍的门数。这种性能改进没有在门数上花费太多成本,非常划算。不仅如此,代码大小还减少到了基本配置的 26%。
通过最小化组合核心和指令内存区域,客户能够管理其硅片成本和功耗。事实上,他们能够避免转向更昂贵的工艺节点。

6- 用例:加速加密算法
为了进一步说明仅使用一条指令扩展 RISC-V 核心可以提供可衡量的改进,让我们考虑为 Veridify(以前称为 SecureRF)的 WalnutDSA 算法扩展 Codasip Bk3 核心以进行身份验证的情况。与其他加密算法一样,RISC-V 上的 Walnut DSA 性能比预期的要长。联合调查发现 Galois 域 (32) 中的乘法存在瓶颈,该乘法需要 24 个周期,而一个周期是理想的。
在 CodAL 中定义了一个单周期指令 (quad_gmul32),并由 Studio 在组合逻辑中实现。为新指令创建了一个包装器,算法与以前一样使用。
修改后的 Bk3 RISC-V 处理器比原始版本大约大 2%,但速度提高了 3 倍。代码大小也减少了 30%,这将改善指令存储器的面积和功耗。

7- 结论
领域特定处理器正在成为一种提供额外处理性能的硅效率方式。RISC-V ISA 因其模块化和内置对自定义指令的支持而成为创建此类处理器的理想选择。RISC-V ISA 提供了广泛的 ISA 组可供选择,只有基本组 (I/E) 是必需的,其余的是可选的。该概念允许设计人员精确选择他们需要的内容。如果这仍然不足以实现预期结果,RISC-V 规范允许添加额外的指令,同时保持 RISC-V 兼容。这是一个显着的优势,使您能够重用社区软件堆栈并仅加速关键部分。
添加自定义指令可以手动完成,但这是一项耗时且容易出错的任务,还需要大量资源。Codasip 使用其 EDA 工具 Codasip Studio 解决了这个问题。RISC-V 处理器和任何添加的自定义指令都用高级架构描述语言 CodAL 描述,然后 Studio 使用该语言生成 SDK 和处理器的实现。高水平的自动化允许在几小时、几天或最多几周内添加新指令。
与现成的处理器核心相比,使用 RISC-V 自定义指令创建的领域专用处理器效率极高。在音频处理示例中,门数增加 2.4 倍可使性能提高 56 倍。添加一条指令可使数字签名算法加速 3 倍。其他应用领域也取得了类似的进展。Codasip Studio 可跨领域使用,不受任何限制,从而产生独特且可衡量的改进结果。

软硬件协同设计 HW-SW Co-Design
欢迎后台留言,AI 客服全天在线。脱离物理硬件,开发测试和调试软件。基于虚拟原型的软硬件协同设计,提前一年实现产品上市创收,降低一半开发时间。
 最新文章