HLS:软件化的硬件开发
RESUMMER
人各有志,行渐行远
11 人 同意这篇文章
一、前言我记得很久以前,一位高年级学生告诉我,那些从事软件的人之所以能写出与粪便相同的代码,是因为我们从事硬件的人“提供”了它。虽然这可能不是完全正确的,但软硬件的发展就是这样一种“相爱相杀”的关系:根据摩尔定理,集成电路上可容纳的晶体管数量每18个月就会翻倍,所以硬件平台的计算能力可以翻倍。然而,由于平台计算能力的增加,软件会变得越来越臃肿,它可以吃更多的红利。从一开始,软件开发只能使用汇编语言,然后是C语言,然后是C语言++、Java、更先进的语言,如Python。从面向过程编程到面向对象编程。从所有程序都要自己写,到各种库都可以直接调用。软件开发的逻辑是降低开发成本,使软件开发更容易,但这也是以牺牲效率为前提的。
图1 软件高级语言的发展过程
Android的发展是这一现象的完美研究样本,因为Android手机直到2008年10月才出现,在中国会更晚。我们中的许多人经历了Android从零开始的发展过程。2012年买了自己的第一部安卓手机,记忆深刻。当时qq大概10MB,很简单。但是,到目前为止,一个qq的大小已经超过了100MB。在这个过程中,手机芯片也从高通MSM7200A发展到高通骁龙888,不知道手机芯片能提供多少倍的计算能力。这也是软件越来越大,可以实现更多功能,可以在手机上运行更大的游戏的基本前提。
二、什么是硬件开发软件化?然而,我们今天要讨论的主题不是“批评软件如何吃硬件提供的红利”,而是“硬件开发软件”。什么是软件硬件开发?这个概念对非微电子学生来说可能是一个非常奇怪的概念,因为很多人不知道硬件开发是什么。在这里,由于现代芯片,绝大多数电路都是数字电路,所以这里讨论的硬件开发主要是指数字电路设计。对于传统的硬件开发,采用Verilog/VHDL等HDL语言构建RTL级电路,然后综合工具将这些代码转换为数字电路,再生地图,最后通过台积电等Foundry“流片”获得实体芯片。
但是HDL语言很难学,本质上只是一种硬件描述语言。这与软件完全不同,因为软件语言是逻辑语言。理论上,只要你理解一点逻辑,你就可以写可用的软件代码。对于HDL语言,你必须“心中有电路”才能写出相应的HDL代码。你必须考虑时间顺序、平行、延迟和资源占用,否则你写的代码将是一场灾难。在这种情况下,为了降低硬件开发的门槛,一些人开始考虑是否可以直接使用C//,而无需编写Verilog/VHDL代码C++、这些高级语言结合了Verilog或VHDL代码,简化了硬件设计,降低了硬件设计的门槛。这个想法是高水平的综合(HLS)。
图2 Vivado HLS设计过程
HLS近年来变得非常流行,主要是由于人工智能的发展,神经网络加速器的设计开始成为一种趋势。大多数计算机/软件等专业的人不懂HDL语言,但他们懂C//C++、Python等高级语言,使用HLS可以避免学习数字电路设计的专业知识,大大降低开发神经网络加速器的门槛。正因为如此,HLS在计算机/软件等专业开始流行。然而,HLS综合HDL代码并不总是高效的。为了提高综合代码的质量,必须采用多种优化方法。以C语言为例。使用各种优化方法后,C语言会变得特别奇怪,这将与通常的C语言非常不同,与C语言非常不同。
三、高层次综合(HLS)HLS的概念实际上出现得很早,出现在20世纪80年代,但由于技术困难,20多年来没有得到太大的发展。在2003年,Zhiru Zhang进入UCLA读博,导师Jason Cong为他选择了HLS方向的话题,博士课题叫:Behavior-Level Scheduling and Planning for Nanometer IC Designs。最后,他成功地实现了非时序代码的时序硬件化,极大地促进了HLS的发展。2006年,在获得博士学位后,他与导师一起成立了AutoESL公司,专注于C语言转HDL语言的研究。这家公司于2011年被Xilinx收购,从此有了Vivadoo HLS。相比之下,另一家大型FPGA制造商Altera也开发了自己的HLS工具,即Opencl,只是因为工具链没有Xilinx成熟,也没有Vivado HLS如此受欢迎。英特尔在2015年收购Altera后,Quartus+Modelsim的工具链也被整合到英特尔的开发生态中。
HLS长期以来一直没有受到重视,因为从事硬件的人会写Verilog/VHDL,不能使用它;软件制造商没有理由使用它。尽管Xilinx在2010年推出了“硬核CPU”+FPGA“ZYNQ平台的架构,但还没有找到合适的应用场景,所以一开始市场普遍不太乐观。然而,在2012年Alexnet出现后,深度学习开始进入发展的快车道,在全球掀起了一股新的人工智能热潮。一些大学的研究小组开始考虑使用ZYNQ来提供神经网络加速器。虽然HLS综合HDL代码效率不高,但FPGA加速器的并行执行速度远快于串行执行软件代码的CPU;与GPU相比,FPGA加速器虽然速度不如GPU,但具有功耗优势。FPGA加速器周围出现了许多论文,其速度与CPU相比,功耗与GPU相比。
图3 SoC具有DNN加速器
为了进一步提高能效比,大家开始转向直接使用Verilog/VHDL语言设计FPGA加速器。然而,由于神经网络的规模和结构越来越复杂,RTL级设计的直接设计已经成为一个非常大的项目。在这种情况下,HLS仍然不能完全取代,因为它可以大大减轻工作量。而且,如果HLS未来能进一步提高效率,Verilog/VHDL语言可能会被淘汰。当然,这一天可能还很遥远。目前,微电子专业人士更倾向于直接使用Verilog/VHDL语言来fit轻量级神经网络,如Mobilenet、SequenceNet;而计算机/软件专业的人更倾向于使用HLS来提供更大的神经网络。当然,这不是绝对的,因为很多计算机/软件的人不会碰硬件设计,很多微电子的人也使用HLS。
四、ARMCMSDKCMSDK是什么?其实是ARM 由DesignStart计划推出的新IP集提供了常用的UART、SRAM等IP,最重要的是提供一个脚本工具,可以自动生成总线矩阵。事实上,ARM在2017年6月20日开源了Cortex-M3核,但CMSDK当时还没有推出,所以当我们基于Cortex-M3进行Soc开发时,我们必须按照总线协议手写总线矩阵,总线上挂的模块只能自己写,没有现成的Verilog模块可用。然而,在2020年,ARM推出了CMSDK,我们可以直接使用脚本工具生成总线矩阵Verilog代码,UART、SRAM和其他模块也可以直接调用ARM给出的Verilog模块。因此,我们可以避免在系统的整体结构上浪费时间,并在神经网络加速器的设计上花费更多的时间。
图4 ARM designstart计划
我不会在这里介绍如何使用脚本工具生成总线矩阵,以及如何使用CMSDK中的IP。有兴趣的人可以去看看知乎大佬Teation Zhao写的教程。Teation Zhao对ARM Soc有多年的研究经验,他们最近想出一本手把手教ARM的书 大家可以关注SOC开发。我们现在要讨论的是,这个脚本工具实际上是一个HLS工具,但它将脚本代码转换为Verilog代码。从某种意义上说,这实际上比C//好C++、Python转HDL代码更“高层次”,因为我们只需要描述总线的连接关系和地址分配,就可以生成相应的总线矩阵模块。但它也有很大的局限性,只能用来生成总线矩阵。
但这为我们提供了一种设计多个工具的想法,每个工具都专门用于生成某个模块的RTL级代码。例如,我们可以使用CMSDK脚本工具生成RTL级代码。对于CNN加速器,由于CNN主要是卷积层、全连接层等,我们可以设计卷积层综合工具和全连接层综合工具,生成高效的卷积层和全连接层Verilog模块,然后连接起来。事实上,确实有人在做这种工作,比如UI的Xiaofan Zhang2018年提出的DNBuilder是专门生成DNN加速器的工具。它生成的加速器具有最先进的性能和效率,超过了类似的加速器。
图6 DNNBuilder
这不禁让人遐想,如果有一天,工具链真的可以细分到很小的程度,各种模块都有特定的综合工具,那么生成各种高效的Verilog模块就会成为现实。也许在那一天,人类手写的Verilog/VHDL代码将不如机器生成的代码高效——这就是硬件开发软件的未来。正如许多硬件开发人员抱怨的那样,Verilog/VHDL几十年来没有进步,也没有出现更先进的设计语言。与软件语言的百放齐放相比,硬件语言确实像一潭死水,但这是由硬件开发的特殊性决定的。未来会发生什么?谁知道呢,但社会总会进步。