第一章 新型敏捷硬件开发语言——Chisel和Scala

一、最好的宿主——什么是Scala

 “如果今天我要选用Java之外的一门语言,我将会选择Scala。”

                                                                            —— James Gosling,Java之父

在今天众多的编程语言中,Java常常是软件开发者的首选语言。而能让Java之父给出如此评价的Scala,想必有其吸引人之处。那么,Scala究竟是一门什么样的语言呢?

Scala是一门基于JVM(Java Virtual Machine)运行的语言,而且它与Java互相兼容,在设计之初就考虑了与Java的无缝衔接,两者能互相调用。但是它的设计者的目的,是想创造一门比Java更好用、更高效、更优秀的语言。从运行机制上讲,Scala会被编译成与Java一样的字节码,交由JVM运行,所以程序速度和Java一样快。从实用性来看,它的形式比Java简洁的多,语法功能更加强大,代码量往往比相同功能的Java少很多。尽管这还是一门小众的语言,但不妨你去试着学习一下。

Scala是一门面向对象的函数式语言。时至今日,面向对象已经成为编程语言必不可少的属性,其强大之处自不必过多解释。但另一方面,Scala没有选择更多人熟悉的指令式编程风格,而是选用了更为小众的函数式编程理念。对于熟悉C/C++、Java、Python等流行语言的读者来说,可能从未接触过函数式编程。请稍安勿躁,只需要基本的学习,读者便能掌握基本的函数式编程,并会逐步发现函数式编程的妙处。Scala提倡使用者使用函数式编程,但也预留了指令式编程的余地。

正如它名字取自的“Scalable”一样,这也是一门可以自由伸缩的语言:既能裁剪已有的类库,又能扩展自定义类库;既能用于完成一个简单的脚本,又足以胜任任何复杂、庞大的软件系统。它的语法比Python还简洁,它的抽象能力比C++还高级。正因此Scala的学习曲线并非平滑的,而是阶梯状的。也正因此,如果你能耐心学会Scala,并逐步掌握它提供的高级语法,深入理解其编程理念,那么你就会发现这很可能是一门让你爱不释手、相见恨晚的编程语言。

Scala最大的优势,可能就是其各种语法便利造就的强大伸缩性,进而成为一种优秀的宿主语言。换句话说,开发者可以方便地利用自定义Scala类库,快速开发出“新”语言,专门用于某一特殊用途。目前,它是公认构建DSL(domain-specific languages)最好的宿主语言(这个有待考证)。

二、敏捷开发——什么是Chisel

对每个数字电路工程师而言,Verilog再熟悉不过了,也可能早就无力吐槽了。诚然,Verilog还是C语言时代的产物,现如今,开发效率低下的问题越来越明显。软件开发效率早已用其他语言突飞猛进,晶体管密度也随摩尔定律水涨船高,而我们最前端的HDL语言似乎还在原地踏步。早在二三十年前,人们就认为Verilog/VHDL快要过时了,当时的开发者主要分成三大派:一派主张应该改进Verilog,另外两派则主张把语言转移到软件语言(一派主张C++,一派主张Java),这样就能获得开源的综合工具和仿真器。最终,Verilog的改进版获胜了,也就是Verilog的后续标准——SystemVerilog。一方面,支持改进Verilog的人占多数;另一方面,也得到了Intel的支持。

然而,SystemVerilog并不是非常好用。首先,尽管它引入了面向对象,但是却只能用于验证,因为验证更像是软件,而不是硬件设计。其次,SystemVerilog解决了一些Verilog语法瑕疵,使得硬件设计更为方便,但效果并不明显,治标不治本。再者,EDA厂商对SystemVerilog的支持不够积极,新特性到现在也不是全都实现了,使得工业界仍然偏向采用Verilog-2001。总结起来,从Verilog到SystemVerilog,并没有C到C++那样巨大的飞跃。

那么主张C++的那一派呢?也就是我们现在熟悉的SystemC。事实上,SystemC也就是用C++定义的一堆类库。SystemC的开发多数还是用在事务级,即编写硬件模型。用SystemC直接开发硬件并不多见,因为目前EDA工具支持的不够好,相比Verilog,开发出来的电路优化得很差。

那么主张Java的那些人呢?似乎我们现在才看到基于Java平台的HDL语言——Chisel出现,尽管Scala不是Java,但是基于JVM。Chisel(Constructing Hardware In a Scala Embedded Language)是一门以Scala为宿主语言开发的硬件构建语言,它是由加州大学伯克利分校的研究团队发布的一种新型硬件语言。据团队成员之一Krste Asanovic教授介绍,早在30多年前还没有硬件描述语言的时候,他们就已经开始构想这样一种语言了。最开始Chisel是基于Ruby的,但是后来发现Scala更适合构建Chisel。因为Scala有诸多特性适合描述电路,比如它是静态语言,以编译期为主,适合转换成Verilog/VHDL。再比如它的操作符即方法、柯里化、纯粹的面向对象、强大的模式匹配、便捷的泛型编写、特质混入、函数式编程等特性,使得用Scala开发DSL语言很方便。通过firrtl编译器可以把Chisel文件转换成firrtl文件,这是一种标准的中间交换格式,也就是让各种高级语言方便地转换到Verilog/VHDL的媒介,但它其实和verilog/VHDL属于同一层次。在这里,Chisel选择了妥协,没有直接生成电路,而是借助Verilog,主要是因为没有EDA工具支持,因此,它并不等同于HLS(High Level Synthesis)。将来也许会有EDA工具直接支持Chisel。

Chisel解决了Verilog的一些痛点。首先,也是最重要的,也就是在硬件电路设计中引入了面向对象的特性。其次,减少了很多不必要的语法,改进了有瑕疵的语法。Verilog的初衷本就是用于电路验证,而不是设计,因此存在很多不可综合的语法。在Chisel转换成Verilog的过程中,不会采用这些不可综合的语法,因此编写Chisel时不用担心无法生成电路,对硬件新手而言是极大便利。再比如,Verilog的reg不一定指代寄存器,这常常被新手误解,而Chisel的Reg就是寄存器,没有歧义。最后,利用Scala的模式匹配、特质混入、类继承等特性,能够迅速改变电路结构。对于日益庞大的SoC系统,这是非常重要的。

设计Chisel的初衷,就是因为伯克利的团队仅有十几名成员。相比常规硬件设计公司几百上千名工程师的配置,这属实“寒碜”。然而,他们借助Chisel,仅花了一年时间和100万美元,就完成了从RISC-V指令集设计到Rocket芯片的成功流片。这不得不让人好奇,Chisel这把“凿子(chisel的中文意思)”究竟有多大的魔力?

接下来,我们就将开启Scala/Chisel的学习之旅,希望在这个过程中能带给你丰富的收获。

 

上一章   序 Chisel教程汇总

下一章   Scala入门——让你的代码跑起来

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页