从事数字芯片设计/验证相关的技术人员肯定对HDL(Hardware Descreption Language)非常熟悉,Verilog/VHDL是做数字芯片设计的两种最主流的描述语言,中国的目前主流的数字芯片硬件描述语言是Verilog HDL,Verilog是目前设计数字电路芯片/FPGA的主要描述语言。PHGL又是什么呢?它的全称是Python Hardware Gererate Language,没错,它也是一种数字芯片的描述语言,通过Python通用语言来描述、生成数字芯片,python不是软件编程语言吗?怎么能做类似veriog这种硬件描述语言的事呢?它确实可以,PHGL与python的关系跟System C(数字芯片仿真建模)与C++的关系类似,用python编写一套库代码与程序框架,在框架内调用库代码去抽象描述数字电路的结构,最终运行PHGL python程序来生成数字电路的底层描述(verilog),也就是说PHGL生成的目标文件是verilog格式的,PHGL是比verilog抽象程度更高的描述语言,可以用写软件的方式更加高效的描述数字电路,PHGL与verilog的关系类似于C语言与汇编语言的关系,可理解为PHGL是一个生成底层数字电路代码的编译器。
PHGL是一种Domain Specified Language(DSL),是专门用于数字芯片设计领域的,它的使用领域不是通用的。在数字芯片设计领域也有不少其他类似的DSL,他们的目标也是致力于提升数字芯片设计的综合层次,试图用更高阶的方式去描述数字电路,比较有名的就是美国加州伯克利大学的CHISEL语言(Constructing Hardware In a Scala Embedded Language),是基于Scala语言的数字电路描述语言,借助Scala强大、灵活的元编程能力可以很方便的实现各种DSL,CHISEL是非常成功的并且是开源的,已经有大量的项目用CHISEL来实现并量产,最知名的就是Rocket开源项目(一款RISCV开源处理器)了,Rocket是全部用CHISEL来实现的,CHISEL的开发社区也很活跃,有大量的开发人员在关注、使用。
PHGL是借鉴了CHISEL的思想,在python上实现了CHISEL的所有功能。当然用什么通用语言去实现这个思想并不是最主要的,CHISEL之所以选择用Scala语言,是因为Scala语言是一种灵活、高效、跨平台的通用编程语言,市面上有各种基于Scala来实现的DSL,Scala是非常适合去构建自己的DSL的,但Scala并不是一门容易学习和掌握的编程语言,网上可以随便搜索一下Scala的名声,虽然功能很强大,但却令很多程序员敬而远之,最终导致Scala并不是特别流行、受欢迎,对软件人员尚且如此,更不必说让一个写verilog的数字芯片设计人员去学习并使用了。
总之,PHGL是一套可以提高数字芯片设计抽象层次、提升数字芯片工程师开发效率、高度可参数化的数字电路硬件生成DSL语言。
这个问题可以跟软件编程语言的发展做个类比,有了汇编语言,为什么还要用C语言?再发展,有了C语言为什么还要有Java/Python等更高级的语言?软件项目的复杂度是上升的很快的,如果不提升编程语言的抽象层次会导致大型软件的开发效率严重降低且bug数量更多。但同时即使有了C语言,汇编语言也有它擅长的领域,汇编不会消失。同样的有了Java/Python等也不会导致C语言消失。但是不得不承认的一个总的趋势是软件编程语言是逐渐往抽象层次高的方向发展的,汇编/C的使用范围一定是逐渐缩小的。
同样的事情其实也发生在数字芯片设计领域,只是演变趋势没有软件领域那么快而已。最初的数字芯片就是类似于画PCB原理图一样组合连接各种逻辑门与晶体管,再后来发展到用verilog/VHDL来描述电路,verilog/VHDL在数字芯片设计领域的地位类似于C语言在软件开发里的地位。从事数字芯片设计/验证的工程师都非常善于使用这两种描述语言,各个EDA公司也都开发了verilog/VHDL逻辑综合工具,verilog语言已经是事实上的数字芯片领域的标准开发语言。但是芯片的复杂度与开发规模也是在随着摩尔定律在快速上升,单纯的用verilog去实现一个超大规模的SOC芯片的描述已经明显的有点不够用了,verilog的地位逐渐的退化到了类似用汇编语言去写计算机操作系统,效率问题越来越突出。这一点上对于一个只从事数字芯片设计而对软件编程不是太了解的人员来说,他不会感受的特别明显,因为任何工具的使用都是有惯性的,项目里遗留的大量的旧代码,之前大量的开发经验,再加上verilog虽然开发效率不高,但也还不错。目前来看大多数数字芯片设计工程师并不认为verilog有什么重大缺陷,也就不会有什么动力去尝试什么更高级的语言了。但是如果是一个软件工程师来看现在的数字芯片开发,就会明显的感觉到开发工具太low了,低效的verilog代码就像是原始社会的刀耕火种,他们会有很大的冲动去升级描述语言,有太多的方法可以提高目前的开发效率的。但是为什么在芯片设计领域,语言/工具的设计不像软件开发那么活跃、那么快呢?这个跟芯片行业的特点有很大关系,芯片开发是高风险、高投入的,对产品出bug的容忍度远没有软件的高,不到万不得已是不会有人去冒风险去给自己添麻烦的,之前的东西还能用就用着,升级用新的语言/工具很可能会引入新的问题,这个风险一般不会有人去冒。
所以像CHISEL这类创新的东西一般只会发生在学校等机构里,CHISEL就是伯克利大学的一些教授与学生开发出来的,而且一些比较超前的芯片公司也在逐渐的尝试使用CHISEL来开发芯片,最出名的就是SiFive公司,Github上的Rocket项目也吸引了大量的开发者的关注,CHISEL的知名度也越来越大。但即便如此,去说服一个已经多年用verilog开发的工程师转向用CHISEL还是非常困难的,一般来说硬件开发人员都是“很胆小”的,他们是非常保守与谨慎的,Scala语言陡峭的学习曲线会吓跑90%的人,更不要说让一个芯片开发工程师用软件开发的思维去设计芯片了。
CHISEL的确是一套非常棒的DSL,如果不是因为它让人抓狂的天书般的Scala语法与各种与java的剪不断理还乱的关系,我本人是非常乐意直接用CHISEL作开发的。无奈尴尬的Scala语言挡住了大部分人的尝试欲望。于是我尝试着用一种更加亲民的通用编程语言来实现类似CHISEL的功能,从而拉近它与芯片开发工程师的距离。python语言就进入了我的视野,它是一款语法简洁,易于学习的语言,学习门槛低,而且非常主流。这就是我开发PHGL的最主要动机,而且经过我的实际项目开发体验来看,一旦使用上了他,就再也回不去用verilog语言了,PHGL可以高效的描述工程师们的设计意图,而不必使开发者陷入低层次的细节之中,可以用更加灵活高效的方式从更高的层次上去描述自己的设计意图。