tag 标签: 开源CPU及拓展

相关博文
  • 热度 8
    2019-10-12 10:04
    3887 次阅读|
    4 个评论
    胡振波《手把手教你设计 CPU : RISC-V 处理器》阅读笔记 王雪博士 1. 说明 我个人是做算法为主的科学家兼工程师,过去只用过各类单片机和 DSP ,包括深度优化因此也接触到部分底层架构;但从来没有设计过 CPU 。随着 AI 发展趋势之一是设计新型 AI 芯片,我个人有些构建是想构建深度学习架构上的新型计算框架 ASIC 。初步想法是这样的芯片仍然需要一个小的 CPU 作为基础的控制单元,而 AI 部分作为内部拓展(指令集 + 运算单元),这样总体仍然是个 CPU (或 MCU )的话,对外仍然给用户提供一部分应用层的编程空间、对内调用虽然巨大、但结构上却是从属的 AI 部分,是一种使用上的方便。我这里希望设计的专用 AI 核,也许并非仅仅是矩阵运算加速器(协处理器),而是包含了特殊运算层面优化的海量并行简单单元及其局部存储和运算流控制的整体单元,它整体也许并非基于一个冯纽曼架构(尚未确定),但对外可以是通过指令来运行,计算数据的出入等。希望不仅仅是一个软件模块通过内部 API 的调用。另外,我也看好 RISC-V 的兴起,除了它的开源,也看好社区和协会等逐渐发展的过程,希望参与到这个发展的热潮中去,除了贡献自己过往深层优化的经验和一些也许有用的思想,也可能成为我创业的基础之一。在某次线下活动了解到蜂鸟体系后,又获得赠书,更加荣幸能够参与到这个讨论和精读的过程中,提升自己。 2. 阅读前的基础和期望 对于 CPU 一般基础架构和模块功能已经基本了解,对于 ARM 等商务竞争和所达到的生态也了解,对于 RISC-V 有初步了解,但未及任何具体的指令和内部硬件单元。我的期望是通过学习,得知在目前开源社区各公司和个人参与情况下这个热潮中,有哪个具体的设计软件(或一些软件构成的工具链),使得我可以看到 RISC-V 基础架构的指令,并可以拓展指令同时拓展相应的硬件计算模块,然后这样拓展了的一个纯软件的 CPU ,在一个 IDE 里能够对其编程、编译下载运行,进行一般的调试验证,而验证成功后除了输出程序代码,也输出 CPU 的工程设计代码,可以衔接到芯片设计的下一环节。上述验证过程可以在纯软件环境或者通过某 FPGA 评估板进行,后者自然又要纳入另一套技能(标准 FPGA 底层库的使用、和如何拓展和验证新的库),希望能够避免,因为那样仍未走近最终 CPU 的目标。即使一套工具无法达到 既设计 CPU 又运行 CPU 的程度 ,也至少指出这样的希望,通过怎样步骤能够逐步达到。 3. “第一部分”综述部分笔记 首先看到“通用可配置寄存器”的出现,希望后续可见它们的功能是怎样的、用起来有哪些(类型)的指令、以及如何进行配置这个动作。 进一步对于蜂鸟 E200 系列如何进行开源进行了简介,但唯一一个图( 4-2 )对我来说,这个具体实施的 SoC 内部信息不够,也许是因为涉及太多方面的信息,只有后续逐步给出。 4. 第 5 章 E200 设计总览 顶层描述基本可以暂时抽象地了解。暂时不理解的是: 5.4 中的模块名称,与 5.9 中的接口信号名称是怎样的关系。这点对我很重要,并且逻辑上估计,这个太“基本”因此后续章节更加深入的细节中也不会有介绍。我理解例如 e203_clk_ctrl 是关于整个芯片时钟控制的逻辑模块的名称,而其内部逻辑方式此处并未介绍,可以理解。但下面的“信号”感觉也很重要和基本,例如 clk 是属于 e203_clk_ctrl 模块的哪里呢?是 e203_clk_ctrl 内部的某些逻辑操作必须受这个配置的控制、还是模块对外的一个控制信号呢、那么又是去控制谁的呢?当然也许控制很多模块,但也可以说明其中一二吧。 5. 第 6 章关于流水线 比较清晰。不仅介绍了流线概念,还通过比较了深或浅各自的利弊,去加深理解。同时还介绍了一些常见处理器所采用具体实施时进一步的各方面性能区别。“反压”现象及其解决技巧,由于我有过一些简单了解,立即不难,描述很清楚。及下节关于“冲突”的描述,我统一看做是如何不增加更多的流水线深度,而在某些层级的内部,添加各种深化的处理模块,以达到更好的总体性能,或者减少已知问题;是否可以看做是层级内部的一些“并行计算”,我这个说法不一定符合行业习惯,但总是在流水线层级内部,添加更多模块,因此也就多一些运算(含个层级之间的通信)。不算“预期”那种高档 CPU 所用的结构。对比汽车装配的例子,就等于说不添加太多工序、而让其中某些工序的工人(因为他的工作量不满而有更多待工时间)做多一些操作,但同时工序间通气的动作也多一些。关于资源和数据冲突,本身就是并行运算必须思考和解决的问题,我此前在 DSP 上必做的事情,因此对如此动作的理解不难;而区别是,不仅如此动作如何用, CPU 设计时如何保证运行起来能够完好做到。已经简介一些实施方法。 6.5 节介绍了蜂鸟 E200 的变长流水线结构及其操作。 这里我有一个疑问是:流水线结构、以及 CPU 核心架构部分如 e203_core 等, 是属于 RISC-V 的开源部分所提供的呢、还是蜂鸟自行设计或配置的 ?那么后来的 CPU 设计者有否自行设计这部分的可能性呢?因为 ISA 指的是一个指令集以及其中每条指令所对应的执行硬件逻辑电路(才称为“架构”),当然还有所有辅助部分。但 core 里的单元,例如取指令、解释指令、运行指令(相关的内存访问和控制等)都不是任何一条指令内部的内容(这些单元所读取和执行的“内容”,才是指令),所以不属于 RISC-V 么? 6. 第 7 章取指 7.1 中讲 PC ( Program Counter )就是指令所在地址。这点有些含混:一般来说指令不被挪动。但由于跳转和循环等, counter (计数器)等于已经运行过的指令周期数,不会永远等于固定地址向下的延续。所以,似乎采用另外的英文更好一些( PP : program pointer ?)。 本章内容,也许除了“中断”就是整个处理器中最复杂的了,但理解没有困难。本章书写方式先介绍各基础技术如分支跳转可能有的做法,及其优劣,然后直接介绍 RISC-V 的实施:核心是用对齐同宽度、只用静态分支等换简单清晰(超低功耗:所以我假设那些高功耗的 CPU 就是这些地方多用了复杂技术,大量额外的硅面积和额外的计算单元同时耗费能量以提供更多情况下计算需要的高一些的性能)。然后通过两张图( 7-6 、 7-7 )说明具体的 IFU 的“硬件”实施:先说本架构下 IFU 所处位置和对外结构的关联,再说 IFU 本身。这里面引入微解码器结构,后续深入介绍,给出例化代码,虽然不熟悉 V-RTL 语言,仍然从各量名称和注释中看出操作:对微解码器的无关输入输出如何处理等。 可见,即使架构很简单明了做到了超低功耗的贡献,却仍然(因为设计哲学被保持简单而带来的设计者头脑的经常性清晰)做得到若干高性能,如“连续不断”等。 本章第三节后面的所有子节内容, BPU 、 PC 、 ITCM 及 BIU 访问、 ITCM 和 BIU 等,概念都不难理解,但具体操作走一遍都需要认真读懂代码,我认为应该在进行实际设计开发时再进行、本节内容作为工程参考。而目前这样仅仅阅读基本也记不住。 7. 第 8 章执行 看来执行有非常多内容,因此占用篇幅也很大。其中 8.1 节专门先行了概述。“执行”中所需的步骤,不论是软件还是硬件实施,在设计步骤如何介绍和做,总体在本节见到“译码”、“发射”、“派遣”、“执行”、“交付”和“写回”等步骤。但是我的理解,基于书中描述和分节的逻辑,不一定正确。首先总体叫做执行,执行中又分这么多步骤中的一个,也叫执行;“交付”既然重要不可少,为什么不属于流水线功能、又为什么其顺序不在 8.1.5 节中所及的几个步骤?那么本节概述之后,只有在后续去看分别的详细章节(如果有的话),它们分别究竟是怎样的;同时又进一步看基本 CPU 原理怎样、和 RISC-V 或蜂鸟实现怎样(效率、性能、简单、小型)。 8.2 节和 8.3 节分别将 RISC-V 和蜂鸟的实现,前者非常简单,对 8.1 中若干单元简单实施,都是“最简”或者“规整”的实施;而 8.2 节在介绍具体蜂鸟实施时,才进行例化,除了包括具体选择,还包括各子结构中的实施代码的例。也包括一些“总体设计思路”和取舍策略等。图 8.1 和 8.2 比较清晰了,而其中单元的实施,在下面小节中由代码逐一表述,同样我不会去深读代码,因为没有运行的条件。 值得注意(但因为不去深读代码,只是逻辑或概念上搞懂一些点)的是,下面小节部分是讲一些具体运算或者逻辑单元,如寄存器组的实施代码,而另外一些是“过程”的代码,如“派遣”。这二者对我来说是不同层次的逻辑,因此尚未理解到位。当然,过程肯定也是通过一个硬件子系统实施,这里用代码表述,该子系统无非是组合和时序逻辑,以及一些更小单元之间的连接关系(发出哪些信号给哪些其它的单元等),而并非抽象的软件流程图那样的过程。但是也许这些过程比较复杂,因此也没有完全给出其硬件框图,因此我有这些含混的理解。 8.3.7 节专门讨论冲突等,比较长,也属于不按“执行”中一个步骤或子系统的方式所提出,但其中为了说明问题,除了代码,也还有一个小的图说明 OITF 微架构。可见整个执行还是非常复杂,过程和模块基本很难区分,描述方式也有各种,最终所有多方考虑都已实施就好。 ALU 是具体数值运算的核心,也包含 E200 的多周期乘除法器。这部分代码多、也包含少数框图,但还是比较清晰的。后续有“高性能乘除法”和“浮点单元”,但都属于开源的蜂鸟 E203 之外,也是属于 RISC-V 基本指令集之外的运算单元( F 和 D 扩展子集),所以没有代码介绍和必然存在的实施细节和取舍考虑,而只有框图。 交付与写回由下面章节介绍。 8. 第 9 章交付 本章介绍处理器核心流水线功能没有介绍的一个必要过程:交付的概念。然后介绍了 RISC-V 的简化交付特点:其中提及“所有运算指令都不产生异常”包括除以零也不当做异常处理。然后介绍 E200 的硬件交付实现,是在流水线的“执行”阶段。本章多次涉及中断过程,也确实是在 RISC-V 已经简化了结构下,最多与交付相关的场景。详见 13 章。 9. 第 10 章写回 我对写回的理解就是一个(不同运算单元、不同处理方式等)执行后结果统一写到通用寄存器的过程。本章有介绍 E200 的具体写回实现(硬件结构和代码)。引进“写回仲裁”概念,并有对于长周期等处理仲裁的介绍和代码。对于 OITF 情况有专门小节较多解释,这里也再次说 Outstanding 这里并非指“卓越”而是指派遣的“滞外”情况,我理解是面对不同长度执行时从派遣到执行再到写回过程中流水线的复杂情况的处理。 本章最后总结中对于 E200 的混合策略中面对的三种情况:仅有单周期、仅有长指令、各类指令混合, E200 属于混合策略,分别为“如何发射、如何执行、如何写回”。但这点我不理解之处是:这三种情况是设计好的 E200 同时具备的能力在运行时根据指令不同而分别处理呢、还是仅仅该设计好的芯片这里“讨论”的方法不同呢?我不了解的是三种情况实际上如何判断和分别进入或采用哪个策略:因为毕竟 E200 设计好以后,这 3 种情况都是设计好有能力应对的,但是其中作为处理器,不同类型的指令都存在供软件使用,那么什么叫做“仅讨论”呢?不如说是当指令是某种指令时,就采用哪种策略,而不存在“统一考虑”的混合策略了。 最后一段说到的简单的 E200 也兼顾了性能和面积,方法就是将交付于写回分别设计使之允许某些混合策略,并区分单周期和多多周期指令,并利用了 OITF 内在的记录去达到。这样看来, 上述混合和“策略”的考虑是指设计之前 ,而设计好的 E200 就只有混合或综合策略、是已经完全统一考虑了的,并判断指令情况后、根据具体单周期与否去进行分别的处理过程,而硬件已经具备分别处理 2 类指令的能力(和不同的写回等)。 10. 第 11 章存储器架构 第一个和我的应用有关的考虑是为什么不用缓存的原因之一是“软件规模较小”。这里要认真对待,因为作为 RISC-V 的主要目标应用的一般性 MPU 的软件确实会很小,但我的 AI-ASIC 不小。也许可以这样看:我的 AI 专用拓展核部分的功能极其复杂,不小,但作为一个处理器去管理它的角度看,它采用 MPU 核去控制时,它是小的,或者说用普通(处理器可以进行的)软件去运行的部分,是小的;而 AI 核内部不是处理器通过软件去运行的,而是“自身”纯硬件方式运行,而其中子结构也完全不是任何目前所知处理器的方式,而是大规模并行的方式进行的极大量简单(硬件固定的逻辑)运算和它们之间以及输入输出的特殊本地存储,当然还有控制。所以,我这个包含了 MPU 作为总控制单元和用户小应用程序的总芯片中, MPU 仍然符合这里所述的只运行小软件的情况。进而, RISC-V 自身提供的“拓展”也并非我想要的 AI 架构拓展,甚至都不包含任何 MPU 基础架构之外的“任意”组合逻辑的单元设计(单元模块外部提供一个与 MPU 部分的数据和控制等接口)。后面有介绍这类拓展的一章,不过 我基本认为这里找不到“我的 AI 逻辑拓展如何设计和允许怎样的与 MPU 间的接口”的内容了 。 关于哈佛与冯诺依曼体系结构的区别,以前我用 DSP 时已知,因其包含 4 个内部总线(数据地址、数据数据、指令地址、指令数据)。但此处更加基本地说到的唯一区别是在物理存储空间:哈佛具有分别的指令和数据存储器。但如今的设计水平要求更复杂机制下的综合优化,就不仅是简单死板的哈佛或者冯诺依曼层次可以确定的了(访问性能、计算、安全等)。具体的新架构有 ITCM 和 DTCM 之分(前者也可以放数据但为了效率而不建议如此),以及相应的指令和访问模式等。但我还是没有看到,这“两类”寄存器,是否真的是不同的物理存储器,还是仅仅某种逻辑(被使用的功能)安排。猜着理解:看来是分别的物理存储器,并且都很小,都不是缓存,访问和延迟等都很简单(直接)。 感觉奇怪的是 E200 的 AGU 属于 ALU 的子单元 :前者是地址生成器,而后者却是已经拿到数据以后进行计算的单元!也许确实二者逻辑层面的操作,从底层看,很接近。但不完整阅读代码,是无法了解到的,只能猜想:都是给一个指令,前者解码以后,指令中包含的一个或多个寻址用的地址被输出,直接用于下步的具体访问;后者是给定指令,其中有些“立即数”,但还会有来自此前指令运行所获取到的其它存储中的数据,进行某种计算后输出于某个另外的寄存器中。还是怪的。 从存储子系统图中分别切出的 ITCM 和 DTCM 操作相关的图,以及相关文字说明,还是比较清楚的。这里也包含一些对于总线的描述,甚至有些解释“现代处理器”为什么哈佛和冯诺依曼边界已经模糊(就是 ITCM 中也可以保存数据等功能复杂性)。 下面对于 2 类 A 扩展指令的操作具体说明,第一类是“加载预留”和“存条件”,第二类是原记忆操作 AMO ,二者的操作描述中都有与 DMA 的关联,但遗憾的是, DMA 都是作为举例,当某些“多核”操作带来的总线冲突,都会出问题,而此处没有解决办法。并且, E200 是否会出现 DMA 或者其它“多核”类操作呢?不详,只说了为了低功耗等性能, E200 主要并不用于真正的多核操作,但 DMA 带来的地址冲突仍未提及如何规避(效率和性能可以因为功耗而有所折扣,但即使拓展到多核连接时也不应有根本逻辑错误;并且因为是内部,有错也不报 )。 11. 第 12 章 BIU 关于总线,需要定义通讯和结构协议。首先分析了常见总线,但都有不足,因此 E200 自定义 ICB 协议,折中性能、使用方便和硬件面积和能耗,并采用常用协议中可取的部分。它仅含命令和返回通道、支持任意主从数目、支持多个滞外交易、不支持乱序返回等。后面给出若干总线时序波形的例。下面介绍不同主从数目时的硬件实现。 由于 BIU 是连接多个处理器内单元的“总”线,因此其功能介绍比较复杂,才能覆盖到。 E200 的 BIU 所接受的存储器访问请求主要来自 IFU 和 LSU 。整个 BIU 和 BIU 微架构都有运行和实施介绍和源码所在地说明。 最后,在整个 SoC 中各处总线的构建,也进行了介绍,连接内存、存储和外设等,但这些无法都算作 BIU 了。不再有具体的总线操作实施,而只是说明哪些单元被(某种不详的)连接到哪些单元。但有一个“微架构”的介绍,可以理解为内部不同总线运行功能的一种抽象,逻辑上如何“分发”等。注意此处 SoC 是包含了 E200 处理器核的外部连接,所以概念上要清晰哪个是核、哪个是处理器、哪个是完整的芯片。 12. 第 13 章中断和异常 中断和异常的一般原理我已经非常熟悉,以及从软件和执行角度的过程。所以本章阅读重点是 E200 如何从内部硬件和代码上实施出来这些、以及最终提供的中断异常有哪些功能上的特色。例如多个中断的优先级设定能力、和执行时的嵌套。 后面有“异常”的简介,显然与中断不同(讲到主要不同是异常是源于内部);但关于异常的小节和表 13-1 中,仍有一类异常(精确异步异常)是指外部中断的,这就不叫含混了。我以为异常的操作和中断完全不同,那么如何区分呢? 后面 13.3.1 节回到中断:含中断的类型、等待、优先、仲裁、和嵌套等。显然与“异常”不同。前面异常小节中的(表 13-3 )是一个状态寄存器 mcause 取值的含义列表,却统一包含了一些中断,但从名称上看并非按照最终精确中断来源的区分,而只是粗略的类型如 user external interrupt 等,不了解它们是否会是每一个(粗类)对应一种不同的处理。同一个寄存器另外取值是各类异常,这些每一个倒是可以看做是具体的异常类型(因此会有分别精确对应的处理方式)。 有些状态 / 控制寄存器统一划归 CSR 寄存器,但我还不知道(找不到)它的全称。( =chip status register ?按照同一个表中另外类型为 memory address mapped ,我以往对 DSP 外部使用经验,确实如此:有一类无法映射的就是这类比较核心的状态寄存器)。 再次提出本书缺少后面统一的略缩语表,同时又没有每次出现新略缩语是记得介绍全称,不够方便 。 下面有对中断和异常统一列表面向“类型”的,而实际上是按照同步 / 异步、各类及其模式等的编号分类。 以下描述了所有类型的终端如何处理,其实是指:都经由“交付模块”去处理。图 13-10 明确显示,在这个交付子系统中,异常和中断来源于分别的源,在这里一并处理;进而中断请求来自于 3 个模块的 4 类输入,含 E200 特殊的 CLINT 和 RISC-V 提供的 PLIC 模块,以下分节详述。都列举代码来叙述功能,可见部分中断处理内部的“哪些模块的哪些信号如何连接控制”等,这里不详细阅读。其中 CLINT 可见是来源于 SiFive 公司(因为 E200 的 SoC 是来源于他们开源的 Freedom E310 Soc )的 Chisel 源码转译而来。这里也顺便可见第三方的子模块通过代码方式被纳入结构设计的部分可行方法。 PLIC 类似。 13.5.7 小节具体化中断异常处理的代码,猜想是 E200 具体的实现,于开源资源基础上有些设计取舍了;并且可以完好对应图 13.10 中的从属于交付模块的子模块。 13. 第 14 章调试机制 E200 实现并开源了完整的调试实现,这在开源处理器世界属于少见的。但这也是基于 RISC-V 的,就是说它并非不开源、 E200 选择延续这个开源模块的实施,并将其也开源。 本章有一个硬件评估板调试时连接的照片,可见我平时熟知的其中 JTAG 和 USB 不同的连线、以及其间的“调试器支持硬件”,这个东西我大量使用过,但从未了解被调试芯片内部、以及这个调试器中是如何通过怎样的信号和内部结构来实施这样的调试的。肯定有专门的调试模式,并且可以在全速或某些步进情况下保留被调试芯片内部状态,来进行调试的。 E200 内部有 DTM 模块将 JTAG 信号转为内部调试总线的信号。此处省略关于芯片这部分功能实施的代码阅读。 软件上,少不了调试按照一类中断被处理的做法,也是在交付部分进行的。但作为调试的中断,其处理有些特殊性。而 RISC-V 指令中也定义了 ebreak 和 dret 等指令,将调试功能统一到指令层面,而在使用时可以不用总考虑调试模块内部的具体实施。 最后说明了调试系统的实现比处理器核更加复杂,并且 E200 研发过程中这部分花费远超处理器核,但本书并未做深入描述。原理不复杂,属于工程细节繁琐,可以看源码了解。 14. 第 15 章低功耗 基本原理是芯片内部架构上分别定义多个功能域、时钟域等,功能上定义实施多种运行模式,并且硬件支持进入离开这些模式方便(软件)方式,最后由软件实施满足应用功能的最大限度低功耗效果。此前我用过多种低功耗模式和方法,可以完整理解外部(软件)如何进行,但其内部如何实施,例如这些模式的结构化实施、构建出怎样的操作信号等,这里可见。 在 15.1.5 及以后的几节中所述低功耗,并非通过软件控制的各种模式或域之间合理切换所得;而是底层运算单元内部的合理设计。例如对某些运算单元的“数据翻转”的减少,或“不复位”等,属于底层半导体层面的实施了。其中不复位要特别注意,在设计过程中采用足够好的“捕捉机制”完成这部分以后进行封装,否则将会带来巨大 bug 。 SRAM 存储的低功耗设计,单口或双口选用、减少读写翻转、及尽量关闭,可以理解,因为毕竟 SRAM 量很大、访问极多。但如何“尽量减少翻转”,如何做到“一次性多取数据”,需要软件进行,那么是怎样的编译器直接支持才可以,编程员去做不好;而如果硬件提供某种保障,此处未讲,我估计很难在硬件上做到,否则就是一种特殊的 SRAM 了,毕竟 R 代表“随机存储”要让软件自由使用才方便。 15.3.4 中 E200 实施部分有通过在流水线通路的设计,去达到一定程度的“减少数据通路翻转”的方式减少功耗的做法,有代码。另有“数据通道不复位”如对 FIFO 等。这些是可行的、好的系统方式,是上述原则的部分实施;但可以达到的总效果不详。 同样 15.3.6 中描述了 E200 中各类具体 SRAM 存储中的不同的低功耗设计实施(源码),也是上述原则的具体实施。 最后这两节的底层硬件实施,除了是对前面(面对某些类型的底层操作和模块的)低功耗原则是实施,同时我认为也是真正好用的低功耗,就是说软件层面上无论怎样差的使用,也不会让这些“辛辛苦苦的底层努力”不起作用, 因为软件几乎不会对流水线和数据通道进行具体操作方式的选用 。 15. 第 16 章可扩展协处理器 协处理器是 RISC-V 想要良好支持的拓展性,如果真的很好,则这个开源架构的最根本潜力将被很好发挥;而这也是本章第一节简介的:介绍到 GPU 和异构运算(大咖 Hennessy 于 2017 发起)的重要性和超过 ASIC 的 DSA 的概念(其不是对某个具体应用去具体化、而是对一个领域去具体化,因此需要的是领域的定义、支持一个一个领域内的软件灵活性的设计)。但是,后面小节并没有给出任何具体实施到这样目标的做法。而只是一些“去要做拓展必须的”接口等工程工作。就是说并没有任何具体的离开 CPU 架构的其它架构,更不要说 GPU 、以及其它更加 specific 的东西,如何实施。这个如果没有,那么你开放出来的“可拓展性”就完全无法验证或者真正从“主处理器”中提供任何支持并且验证,对某类拓展出来的东西,有任何支持了。等于每个要做新架构或功能的设计者,还是要自己做,你提供的接口我要被动地完好遵守、但你的可拓展或者“用户可编码”指令我不知道如何做,才能去定义我想要的新型计算架构!这个是麻烦,不是支持。 RISC-V 可拓展性变现在预留指令编码空间、和用户指令。下面描述这些,并且介绍接口 EAI 的实施等。有详细的代码示例甚至接口流水线的时序波形。 一个拓展模块的功能是“累加器”。当然这个不是新型的基础计算,而是现有计算的一种组合,可以提高运算效率。例如用在矩阵运算等。不是无用,只是远非我想要的拓展。但是我想要的拓展,既然需要全新的基础运算动作, RISC-V 基础部分就真的无法提供。它所提供的也许就只是与拓展部分的接口了。这也许正是目前所见“ AI 处理器”实际上都是一些矩阵运算加速器而已的根本原因了吧。 16. 第 17-20 章仿真和 FPGA 实施及测试 本章开始的最后 4 章属于本书第三部分:实际设计和运行测试等。前面章节有很多仅介绍而不明的内容,以及有了初步软硬件介绍,而因尚未组合起来用到真实的设计和验证中去看功能和性能,期望这部分能够有一些能满足我。 17 章仅说软件配置,含 Linux 环境、 GCC 编译等,然后应该在 Verilog 下能够仿真运行。 Github 上有全套工具链和测试程序。但我没有安装之前,仍然看不出是怎样一个测试环境、测试了什么东西、是怎样层面的一个仿真。也许这里没太大实际意义,原书从略、还是我这方面基础太差而无法猜出未及细节吧。 18 章首先提及基于 HiFive 的已经流片的 FE310 芯片的开发板,以及蜂鸟的基于 Xilinx 的 FPGA 的 ARTY 评估板。这俩都可以在某宝上购得,估计软件工具链也是可以完整或得到的,甚至测试例程和工具。本章有详细描述,包括我至今不了解的如何从 Verilog 代码“编译”并“烧写”到 FPGA 、然后用一个 IDE 去编译下载软件,将目标当做 MPU 去运行测试的过程。估计是可以的,其实这也是 FPGA 成品芯片及其工具链的一大应用,中间当然需要大量的构建用户自己的库的过程,例如很多 AI 芯片公司初期不用流片就演示的实施功能等。而这里提供的基本方法和工具链,猜想所带的库,就是能够完成 RISC-V 和蜂鸟 SoC 所必须的那些基本库。当我有了评估板之后,应该可以做到进一步的有用理解、包括对本书前面介绍的实际操作达到最终的理解,并且在此基础上可以估计我自己的真正 AI 拓展部分,在这样的开源 MPU 和开发平台上,究竟可以做到多大程度的开发和验证。而这里介绍使用的基本系统“ HBird-E200-SoC FPGA 原型平台”其实是包含了 XiLinx 自己的 FPGA 评估板、一块 Olimex 的 Debugger ( JTAG 调试器;某宝可购)、若干连接电缆,和 Github 下载的完整项目和若干设置即可。 19 章进一步介绍一些开发工具链。如 SiFive 的 Freedom-E-SDK 平台,实际上既非硬件、亦非软件,而只是一些支持包等,但可以提供进一步的方便,让不论流片后还是 FPGA 仿真的 RISC-V 芯片能够得以方便全面的测试,我理解就是达到编译下载运行测试等一系列工作的类似 IDE 的功能,只是并非完整集成好的、带良好管理等界面的单一 IDE 。也许我的理想“既设计又运行 MPU ”还是跨度太大、工具开发者也难以适应多方开发需求所致吧(本章最后提及 Windows 上的图形化 IDE ,但仍然推荐使用这些零碎的基于 Linux 的方法)。蜂鸟在 SiFive 工具基础上又开发并也开源了 SIRV-E-SDK ,有些不同,提供另外的一些方便。 本章后续介绍一些更加深入的调试和测试工具、运行的例等。对于一个没有进行过芯片设计、只能获取到开源资源(和自购开发板等)的人来说,似乎可以仅仅基于对软件和 Linux 等环境和一般性工作原理、配置和读懂下载到的开源源码,就能够逐渐搞定了,因为确实很多描述,确实是基于熟知的 Linux 等在其它开发目的下的方法的。当然,如果有 FPGA 评估板,所开发设计和测试过的“芯片”就多一些可用性、其“产出”就是经历过某个层次的验证而可以进行芯片最终半导体设计(选择制程和流片工艺相关)了,而流片之前的 FPGA 验证,可以达到一定的有效性,特别对于我这样主要关注运算级别的性能、相信内部结构合理化是最提供性能的人来说,足够验证到了。 20 章是一些 bench mark 测试结果的报道。有在 Dhrystone 上的跑分,首先有对它的介绍。我不完全了解,但既然说可以跑又已经跑了,就是说它生成一系列软件,能够有能力转换为我们需要被测试的硬件(芯片)平台上跑,并给出公允的跑分报告,全部由一套软件搞定。另外又介绍 CoreMark 跑分系统。最后给出二测试(都是仅有定点数运算)结果,并与 ARM Cortex-M3 相当(有些高有些低、差别不大),但所用逻辑门数量稍小。文字总结中有说性能和“功耗面积”都与 M3 相当,但我在两个跑分的介绍中、和这里给出的指标上( DMIPS/ MHz 或 CoreMark/MHz ) 都没有直接看到功耗指标 ,也许就直接看单位时钟的表现,因为时钟不高所以耗能就不高了吧? 17. 附录 完整的架构、指令编码、部分存储器和寄存器的表。 除了这些可供设计中查阅参考的附录内容以外,还简介了两类“背景”:存储器模型、和存储器原子操作指令。这些虽然不很完整,但是提供这类概念,对设计者还是极其有用的信息,设计中应该注意到的细节和背景知识。 18. 阅读总结(关于 RISC-V 和关于本书) 对于本书的比较详细的阅读理解,主要达到了认为(基于开源 CPU 体系结构的) CPU 设计不再困难无路。我不知道以前没有 RISC-V 时代另外一些所谓开源 CPU 架构及其工具链达到怎样的程度,似乎市场上没有流行起来,反过来说它们的开源,特别是工具链,根本没有达到一个起始的阈值,所以等于没有,即使极其专业的芯片设计公司,最终能够搞定一款 CPU ,利用到的该开源的资源,也还是有限,等于是从头设计了。 另外的收获是 CPU 设计究竟需要什么的基础原理复习。虽然软件、硬件和基本逻辑运算,以及从外部使用一款 DSP 类的要求极度优化的过程都很了解,但直接设计一款 CPU 还是很新的过程,特别是要关注其中哪些重点和细节、以及对于工具链的使用。特别是 RISC-V 和蜂鸟的具体实施,还加入了很好的各类内部底层功耗和硅面积等优化的方法等内容。所以我还是获得了很大收获,如果我日后真的开始一款 CPU 的设计,即使其中主要部分并非 CPU 而是更加新的真正专用的优化到底的 AI 核,同样本书部分内容不失为很好的间接参考。 当然,走向那一步的必然下一步,是下载资源、配置、构建和开始设计和仿真测试,及购进 FPGA 评估板的真实测试。而本书已经让我个人获得了这个兴趣和初始的信心。感谢作者和你们公司的努力!祝 RISC-V 产品和工具链和社区越来越好!