Xilinx/Altera的OpenCL都是提供了一个基本框架,将自己写的OpenCL Kernel编译成RTL模块,放入这个基本框架里。而后进行synthesis,再下载到板子里。过程中也是先生成RTL,然后再由FPGA的综合器map成电路。
普遍的OpenCL下面调用的还是HLS,C++综合,看似效率高(驱动,各种硬件接口,DMA,全部基础模块都现成的,很容易写出一个能跑的硬件Demo),但是实际工程中会有更多约束,比如想加个自定义的配置寄存器,调试寄存器就不方便,要修改它们的驱动(比如直接调用pcie_wr和pcie_rd 函数),以及调试寄存器所需的读写返回时间太久,代码效率并不高。此外也担心在复杂代码下,是不是编译器都能优化的搞定,很多时候HLS->RTL一方面效率低,一方面代码不能用,再次手动调试/重写的代价很高。【同时缅怀一下老RTL工程师作为人肉综合器的岁月】
另外,HLS对做算法的工程师要求太高,须时刻考虑硬件的实现难易。所以,除非有大量的手调准确的例程和标准IP可供调用,否则感觉HLS在实际工程中的优势不大。HLS经过十数年的发展,最近的趋势是把“有效利用片上和片外各类存储单元”作为研究热点了,目前虽然看到诸如AutoPilot、OpenCL SDK等FPGA HLS商业化成功的案例出现,但距离其完全替代人工RTL建模还有很长的路,在这个方向,丛京生老师奋斗20年+了,但每当硬件平台升级、高层语言版本更新、某个math lib更新等,当前HLS开发就要失效了,再次调试/重写代码所花费的时间和成本代价很大,再更新一版HLS的时间/成本也要超过软硬件技术演进。