一、 HLS是什么?与VHDL/Verilog有什么关系?
- HLS全称高层次综合(high level synthesis),采用C/C++等高级语言描述功能,可以降低FPGA代码的开发时间和验证时间
- VHDL/Verilog两种语言都是用于数字电子系统设计的硬件描述语言,而且都已经是 IEEE 的标准
- HLS与VHDL/Verilog一样都是FPGA的开发语言
二、 HLS有哪些关键技术问题?目前存在什么技术局限性?
- 关键技术问题:
与Verilog相比,能做到的优化十分有限
优化手段 | HDL | HLS |
---|---|---|
BRAM分割 | √ | √ |
单次遍历 | √ | √ |
无缝数据交换 | √ | × |
背靠背迭代 | √ | × |
浮点除法优化 | √ | × |
浮点累加优化 | √ | × |
- 动态参数:HLS禁止动态分配指针,因为硬件设计通常具有多个存储空间,并且该工具必须知道函数打算访问哪个存储空间,以便可以相应地放置电线连接。动态传递函数参数的一种方法是通过静态定义所有可能的函数调用并对每个参数进行硬编码来引入间接层,然后使用条件语句动态选择正确的调用。
- 并行执行:为了确保正确执行,HLS 禁止访问同一数组的函数并行运行。由于不支持常量参数,因此它包括只读函数,因为无法对它们进行分类。必须拆分或复制数组,或者必须合并函数以启用并行执行。
- 内存过度分配:有两种方法可以将大型阵列合成为多个 BRAM 块链。首先是宽度扩展,它可以在多个 BRAM 块之间分配字位,并在每次使用内存的情况下同时激活多个块。第二个是深度扩展,它在每个块中存储完整的字,并使用多路复用器在每次存储访问中激活一个块,但会增加逻辑和延迟。为了实现高性能设计,HLS 似乎更喜欢宽度扩展,这会导致禁止使用 BRAM,尤其是在字非常宽且块未充分利用时。这样,将大型阵列拆分为较小的阵列以充分利用 BRAM 块可以大大减少内存使用量。
- 资源重用:序列化执行和重用逻辑的最有效方法是通过内联子功能提取公共逻辑。相反,关闭内联会重复资源并启用并行执行,尽管这种方法并不总是成功。确保并行执行的一种肯定但不太方便的方法是复制函数并以不同的方式重命名它们。当然,这种方法使代码难以维护,但是在某些情况下可能是不可避免的。
- 浮点累加器:由于没有浮点累加支持,实现累加的最有效方法是使用部分和和树加法器。
- HLS的局限性:
HLS更适合于已经有现成的、高质量的C算法代码,这时候急需在FPGA上去映射成硬件,非常高效,但是对于有经验的verilog手写设计者,HLS综合工具有时候用得非常麻烦。设计者明知道一个方案是可行的,但是就想不到如何让HLS把C代码变成自己设想的电路。