HLS 基础 (一 HLS开发流程)

HLS简介

image-20220512214549181

HLS包含库

image-20220512214632426

image-20220512214646308

Vivado HLS接口

image-20220512214737283

模块控制

image-20220512214826743

image-20220512215727296

image-20220512215742343

​ 我们可以看到,ap_ctrl_none无控制信号,ap_ctrl_hs则多出了startdoneidleready信号,ap_ctrl_chain则在ap_ctrl_hs的基础上多了continue信号。

hls中,ap_ctrl_hs为该接口的默认值,在使用中,需要将start置高,如图:

image-20220512220214844

可以看出,选择默认ap_ctrl_hs,使用起来比较麻烦,所以不需要控制信号的情况下,一般将其指定为ap_ctrl_none

HLS(High-level synthesis)包括以下阶段:

  • 时序安排(Scheduling)

    根据以下内容确定每个时钟周期内发生的操作:

    • 时钟周期或时钟频率的长度;

    • 根据目标设备的定义,完成操作所需的时间;

    • 用户指定的优化指令;

      ​ 如果时钟周期更长或目标是更快的FPGA,则在单个时钟周期内完成更多操作,并且所有操作可能在一个时钟周期内完成。相反,如果时钟周期较短或目标是较慢的FPGA,则高级合成会自动在更多时钟周期上调度操作,并且一些操作可能需要作为多周期资源来实现。

  • 约束(Binding)

    确定实现每个计划操作的硬件资源。为了实现最佳解决方案,高级合成使用有关目标设备的信息。

  • 控制逻辑提取(Control logic extraction)

    提取控制逻辑以创建一个有限状态机(FSM),该状态机对RTL设计中的操作进行排序。

HLS高级合成按如下方式合成C代码:

  • 顶级函数(Top-level function)参数合成为RTL I/O端口 ;

  • C函数在RTL层次结构中合成为块 ;

    ​ 如果C代码包含子功能(sub-functions)的层次结构,则最终的RTL设计包含与原始C功能层次结构一一对应的模块或实体的层次结构。一个函数的所有实例都使用相同的RTL实现或块。

  • 默认情况下,C函数中的循环保持滚动

Scheduling and Binding Example

The following figure shows an example of the scheduling and binding phases for this code example:

int foo(char x, char a, char b, char c) {
    char y;
    y = x*a+b+c;
    return y;
}

image-20220507225952838

在本例的调度阶段,高级综合将在每个时钟周期中安排以下操作:

  • 第一个时钟周期:乘法和第一次加法

  • 第二个时钟周期:第二次加法和输出生成

在最终的硬件实现中,高级综合将顶级函数的参数实现为输入和输出(I/O)端口。在本例中,参数是简单的数据端口。因为每个输入变量都是字符类型,所以输入数据端口都是8位宽。函数返回为32位int数据类型,输出数据端口为32位宽。

在本例的初始绑定阶段,HLS高级合成使用组合乘法器(Mul)实现乘法器操作,并使用组合加法器/减法器(AddSub)实现两个加法操作。

在目标绑定阶段,HLS高级合成使用DSP48资源实现乘法器和一个加法操作。DSP48资源是FPGA体系结构中可用的计算块,它提供了高性能和高效实现的理想平衡。

Extracting Control Logic and Implementing I/O Ports Example

下图显示了此代码示例的控制逻辑提取和I/O端口实现:

void foo(int in[3], char a, char b, char c, int out[3]) {
    int x,y;
    for(int i = 0; i < 3; i++) {
        x = in[i];
        y = a*x + b + c;
        out[i] = y;
    }
}

image-20220507231026283

Understanding Vivado HLS

Xilinx Vivado HLS工具将C函数合成一个IP块,您可以将其集成到硬件系统中。它与其他Xilinx设计工具紧密集成,并提供全面的语言支持和功能,为您的C算法创建最佳实现。

以下是Vivado HLS的设计流程:

​ 1.编译、执行(模拟)和调试C算法。

​ 2.将C算法合成为RTL实现,可以选择使用用户优化指令。

​ 3.生成综合报告并分析设计。

​ 4.使用按钮流验证RTL实现。

​ 5.将RTL实现打包成一系列IP格式。

注:在高级综合中,运行编译好的C程序被称为C模拟。执行C算法模拟函数,以验证算法在功能上是否正确。

Inputs and Outputs

以下是Vivado®HLS输入:

  • C function written in C, C++, or SystemC

    这是Vivado HLS的主要输入。该函数可以包含子函数的层次结构。

  • Constraints

    需要约束,包括时钟周期、时钟不确定性和FPGA目标。如果未指定,时钟不确定性默认为时钟周期的12.5%。

  • 指令 (Directives)

    指令是可选的,用于指导合成过程实现特定的行为或优化。

  • C测试台和任何相关文件(C test bench and any associated files)

    Vivado HLS使用C测试台在合成前模拟C功能,并使用C/RTL协同模拟验证RTL输出。

可以使用Vivado HLS图形用户界面(GUI)或在命令提示符下使用Tcl命令,以交互方式将C输入文件、指令和约束添加到Vivado HLS项目。您还可以创建Tcl文件,并以批处理模式执行命令。

以下是Vivado HLS的输出:

  • 硬件描述语言(HDL)格式的RTL实现文件(RTL implementation files)

    这是Vivado HLS的主要输出。使用Vivado synthesis,可以将RTL合成为门级实现和FPGA位流文件( gate-level implementation and an FPGA bitstream file)。RTL有以下行业标准格式:

    ○ VHDL(IEEE 1076-2000)

    ○ Verilog(IEEE 1364-2001)

    Vivado HLS将实现文件打包为IP块,以便与Xilinx®设计流程中的其他工具一起使用。使用逻辑合成,可以将打包的IP合成为FPGA比特流(FPGA bitstream.)。

  • 报告文件

    该输出是合成、C/RTL联合模拟和IP封装的结果。

下图显示了Vivado HLS输入和输出文件的概述。

image-20220507232629611

Test Bench

在使用Vivado®HLS设计流程时,合成一个功能不正确的C function,然后分析实现细节,以确定该函数无法按预期执行的原因,这非常耗时。为了提高生产率,在合成之前,使用( test bench)测试台来验证C function在功能上是否正确。

C测试台包括函数main()和顶层合成函数下不在层次结构中的任何子函数。这些函数通过向合成函数提供刺激并消耗其输出来验证合成顶层函数在功能上的正确性。

Vivado HLS使用 test bench编译和执行C simulation。在编译过程中,可以选择Launch Debugger选项来打开完整的C-debug环境,这使您能够分析C模拟。

image-20220507233334171

image-20220507233520883

image-20220507234058827

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lk
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信