1. History of ESL

从 EDA 到 ESL,设计变得越来越方便也越来越抽象。如下图框中文字所说的,适当的抽象增加对系统的理解,开发功能的效率也会有一定提升。

Xilinx 有两种形式支持抽象开发:HLS 和 System Generator。前者使用高级语言如 C/C++,后者则是使用模型设计工具。

2. High-level Synthesis Benefits

对于硬件工程师而言,采用 VHDL/VerilogHDL 语言进行开发,主要精力都会放在实现并行性和时序设计上。就比如汇编语言开发时,大部分精力都会放在寻址和访存上。而在进行算法功能模块开发时,更倾向于将精力放在算法设计,优化和验证上,底层并行实现和时序设计更希望能有相应的工具来对应完成。因此,对于 hardware designers 而言 HLS 可以减少功能模块实现所占用的精力,提高生产力,同样,对于 software designers 而言将算法模块使用 FPGA 实现可以提升运行效率(三个方面:并行性、吞吐率、功耗)。

第 4 条需要注意的是,HLS 中是使用 C/C++ 编写程序的同时,也需要使用 C/C++ 编写相应的测试脚本。这主要是因为 HLS 生成的 RTL 程序可读性很差,因此我们只能是在 C/C++ 层面进行优化调整,同时编写激励进行测试验证。

第 5 条是 HLS 开发的重点,根据需要调整 optimization directives。简单理解就是,HLS 将 C/C++ 编写的程序生成 RTL 之后,会有很多地方需要进行调整优化,如 for 循环调整为并行或者 Pipeline 。这也需要 HLS 设计者对 FPGA 开发也有一定的功底。

3. Phases of High-level Synthesis in Vivado HLS

转换过程分为两个阶段:Scheduling/Control Logic Extraction、Binding

Scheduling/Control Logic Extraction 完成的是每个时钟周期该做什么样的工作,以及用几个时钟周期来完成,一些操作是否可以并行来执行。控制逻辑的提取通常会生成一个状态机。

Binding 负责管理每个操作需要用什么样的资源去实现,完成这种映射。

Vivado HLS 实际上是通过 FSM 去控制算法或者程序的状态变化。

a. Scheduling and Bind Example

下图示例比较简单,编写的代码在右侧分别执行了 Scheduling 和 Binding,乘法最后映射为了 DPS48。

注意,foo 函数执行的操作只用一个控制状态 C0,而并不是说其只使用了一个时钟周期。另外从 Operation 中可以看到对于变量执行的操作以及变量的读写状态(read/write)。

b. Control Logic Extraction Example

对于循环,一般需要多个状态,形成一个有限状态机,下图示例使用了 4 个状态,需要注意的是,HLS 的控制状态和最后生成的 RTL FSM 状态并不是一一对应的,只是二者之间有紧密的关系。

数组按位相加的示例(左侧流程图最后一步写错了,应该是 Write C[i][j])。由算法流程图可以很清晰地推断出 HLS 生成状态的变化,辅助我们进行理解和优化。

另外可以看到 for 循环 有一个 row 和 col 关键字或标记,这种语法是 HLS 支持的,课程后面会提到其作用。

4. Summary

注意 control states 只是为了 schedule operations into clock cycles,和 RTL FSM 的 final states 没有一一对应关系,只是关系很紧密。