工欲善其事,必先利其器。
如今,在ASIC和FPGA的开发中,主流的是使用Verilog和System Verilog这两种HDL(Hardware Description Language)。
然而如果让几个工程师从头到尾用HDL去描述一个完整的硬件架构,从设计到完成仿真到最后交付,往往要花费数月的时间,本文为大家介绍几种现在在ASIC/FPGA开发中常用的几种敏捷性开发的工具,每种工具有不同的特点因此也适用于不同的场景,如果能结合工具的特性并运用到项目开发中去,将会节约大量时间。
本文简单介绍的几种工具,可以作为项目开发的加速手段,感兴趣的可以搜索资料深入学习,说到底,无论是用哪种方式,心中都要有一个电路的架构。
1、 HDL Coder
HDL Coder是MATLAB提供的一个工具箱,目前人工智能、大数据、图像处理兴起,传统的软件处理算法往往不能提供做够高的速度和效率,因此现在很多算法都在硬件化,鉴于很多算法如fir滤波、fft变换以及图像ISP的Pipeline中涉及处理算法都具有一定的复杂性,从头用HDL描述是一个耗时费力的过程,在这种情况下,接可以考虑使用HDL Coder工具,对于图像处理领域,MATLAB还提供了Vision HDL ToolBox工具,可以方便的使用SIMULINK工具搭建模型进行仿真和验证。
例如,下图是用SIMULINK构建的一个atan2模型,灰色的框是atan2处理单元,Y和X为输入激励
通过logic Analyzer工具可以看到输出:
选中要转换成HDL的模块,右键找到HDL Coder,然后使用HDL Workflow Advisor工具,按照工具流程走下去就可以得到对应模块的HDL,在生成HDL的时候可以方便的选择Verilog或VHDL语言,在生成HDL的同时也可以根据SIMULINK模型选择生成对应的testbench测试平台:
生成的代码可读性还是非常高的,另外HDL Coder也提供了代码优化的方式,例如可以选择优化生成电路的面积或者时许,优化面积时可以选择share factor实现资源(例如乘法器)共享,也可以通过Pipeline的方式优化关键时许路径,这种优化的方法都是HDL Coder自动实现的:
2、 HLS
HLS是Xilinx的一款高层次综合工具,与HDL Coder相同的是,对于复杂设计尤其是算法设计,都提供了一种简单快速的方式,不同的是,HLS使用的是C/C++的模型进行描述,描述语法尤其相关规定,使用者可以使用高级C/C++描述自己的算法模型,然后快捷的使用HLS工具将这种更高层次语言描述的模型转换成硬件语言描述的模型。
关于HLS的官方描述:
本文不赘述HLS使用方法,Xilinx官方提供里HLS的例子,感兴趣的读者可以参考
https://github.com/Xilinx/HLS-Tiny-Tutorials.git
HLS作为FPGA算法开发还是十分高效的,但生成的代码的时序和面积往往不可控,代码可读性也不高。
3、 Chisel
Chisel是来自UC Berkely的一门硬件构架语言,基于Scala语言,可以继承Scala的丰富特性,使用者可以使用Scala的特性从更高层级上描述硬件架构的行为,然后使用Chisel转换成硬件描述语言,Chisel自诞生以来逐步完善,现在转换成的HDL描述也更加成熟,目前也有很多成功流片的案例。Github上有很多基于Chisel的开源项目,例如BOOM和XIANGSHAN
Chisel官方网站
Chisel/FIRRTL: Home (chisel-lang.org)
4、 Spinal HDL
Spinal HDL也是基于Scala的,更具体的说是一个基于Scala的库,相较于Chisel,一个显著的优点是生成代码的可读性比较高。无论是Spinal HDL还是Chisel语言,由于采用了很多软件以及面向对象的描述方法,对于使用HDL来描述硬件的工作者来说,入门门槛还是比较高的。但是对于FPGA开发者来说,使用起来还是比较容易的,Spinal作者也构建了一个基于RISC-V的CPU——VexRISCV,感兴趣读者可以去Github上获取相关代码,值得注意的一点是,索然Spinal HDL生成的代码可读性比较高,但是只能生成一个文件,也就是即使你用Spinal描述了很多模块,最后生成的只有一个HDL描述文件,这样不利于代码的仿真调试。
Spinal HDL的中文文档:
欢迎来到SpinalHDL中文文档 — SpinalHDL_Chinese 1.0.0 文档 (thucgra.github.io)
5、 Myhdl
如果你是一名ASIC IP设计者,但是又想利用Python语言的特性,那么Myhdl是一个很好的选择,Myhdl是一个Python的库,生成的代码可读性也非常高,编程的时候也可以借助Python语言的很多特性,值得注意的是,Myhdl虽然对ASIC开发比较友好,但也不是说可以不加限制的把Python语句转换成对应的HDL描述感兴趣的读者可以参考MyHDL官方网站,里面又很多例子:
需要注意的是,无论是Verilog还是System Verilog以及VHDL这种硬件描述语言,都是以一种描述性语言,也就是要心中有架构,心中有电路,心中有时序,才能写出对应的HDL描述,归根到底,数字电路设计的核心,是要了解电路的架构和原理,将需求的算法或者功能映射到具体的电路实现,这是一个数字电路设计工程师的核心能力。