1. Vivado HLS Design Flow

最终生成的文件中大体包含如下三部分内容:IP Catalog、DCP(Design Check Point) 以及 SysGen。

对于 HLS 只允许有一个 top-level function

一般 HLS 生成的结构与 C 语言中函数的结构基本是一致的,但也有例外,默认情况下,如果函数内容逻辑非常简单,那么 HLS 在生成时可能会进行 Inline 处理来优化函数结构,将其提取出来不单独视为一个 function。为了避免这种情况,可以通过修改 Directive 禁止这种 Inline 处理。

并不是所有的 C 语言程序都是 allowed Synthesis,当程序中出现 Dynamic memory allocation 或者其中有 Operation system operations 时程序是不能够被 Synthesis 的。前者需要编译器支持,后者需要系统库支持。

2. Directives

有两种保存 Directives 设置的方式,一种是直接在源码中进行修改(下图右侧所示),另一个种是存放在单独的文件中。

这里注意,如下图所示,如果在 GUI 中这个 Directive 前面符号是%,那么这个 Directive 就是存放在单独的 directive 文件里面,以 set_directive_xxx tcl command 形式存放。如果是#, 说明是存放在相应的 source code 里面。

下面是这两种保存方式的优缺点,推荐是采用第一种即放在单独的 directive files 中,大多数情况下我们都会创建多个 solution 来进行优化性能对比,每个 solution 调取对应的 directives,这样更直观简洁。当然如果确定需要进行迁移或者分享的话,便采用第二种。

3. Example

下图展示的是一个数组加法的例子,列出了函数形参 Synthesized 后生成的接口,其他提到了 Block-level IO Handshake 这一类型,后面课程会具体展开讲。

4. Summary

总结以下推荐的 Coding Style:

  1. 为每一个 for-loop 创建一个 label 方便后期设置 directives 优化;
  2. directive files 放在独立的文件夹中;
  3. main() 函数结果为真的返回值应该是 0,其余为 1;