学fpga(从verilog到hls)
Posted 费晓行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学fpga(从verilog到hls)相关的知识,希望对你有一定的参考价值。
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
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不能丢
对于时序要求很高的protocol,verilog不能丢,这个用hls是很难做到的。而对于通用逻辑、非标算法逻辑、规模算法的加速,这是hls的强项。此外,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的另一个思路
用对比的思维来学习并发编程是一个不错的思路,比如openmp。openmp本身其实也是c、c++语言,但是通过#pragma可以实现并发的效果,这一点和hls有点类似。hls通常适合复杂的算法优化,不太适合精准的硬件协议,如果需要把fpga应用到更多的场合,那么hls至少从目前来说还是必由之路。
8、hls视频教程
https://www.bilibili.com/video/BV1J5411t7uE
创作挑战赛 新人创作奖励来咯,坚持创作打卡瓜分现金大奖以上是关于学fpga(从verilog到hls)的主要内容,如果未能解决你的问题,请参考以下文章