hls,全称为high level synthesis。也就是说从更高一级的语言来完成电路的综合。从前,编写fpga只有一个方法,都是编写verilog类似的硬件语言。但是如何用c、c++编写可综合的逻辑,这就变得很重要了,毕竟c、c++工程师比fpga的工程师要多得多。
1、hls的重要性
从某种意义上,hls会极大拓展目前fpga的应用领域。相比较mcu、arm soc来说,fpga目前还是集中于信号采样、数字信号处理、模数转换这些场景。但是在目前比较兴起的人工智能领域,fpga着墨不多,一个相反的例子就是gpu。从前gpu只是一个图形加速器,后来连续在游戏和人工领域不断发力,使得gpu的应用领域越来越多,关联公司的规模也越来越大。
2、c语言和并发的悖论
c语言本身是一个串行代码,它和并发并不完全一致,从这方面来说,可以看成一个周期为1的特殊fpga代码。所以,在设计的过程中,难点不在于语言本身,而是在于并行的思维。c语言本身不直接变成网表,也是先变成verilog语言,再转成网表的。要实现这一步,就要在c语言上做一些修改和限制,这就是hls的初衷。
3、verilog和waveform不能丢
此外,hls改造后,如何判断hls是不是想要的效果,除了看综合效果后,也需要看对应的waveform,这点无可取代。不要指望代码编写好,就有一个立马的性能改善效果。
4、先编写c代码,再优化hls
对于软件工程师来说,先保证c逻辑没问题,再一步一步优化。优化的方法基本就是添加各种directive,也就是pragma标志。基本方法是三种,1、边收集数据边处理;2、并发;3、流水线。本质上都是各种串行限制,减少算法的latency。
5、hls仍然需要时序图、波形图设计
hls一般都是默认做串行处理,比如下面一段代码,
for(int i = 0; i < 10; i++)
{
b[i] = a[i] + c + d;
}
如果没有任何的说明,那基本上就是loop body里面的运算代码顺序执行10次。如果需要进行显式的加速,可以把循环打开、用pipeline,这样基本就可以加速处理。加速不是没有代价的,基本的方法都是空间换时间,这中间有一个权衡,算法可能快了,但是资源也可能不够了。一个巧妙的办法,就是先设计图形,等testbench的时候,把测试的图形和设计的图形进行对比,这样就可以达到事半功倍的效果,不过度优化也是很重要的。
6、注意接口、内存、hls提供的函数
hls怎么和bus接口沟通,函数里面的内存怎么映射,这里面hls都提供了很好的方法。此外,对于一般的函数功能,hls也提供了对应的优化,尤其是opencv提供的一些函数,hls都有对应的版本。
7、学习hls的另一个思路
如果需要把fpga应用到更多的场合,那么hls至少从目前来说还是必由之路。
8、hls视频教程
https://www.bilibili.com/video/BV1J5411t7uE
ps:
很多人可能很难理解,既然fpga做算法这么烦,为什么还要用。我想主要还是因为低频的fpga算法性能可以和数倍于自己的soc一样好,电路相对还简单一点,成本、供应链也没那么紧张。尤其是对于非标产品来说,特别合适。
标签:语言,fpga,代码,hls,verilog,编写 From: https://blog.51cto.com/feixiaoxing/5881888