不论在半导体圈内圈外,RISC-V 可谓火爆异常,从阿里平头哥发布高性能 RISC-V 处理器到 ARM 频繁的改变市场策略,RISC-V 掀起了一股新的潮流。和这股潮流同时到来的,还有敏捷芯片开发。

 

“敏捷开发”对于 IC 设计工程师来说似乎比较陌生,但事实上它已经在软件开发中占有重要地位,它源自早期美国和日本对于精益生产的理论和实践,迭代和增量式的开发方法是敏捷的核心思想,在 2001 年“敏捷软件开发宣言”发布。之后,“敏捷”开发方法已经被应用到了各个行业和领域。

 

事实上,芯片开发周期过长已经是阻碍半导体数字设计快速发展的重要瓶颈。Verilog HDL 能实现完整的数字电路开发,但是其代码密度低,许多团队为了加速开发还必须配合团队约定的 coding style 自行开发非标准的 Perl/Python 脚本以完成部分代码编写的自动化,然而这种方式的可移植性存在问题。之前 EDA 业界也在尝试把 C 代码直接编译成 Verilog 的高级语言综合(High-Level Synthesis),但该尝试目前仅获得了有限的成功。U.C. Berkeley 在设计和开发 RISC-V 标准和 Core 的过程中,引入了 Chisel 这样的开发工具,并且很大程度上反哺和改进了 Chisel。那么,U.C. Berkeley 这么做的原因是什么?给整个数字 IC 设计领域会带来哪些改变呢?

 

先摆事实再讲道理,让我们先跳过过程看下结果吧。

 

SiFive 作为 Berkeley 孵化出的高科技公司,几乎所有的研发均使用 chisel

rocket-chip 项目在 Github 上做为标志性的 chisel 项目,包含一个可定制型很强的 CPU 和总线等其他 IP

rocket-chip 项目到 2018 年 6 月有接近 6000 次提交

2017 年,SiFive 在众筹网站 CrowdSupply 上发布了 Hifive1,板子上搭载的芯片就是基于 rocket-chip 并添加其他第三方 IP 的 FE310 芯片,工艺为 TSMC 180nm,这是一块 Arduino 兼容的开发板

2018 年,SiFive 又在 CrowdSupply 上发布了其 4+1 核心的可以运行 Linux 操作系统的 HiFive Unleashed 开发板,芯片代号 FEU540,工艺为 TSMC 28nm,这款 SoC 芯片依然是基于 rocket-chip 的。

 

所以在我看来,为什么用 chisel 而不用其他语言自然是因为人家觉得好用,Berkeley 可以称得上是在诸多大学里非常接地气的大学了,他们似乎除了提出超前的概念之外,更有能力去让这些想法落地,去看看人家孵化出多少硅谷项目(Spark,Unix/BSD)就知道了。

 

客观地说 chisel 没打算取代 verilog 或者 systemverilog,而只是希望在这个基础之上做一个高层次的构建语言,所以我们实际上可以把 Chisel 叫做 Hardware Construction Language,要明白这和高层次综合(HLS)并无半点关系。(但是或许也可以在 Chisel 的基础上构建 HLS,这是另一码事。)

 

聊到 chisel,很多前端工程师就会想到 Java 和 Scala,这是比较常见的误区,所以不如先聊聊 Scala 吧。

 

Scala:天生适合做"新语言"的"高级玩具"

先想象下你有一盒含有 MindStorm 套件的乐高积木,用它来做了一辆遥控车。Scala 就是这样的"高级玩具"。

 

Scala 是由洛桑联邦理工学院的 Martin Odersky 精心设计的一门多范式、函数式和面向对象的编程语言。我们可以不用太关心前面的定语,我们只要记住,Scala 很适合做领域特定语言(DSL),这一定程度上是设计出来的,而非偶然。当然,”函数式“这个属性必须得提一下,因为函数式编程语言往往和硬件模块存在一些等价转换关系。

 

DSL 意味着他可以像橡皮泥或者积木一样被组合或者塑造成为新的语言,一个经典的案例就是把 Scala 捏成 BASIC 语言。(有兴趣的读者可以参见这个 Github Repo: https://github.com/fogus/baysick)

 

 

看到了么,因为 Scala 中几乎所有的元素都是对象,并且都能够被赋予新的功能,同时配合大量的语法糖,所以这个无聊的小哥用它来实现了一门新的语言,而且只用了 300 行。(有兴趣的读者可以参考 Code: https://git.io/vhMmO)

 

Chisel 要解决什么问题?

请允许我举一个非常不恰当的栗子,我们以设计一个 CPU 为例吧。

 

你本科熬了几年图书馆,挤破了头进入国内某微电子学院做了研究生,老师进来和你说我有个很好的想法,能够有效的改进指令效率或者多核性能或者功耗。

 

老师说你做个 5 级流水线 CPU 把,还要把 cache、总线、外设之类也做了(没缓存搞什么多核?)。好吧,我承认你很聪明,不出几个月你把 CPU 写的差不多了,然后 cache、总线、外设这些大头还远着呢。又过了几个月你天天啃《量化研究方法》,然后终于把 cache 实现了。然后你写了个 GPIO,又挂了个 SRAM,好吧,你终于实现了一个小的 CPU 了。为了降低难度,你用了学术界最爱的 MIPS 体系结构,用了最土的 wishbone 总线。然后你开始了撸软件了,因为用了 MIPS,你的难度已然降低了很多,而且你不用考虑编译器的问题了,你又吭哧了好几个月,写了个巨土的 bootloader,终于把程序加载了。尽管后面可能还要在 FPGA 上跑起来,要发顶作的同学还要去申请经费流个片,这估计又要好久好久。但到目前为止你终于可以开始评估下你的设计的好坏了。

 

你跑了一堆 benchmark,得出了一些结果,然后你才开始把导师的 idea 应用到你的设计中。然后,然后,你就硕士毕业了,放心吧,你的这个摊子,你的学弟们会接锅的。

 

这里尽管很多东西不那么真实,但是不得不说大学教授的很多项目,都是好几届学生慢慢做才做下来的,而且做归做,评估归评估。做完了哪里不好还得继续改进,因为有了架构,离实现到最后变成芯片还远着呢。更何况,评估一个设计好坏这件事本身或许难度更大。

 

以上的故事暴露了一个问题,对于改进硬件架构这件事,反馈环实在太长了。

 

所以扯了半天,我其实就想说一句话,硬件设计太耗时,Verilog 写的蛋疼,需求要是变一点,那些个接口就得跟着变。要是速度上不去了,我要是想换个架构,又要花好久。

 

的确,SystemVerilog 这些问题也都有类似的解决方案,但似乎 chisel 的代码密度更高,面向对象和高级语言特性支持的更好。和 SystemVerilog 提供的一步到位相比,Chisel 首先生成通用的 Verilog,然后交由后端处理的方式,降低了对 EDA 工具的要求。还有更重要的一点,它是开源和免费的。

 

RISC-V 和 Chisel 的小故事

所以当 Berkeley 的 Krste 教授和他的学生们决定要去做一些研究的时候(比如下一代数据中心的 CPU 架构、后摩尔定律时代的 CPU 架构或是 AI 加速处理器的时候),他们当然希望反馈环足够短啊!尽早评估、快速迭代对一个研究者来说太重要了啊。

 

差不多在同一时间,Berkeley 的 Joseph Whitworth 教授也正好开始了 Chisel 的研究和开发工作,那他们自然就要决定联合起来做些有趣的事情。当他们决定做他们的第五代 RISC CPU 指令集的时候,他们需要设计一个真实的 CPU 来评估他们设计指令集过程中的每一个选择。所以他们从头用 Chisel 写了 CPU,因为 chisel 面向对象的一些属性,他们能用很少的时间就把设计做好并且评估,chisel 只要几十秒就可以生成 verilog 或者 C++model,然后直接扔进仿真器里去跑 benchmark。

 

就这样他们没用多少年就做了一个全新的开源指令集 RISC-V,这个指令集有多好呢?我说你肯定不信,我引用一段最近 David Ditzel 采访里的话。Dave 在 Sun 参与过 SPARC ISA 的设计,后面创立了全美达(Transmeta)曾经让 Intel 也胆战心惊。他最近成立了一家新的公司做 RISC-V 的高性能 CPU。以下是采访内容:

 

RISC-V wasn't even on the shopping list of alternatives, but the more Esperanto's engineers looked at it, the more they realized it was more than a toy or just a teaching tool. “We assumed that RISC-V would probably lose 30% to 40% in compiler efficiency [versus Arm or MIPS or SPARC] because it’s so simple,” says Ditzel. “But our compiler guys benchmarked it, and darned if it wasn't within 1%.”

 

“RISC-V 最开始甚至不在我们可考虑范围之内,但是我们 Esperanto 的工程师越深入的了解它,就越发现 RISC-V 不仅仅是个玩具或者教学用的工具。我们还假定说 RISC-V 在编译器效率上相比 Arm/MIPS/SPARC 会损失 30%到 40%左右,因为它实在是太简单了。但我们的编译器工程师对他进行了评测,发现只损失了可恨的不到 1%。”Ditzel 如是说

 

基于这几个事实我得出的推论就是,当我能够更快的评估我的硬件时,我就能更快的改进它,也就是能比别人更早的靠近不断变化中的有效边界。

 

这里其实引出了一个更有意义话题,如果没有 Chisel 这样的工具,RISC-V 作为一个标准,能够如此快的成熟并且达成诸多成就么?(如:短短几年内就被 Linux/GNU Toolchain/LLVM/Qemu... 等并入主线)

 

Chisel 的未来

当我们看待一件新事物的时候,千万不要用他现有的状态去预测它的未来。你一定得想想,Chisel 未来会发展成什么样。

 

Chisel 仍然是一门不断发展和进化中的项目,我能够看到的一个重要的节点就是 chisel 开始分离成为两个项目,chisel 和 firrtl。简单讲,如果把 chisel 理解为把 chisel 代码转化为 verilog 的话,那么这个步骤被分为了两步:

1. 从 chisel 到 firrtl(一种硬件描述中间表达)

2. 从 firrtl 到 verilog

 

在笔者看来这个思路就是 LLVM 的思路,熟悉编译器的朋友或许知道,LLVM 设计了一种描述清楚的中间表达 llir,编译器前端可以将任何语言转化为 llir,而所有的中间优化步骤会一级级的处理 llir,优化过的内容仍然是 llir 表达的,最终的 llir 会被编译器后端(Backend)转化为到目标机器汇编代码。我们可以说几乎大部分编译器都是这样工作的,但是当 llir 足够开放并且易于被他使用的时候,就会有更多的人来加入这个阵营,发挥他们各自的专业优势来实现更好的编译器 PASS。这也是为什么 LLVM 本质上是编译器基础设施(compiler infrastructure)而非仅仅是编译器软件。

 

所以请允许我用下面的图不专业的理解一下 LLVM 所做的事的话。

 

 

那么让我再次发挥一下想象力,想像一下 chisel+firrtl 想要做的。

 


这里我不想解释太多,但我会问个问题:如果 RISC-V 会抹平过去高昂的 CPU 授权费,那么昂贵的 EDA 工具这个山头谁来抹平呢?

 

不要小看开源的力量!

请保持开放的心态

Chisel 也并不完美,很多早期的用户都对 Chisel 有各种各样的抱怨,但要记住,开源世界的生存法则永远都不是抱怨,而是将抱怨化为前进的动力。如果你觉得我做的不好,请帮我做的更好,这才是正确的思路。

 

冷静的看待 chisel 的话,我认为这是就是未来或者是未来路上的一站,原因是它能提高生产力,我们也必须抱着同样包容的心态去看待其他类似的方法和途径。谁也看不清未来是怎样的,但是你要明白,当未来到来的时候,要想领先别人,你现在就得去做些什么对自己未来有利的事情。

 

事实上,在 John Hennessy and David Patterson 最新的图灵奖演讲上,同时提到了"DSA"和"Agile Chip Development",而 chisel,或许就是开启这个新黄金时代的先锋。

 

所以,当你和我抱怨 chisel 是 scala 写的,我不会 scala 的时候,看我的大白眼!