An Introduction to High-Level Synthesis
目录
steps
- compiles the specification,
- allocates hardware resources (functional units,
storage components, buses, and so on), - schedules the operations to clock cycles,
- binds the operations to functional units,
- binds variables to storage elements,
- binds transfers to buses, and
- generates the RTL architecture.
2-6是相互依赖的,但通常按顺序执行,以管理合成的计算复杂性。
1、编译和建模
将输入描述变成正式表示,包括代码优化:死代码消除、虚假数据依赖消除、不断折叠和循环转换
formal model 展示了操作之间的数据和控制依赖关系
数据依赖关系表示
- DFG(数据流图):每个节点代表一个操作,节点之间的弧线代表输入、输出和临时变量。(removing the control dependency,loops are unrolled)
- CDFG(控制和数据流图):CDFG 是一个有向图,其中的边表示控制流。 CDFG 中的节点通常被称为基本块(basic blocks),并被定义为不包含分支或内部入口或出口点的直线语句序列。 边可以有条件地表示 if 和 switch 结构。 CDFG 展示基本块内的数据依赖关系,并捕获这些基本块之间的控制流。可以表示无限迭代的循环。BB之间可能的并行关系要通过转换(loop unrolling, loop pipelining,loop merging, loop tiling)实现。
2、分配
决定满足设计约束所需的硬件资源(例如功能单元、存储或连接组件)的类型和数量。RTL组件库中包含组件及其特性。
3、调度
所有操作都必须调度到周期中,
a+b=c
从源中读取a,b,放到可执行单元中操作,得到c,存入存储单元(或目的寄存器)。
根据操作映射到的功能组件,操作可以在一个时钟周期内调度或在多个周期内调度。
4、绑定
每个变量要绑定到存储单元,每个操作都必须绑定到能够执行该操作的功能单元之一。
一旦在前面的分配、调度和绑定任务中做出了决策,RTL体系结构生成步骤的目标就是应用所有做出的设计决策并生成综合设计的RTL模型。
架构
典型的体系结构如图所示,由控制器和数据路径(存储元件+功能单元+互连)组成。设计接口的主要输入和输出端口与外部世界传输数据和控制(用于接口协议握手和同步)。 数据输入和输出连接到数据路径,控制输入和输出连接到控制器。 还有从控制器到数据路径的控制信号和从数据路径到控制器的状态信号。
控制器:有限状态机,通过设置控制信号的值来协调数据路径中的数据流
输出模型
根据binding编写不同级别的体系结构的描述
当 RTL 描述仅包括资源的部分绑定时,HLS 之后的逻辑综合步骤必须执行绑定任务和相关的优化。
设计流程
设计流程的实现顺序取决于设计约束和工具的目标。例如,当调度试图最小化延迟或在资源限制下最大化吞吐量时,将首先执行分配。当调度试图最小化时序约束下的面积时,分配将在调度期间确定。当设计人员想要定义数据路径架构 或想要使用有限数量的可用资源时考虑资源受限。当目标是减少电路面积同时满足应用程序的吞吐量要求时,考虑时序约束。
在实践中,资源受限的问题可以通过使用时序约束的方法来解决(反之亦然)。在这种情况下,设计者会放松计时限制,直到所提供的电路面积可接受为止。延迟、吞吐量、资源计数和面积现在是众所周知的约束和目标。然而,最近的研究考虑了时钟周期、内存带宽、内存映射、功耗等特性,这使得合成问题更难解决。合成任务如何排序的另一个例子涉及分配和绑定步骤。分配任务中确定的资源类型和数量将作为绑定任务的输入。然而,在实际的HLS工具中,资源通常只分配了一部分。额外资源在绑定步骤期间根据设计约束和目标进行分配。这些附加资源可以是任何类型:功能单元、多路复用器或寄存器。因此,可以首先分配功能单元来调度和绑定操作。然后可以在变量到寄存器绑定步骤期间分配(创建)寄存器和多路复用器。合成任务可以手动或自动执行。显然,许多策略都是可能的,例如可用的 EDA 工具:这些工具可能仅以自动方式部分执行上述每一项任务,而将其余的留给设计人员。
HLS tools
设计人员不是对低级实现细节进行编码,而是使用HLS工具提供的自动化来指导设计决策,这在很大程度上取决于性能目标和目标技术。
语言:ANSI C、C++、System C及其他针对特定领域的语言(Esterl是一种用于反应系统开发的同步语言。EsterlStudio可以生成软件或硬件。luespec的BSV是指定与基于规则的原子事务并发的语言。)
HLS工具的输入规范必须在编写时考虑到一些硬件实现,以获得最佳结果。
Catapult C synthesis
- 综合输入:连续的,不包含任何时间或显式并行的概念:它不硬编码接口或设计的架构。可选指令控制接口合成、阵列到内存的映射、通过循环展开、循环流水线、硬件层次结构和块通信、调度(延迟或周期)约束、用于约束硬件资源数量或类型的分配指令来揭示的并行量等。生成的RTL反映bit-accurate behaviour
- 从ANSI C或C++生成硬件:保持源代码不受限制的优点一可以在不更改输入源规范的情况下生成非常广泛的接口和体系结构。二避免了由于对体系结构细节进行手动编码而导致的错误。生成的硬件的接口和体系结构都由设计者通过合成指令进行控制。Catapult的GUI提供了一个交互式环境,其中包含控制和分析工具,以实现对设计空间的有效探索。接口合成使得可以把通过C++函数参数所暗示的数据的传输映射到各种硬件接口,例如线、寄存器、存储器、总线或更复杂的用户定义接口。在合成过程中生成所有必要的信号和时序约束,以便生成的RTL符合并优化到所需的接口。
- Verification and power estimation flows:自动生成验证基础设施至关重要,因为生成的硬件的接口在很大程度上取决于接口合成。使用第三方工具的功率估计流可以让设计师收集设计的开关活动,并获得RTL和门级功率估计。通过探索各种体系结构,设计师可以快速收敛到满足所需性能和面积目标的低功耗设计。
Cynthesizer SystemC synthesis
Cynthesizer采用包含层次结构、多进程、接口协议和算法的SystemC模块,并生成针对特定目标技术和时钟速度优化的RTLVerilog。目标技术由用户提供的. lib文件指定,或者对于FPGA实现,由用户识别目标Xilinx或Altera部件指定。
- 综合输入:与Cynthesizer一起使用的HLS流的输入是一个引脚和协议精确的SystemC模型。因为SystemC是C++类库,所以不需要语言转换来重用C++编写的算法。可合成子集相当广泛,包括类和结构、运算符重载和C++模板特化。
- 针对特定的工艺技术:为了确保合成的 RTL 使用特定的代工厂和工艺技术在给定的时钟速率下满足时序要求,HLS 工具需要准确估计每个操作的时序特性。 Cynthesizer 使用内部数据路径优化引擎来创建门级加法器、乘法器等库。对于特定的工艺技术和时钟速度,这需要几个小时,并且可以由设计人员在给定任何库文件的情况下执行。 Cynthesizer 使用这些组件的时序和面积特性来进行权衡和优化 RTL。
- 综合输出:RTL 由一个 FSM 和一组显式实例化的数据路径组件组成,例如乘法器、加法器和多路复用器。 自动创建实现设计中使用的算术表达式的更复杂的自定义数据路径组件,并且设计人员可以指定要实现的 C++ 代码部分作为数据路径组件。 通过数据路径组件和寄存器引导数据流的多路复用器由传统的 FSM 控制,该 FSM 由二进制编码或单热状态寄存器和在 Verilog 中实现的下一状态逻辑始终块组成。
System C 的优势
SystemC非常适合HLS,因为它支持高级抽象,并且可以直接描述硬件。它将C++的高级和面向对象特性与硬件结构相结合,使设计人员可以直接表示结构层次、信号、端口、时钟边等。这种特性的组合提供了一种非常有效的设计和验证流程,其中多个模块的行为模型可以被同时模拟以验证它们的组合算法和接口行为。在这种高速行为级别可以找到并消除大多数功能错误,这消除了验证接口和系统级操作的耗时RTL仿真的需要,并且大大减少了所需的慢速RTL仿真的总体数量。一旦行为在功能上正确,模拟的模型将直接用于合成,消除错误或误解的机会。