Vitis HLS 学习笔记--Syn Report解读(1)

2024-04-27 10:12

本文主要是介绍Vitis HLS 学习笔记--Syn Report解读(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1. 介绍

2. 示例一

2.1 HLS 代码

2.2 Report 解读

2.2.1 General Information

2.2.2 Timing Estimate

2.2.3 Performance & Resource Estimates

2.2.4 HW interfaces

2.2.4.1 硬件接口报告

2.2.4.2 导出至 Vivado 中的 IP

2.2.4.3 Port-Level Protocols 端口级协议

2.2.4.4 Block Level Control 块级控制协议

2.2.5 SW I/O Information

2.2.6 Bind Op Report

2.2.7 Bind Storage Report

3. 示例二

3.1 HLS 代码

3.2 Report 解读

3.2.1 HW interfaces

3.2.1.1 硬件接口报告

3.2.1.2 导出至 Vivado 中的 IP

3.2.2 SW I/O Information

3.2.3 Pragma Report

4. 示例三

4.1 HLS 代码

4.2 Report 解读

4.2.1 HW interfaces

4.2.1.1 硬件接口报告

 4.2.1.2 导出至 Vivado 中的 IP

4.2.1.3 Block Level Control 块级控制协议

4.2.2 Pragma Report

5. 总结


1. 介绍

综合报告是Vitis HLS工具链中一个关键的输出,它为开发者提供了关于其HLS设计的重要信息,包括时序估计、性能和资源使用情况、硬件接口细节以及软件到硬件的映射信息。

本文通过三个简单的示例,详细解读这些报告,以便更好地理解 Vitis HLS 工具的输出,并利用这些信息来优化和调试硬件设计。

2. 示例一

2.1 HLS 代码

#include <ap_int.h>void func(ap_fixed<1,1> *led_o, char reg_in)
{if(reg_in == 'o')*led_o = 1;else*led_o = 0;
}

这段代码的功能非常简单,根据输入字符(reg_in)来控制一个LED的开关状态。如果输入是'o',则LED打开;否则,LED关闭。

func 函数接受两个参数:

  • reg_in:一个char类型的变量,用来接收控制指令。
  • led_o:一个ap_fixed<1,1>指针,用法见《Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(1)》。

执行综合后,IDE会自动打开报告,这里介绍两种进入报告的途径。

方法一:

方法二:

第二种方法可以打开文本的报告,比较方便复制。以下的内容从文本报告中复制。

2.2 Report 解读

2.2.1 General Information

+ General Information: * Date:           Fri Apr 10 12:00:50 2022* Version:        2022.1 (Build 3526262 on Mon Apr 18 15:47:01 MDT 2022)* Project:        example* Solution:       solution1 (Vivado IP Flow Target)* Product family: zynquplus* Target device:  xck26-sfvc784-2LV-c

2.2.2 Timing Estimate

+ Timing: * Summary: +--------+----------+----------+------------+|  Clock |  Target  | Estimated| Uncertainty|+--------+----------+----------+------------+|ap_clk  |  10.00 ns|  0.849 ns|     2.70 ns|+--------+----------+----------+------------+

 关于Timing的详细解释,请参照下图:

其中,Vitis HLS使用的有效时钟周期,可以理解为Target减去Uncertainty。

2.2.3 Performance & Resource Estimates

+ Performance & Resource Estimates: PS: '+' for module; 'o' for loop; '*' for dataflow+--------+------+------+---------+--------+----------+---------+------+----------+------+----+---+----------+-----+| Modules| Issue|      | Latency | Latency| Iteration|         | Trip |          |      |    |   |          |     || & Loops| Type | Slack| (cycles)|  (ns)  |  Latency | Interval| Count| Pipelined| BRAM | DSP| FF|    LUT   | URAM|+--------+------+------+---------+--------+----------+---------+------+----------+------+----+---+----------+-----+|+ func  |     -|  6.45|        0|   0.000|         -|        1|     -|        no|     -|   -|  -|  11 (~0%)|    -|+--------+------+------+---------+--------+----------+---------+------+----------+------+----+---+----------+-----+

2.2.4 HW interfaces

2.2.4.1 硬件接口报告
================================================================
== HW Interfaces
================================================================
* REGISTER
+-----------+---------+----------+
| Interface | Mode    | Bitwidth |
+-----------+---------+----------+
| led_o     | ap_none | 1        |
| reg_in    | ap_none | 8        |
+-----------+---------+----------+* TOP LEVEL CONTROL
+-----------+------------+-----------------------------------+
| Interface | Type       | Ports                             |
+-----------+------------+-----------------------------------+
| ap_ctrl   | ap_ctrl_hs | ap_done ap_idle ap_ready ap_start |
+-----------+------------+-----------------------------------+
2.2.4.2 导出至 Vivado 中的 IP

默认块级协议为ap_ctrl_hs,故生成的Vivado IP包含ap_ctrl端口。

2.2.4.3 Port-Level Protocols 端口级协议

端口级协议,即 func 函数的参数:

  • reg_in(标量类型),作为输入,默认是ap_none协议
  • led_o(指针类型),作为输出,默认是ap_vld协议,故包含led_o_ap_vld信号
2.2.4.4 Block Level Control 块级控制协议

Top/Block Level Control:块级控制协议,或者顶层控制协议,也即顶层 func 函数 return 控制的部分。

其modes有四个选项:

  • ap: access protocolhs: handshake
  • 对于控制驱动的 TLP,ap_ctrl_chain 协议和 ap_ctrl_hs 协议支持顺序执行和流水打拍执行。
  • 对于数据驱动的 TLP,ap_ctrl_none 是必需的控制协议。
  • ap_ctrl_hs 控制协议与 ap_ctrl_chain 具有相同信号,但它将 ap_continue 信号设为 1 以保持高电平。此控制协议支持顺序执行模式和流水打拍执行模式,但不提供来自下游设计模块的反压以控制数据流动。
  • ap_ctrl_none 同样与 ap_ctrl_chain 具有相同信号,但握手信号端口(ap_start、ap_idle、ap_ready 和ap_done)设为高电平并且会被优化掉(不综合成硬件)。

ap_ctrl_chain 接口的行为:

2.2.5 SW I/O Information

================================================================
== SW I/O Information
================================================================
* Top Function Arguments
+----------+-----------+-------------------------------------+
| Argument | Direction | Datatype                            |
+----------+-----------+-------------------------------------+
| led_o    | out       | ap_fixed<1, 1, AP_TRN, AP_WRAP, 0>* |
| reg_in   | in        | char                                |
+----------+-----------+-------------------------------------+* SW-to-HW Mapping
+----------+--------------+---------+
| Argument | HW Interface | HW Type |
+----------+--------------+---------+
| led_o    | led_o        | port    |
| led_o    | led_o_ap_vld | port    |
| reg_in   | reg_in       | port    |
+----------+--------------+---------+

软件 I/O 信息,显示顶层函数实参:

  • 方向信息,输入或者输出
  • 参数类型

2.2.6 Bind Op Report

此例不涉及此报告。

2.2.7 Bind Storage Report

此例不涉及此报告。

3. 示例二

3.1 HLS 代码

void basic_interface(ap_fixed<1,1> *led_o, char reg_in)
{
#pragma HLS INTERFACE mode=s_axilite bundle=BUS_A port=reg_inif(reg_in == 'o')*led_o = 1;else*led_o = 0;
}

指令 #pragma HLS INTERFACE mode=s_axilite bundle=BUS_A port=reg_in 的作用:

  • 指定 port=reg_in 端口级控制协议为 s_axilite
  • 指定接口命名为 BUS_A

3.2 Report 解读

对于重复报告内容不再分析,重点对比与示例一的差异。

3.2.1 HW interfaces

3.2.1.1 硬件接口报告
================================================================
== HW Interfaces
================================================================
* S_AXILITE Interfaces
+-------------+------------+---------------+--------+----------+
| Interface   | Data Width | Address Width | Offset | Register |
+-------------+------------+---------------+--------+----------+
| s_axi_BUS_A | 32         | 5             | 16     | 0        |
+-------------+------------+---------------+--------+----------+* S_AXILITE Registers
+-------------+----------+--------+-------+--------+-----------------------+
| Interface   | Register | Offset | Width | Access | Description           |
+-------------+----------+--------+-------+--------+-----------------------+
| s_axi_BUS_A | reg_in   | 0x10   | 32    | W      | Data signal of reg_in |
+-------------+----------+--------+-------+--------+-----------------------+* REGISTER
+-----------+---------+----------+
| Interface | Mode    | Bitwidth |
+-----------+---------+----------+
| led_o     | ap_none | 1        |
+-----------+---------+----------+* TOP LEVEL CONTROL
+-----------+------------+-----------------------------------+
| Interface | Type       | Ports                             |
+-----------+------------+-----------------------------------+
| ap_clk    | clock      | ap_clk                            |
| ap_rst_n  | reset      | ap_rst_n                          |
| ap_ctrl   | ap_ctrl_hs | ap_done ap_idle ap_ready ap_start |
+-----------+------------+-----------------------------------+

相比于示例一,增加的内容:

  • S_AXILITE Interfaces
  • S_AXILITE Registers

其中 S_AXILITE Interfaces 和 S_AXILITE Registers  部分参数解释:

  • Data Width: s_axi数据宽度为32位
  • Address Width: 地址宽度是5位,接口寻址的地址空间为2的5次方,即32个不同的地址
  • Offset: 偏移量,16,即0x10
3.2.1.2 导出至 Vivado 中的 IP

与示例一相比:

  • 缺少了 reg_in[7:0] 接口
  • 新增了 s_axi_BUS_A 接口
  • 新增了 ap_clk 和 ap_rst_n 信号

3.2.2 SW I/O Information

================================================================
== SW I/O Information
================================================================
* Top Function Arguments
+----------+-----------+-------------------------------------+
| Argument | Direction | Datatype                            |
+----------+-----------+-------------------------------------+
| led_o    | out       | ap_fixed<1, 1, AP_TRN, AP_WRAP, 0>* |
| reg_in   | in        | char                                |
+----------+-----------+-------------------------------------+* SW-to-HW Mapping
+----------+--------------+----------+----------------------------------+
| Argument | HW Interface | HW Type  | HW Info                          |
+----------+--------------+----------+----------------------------------+
| led_o    | led_o        | port     |                                  |
| led_o    | led_o_ap_vld | port     |                                  |
| reg_in   | s_axi_BUS_A  | register | name=reg_in offset=0x10 range=32 |
+----------+--------------+----------+----------------------------------+

 与示例一相比,reg_in 的 HW Type 由 port 变更为 register,表示 reg_in 不再是一个端口,而是总线 s_axi_BUS_A  的一组寄存器。

3.2.3 Pragma Report

================================================================
== Pragma Report
================================================================
* Valid Pragma Syntax
+-----------+-----------------------------------------+-------------------------------------+
| Type      | Options                                 | Location                            |
+-----------+-----------------------------------------+-------------------------------------+
| interface | mode=s_axilite bundle=BUS_A port=reg_in | mult/src/func.cpp:5 in func, reg_in |
+-----------+-----------------------------------------+-------------------------------------+

生效的自定义端口,汇总在此报告中。

4. 示例三

4.1 HLS 代码

#include <ap_int.h>void func(ap_fixed<1,1> *led_o, char reg_in)
{
#pragma HLS INTERFACE mode=s_axilite bundle=BUS_A port=reg_in
#pragma HLS INTERFACE mode=s_axilite bundle=BUS_A port=returnif(reg_in == 'a')*led_o = 1;else*led_o = 0;
}

 指令 #pragma HLS INTERFACE mode=s_axilite bundle=BUS_A port=return 的作用:

  • 指定 port=return 块级控制协议为 s_axilite
  • 指定接口命名为 BUS_A

4.2 Report 解读

对于重复报告内容不再分析,重点对比与示例一、二的差异。

4.2.1 HW interfaces

4.2.1.1 硬件接口报告
================================================================
== HW Interfaces
================================================================
* S_AXILITE Interfaces
+-------------+------------+---------------+--------+----------+
| Interface   | Data Width | Address Width | Offset | Register |
+-------------+------------+---------------+--------+----------+
| s_axi_BUS_A | 32         | 5             | 16     | 0        |
+-------------+------------+---------------+--------+----------+* S_AXILITE Registers
+-------------+----------+--------+-------+--------+----------------------------------+----------------------------------------------------------------------+
| Interface   | Register | Offset | Width | Access | Description                      | Bit Fields                                                           |
+-------------+----------+--------+-------+--------+----------------------------------+----------------------------------------------------------------------+
| s_axi_BUS_A | CTRL     | 0x00   | 32    | RW     | Control signals                  | 0=AP_START 1=AP_DONE 2=AP_IDLE 3=AP_READY 7=AUTO_RESTART 9=INTERRUPT |
| s_axi_BUS_A | GIER     | 0x04   | 32    | RW     | Global Interrupt Enable Register | 0=Enable                                                             |
| s_axi_BUS_A | IP_IER   | 0x08   | 32    | RW     | IP Interrupt Enable Register     | 0=CHAN0_INT_EN 1=CHAN1_INT_EN                                        |
| s_axi_BUS_A | IP_ISR   | 0x0c   | 32    | RW     | IP Interrupt Status Register     | 0=CHAN0_INT_ST 1=CHAN1_INT_ST                                        |
| s_axi_BUS_A | reg_in   | 0x10   | 32    | W      | Data signal of reg_in            |                                                                      |
+-------------+----------+--------+-------+--------+----------------------------------+----------------------------------------------------------------------+* REGISTER
+-----------+---------+----------+
| Interface | Mode    | Bitwidth |
+-----------+---------+----------+
| led_o     | ap_none | 1        |
+-----------+---------+----------+* TOP LEVEL CONTROL
+-----------+------------+-----------+
| Interface | Type       | Ports     |
+-----------+------------+-----------+
| ap_clk    | clock      | ap_clk    |
| ap_rst_n  | reset      | ap_rst_n  |
| interrupt | interrupt  | interrupt |
| ap_ctrl   | ap_ctrl_hs |           |
+-----------+------------+-----------+
 4.2.1.2 导出至 Vivado 中的 IP

 与示例一相比:

  • 缺少了 reg_in[7:0] 接口
  • 缺少了 ap_ctrl 接口
  • 新增了 s_axi_BUS_A 接口
  • 新增了 ap_clk 和 ap_rst_n 信号
  • 新增了 interrupt 信号

与示例二相比:

  • 缺少了 ap_ctrl 接口
  • 新增了 interrupt 信号
4.2.1.3 Block Level Control 块级控制协议

指令 #pragma HLS INTERFACE mode=s_axilite bundle=BUS_A port=return 指定了块级控制协议为 s_axilite。

* S_AXILITE Registers
+-------------+----------+--------+-------+--------+----------------------------------+----------------------------------------------------------------------+
| Interface   | Register | Offset | Width | Access | Description                      | Bit Fields                                                           |
+-------------+----------+--------+-------+--------+----------------------------------+----------------------------------------------------------------------+
| s_axi_BUS_A | CTRL     | 0x00   | 32    | RW     | Control signals                  | 0=AP_START 1=AP_DONE 2=AP_IDLE 3=AP_READY 7=AUTO_RESTART 9=INTERRUPT |
| s_axi_BUS_A | GIER     | 0x04   | 32    | RW     | Global Interrupt Enable Register | 0=Enable                                                             |
| s_axi_BUS_A | IP_IER   | 0x08   | 32    | RW     | IP Interrupt Enable Register     | 0=CHAN0_INT_EN 1=CHAN1_INT_EN                                        |
| s_axi_BUS_A | IP_ISR   | 0x0c   | 32    | RW     | IP Interrupt Status Register     | 0=CHAN0_INT_ST 1=CHAN1_INT_ST                                        |
| s_axi_BUS_A | reg_in   | 0x10   | 32    | W      | Data signal of reg_in            |                                                                      |
+-------------+----------+--------+-------+--------+----------------------------------+----------------------------------------------------------------------+

与示例二相比,新增了几组寄存器:

  • CTRL,Control signals
  • GIER,Global Interrupt Enable Register
  • IP_IER,IP Interrupt Enable Register
  • IP_ISR,IP Interrupt Enable Register

这些寄存器的作用,后续博文单独详解。

4.2.2 Pragma Report

================================================================
== Pragma Report
================================================================
* Valid Pragma Syntax
+-----------+-----------------------------------------+-------------------------------------+
| Type      | Options                                 | Location                            |
+-----------+-----------------------------------------+-------------------------------------+
| interface | mode=s_axilite bundle=BUS_A port=reg_in | mult/src/func.cpp:5 in func, reg_in |
| interface | mode=s_axilite bundle=BUS_A port=return | mult/src/func.cpp:6 in func, return |
+-----------+-----------------------------------------+-------------------------------------+

生效的自定义端口,汇总在此报告中。

5. 总结

在本文中,通过三个不同的示例,我们深入探讨了Vitis HLS IDE的综合报告(Synthesis Report),并详细解读了其中的关键部分:

示例一

  • 功能:展示了一个基本的HLS代码,该代码根据输入字符控制LED的开关状态。
  • 报告解读:
    • General Information:提供了综合环境的基本信息,如日期、版本、项目名称等。
    • Timing Estimate:展示了时钟周期的估计,包括目标时钟周期、估计时钟周期和不确定性。
    • Performance & Resource Estimates:提供了性能和资源使用的估计,如模块的发行类型、延迟、流水线间隔等。
    • HW interfaces:描述了硬件接口的详细信息,包括寄存器模式和顶层控制信号。
    • SW I/O Information:展示了软件到硬件的映射信息,包括函数参数的方向、数据类型和硬件接口类型。

示例二

  • 功能增强:通过添加#pragma HLS INTERFACE指令,指定了端口级控制协议为s_axilite,并将端口命名为BUS_A
  • 报告差异:
    • 引入了S_AXILITE InterfacesS_AXILITE Registers,提供了关于AXI Lite接口的详细信息,包括数据宽度、地址宽度、偏移量和寄存器。
    • SW-to-HW Mapping:展示了reg_in参数现在映射到AXI Lite接口的寄存器上。

示例三

  • 功能增强:进一步通过#pragma HLS INTERFACE指令,将块级控制协议也设置为s_axilite,并通过port=return指定了返回值的接口。
  • 报告差异:
    • 新增了中断信号和相关的控制寄存器,如CTRLGIERIP_IERIP_ISR,这些寄存器用于控制信号、全局中断使能、IP中断使能和IP中断状态。
    • TOP LEVEL CONTROL:现在包括了中断信号,表明设计支持中断功能。

通过这三个示例,我们学习了如何在Vitis HLS中使用端口级和块级控制协议来定制硬件接口,并通过综合报告来验证这些自定义设置。这些自定义设置对于FPGA逻辑交互至关重要,因为它们定义了数据和控制信号的交互方式。 可以看到Vitis HLS提供了强大的工具来帮助设计者理解、定制和优化他们的HLS设计,从而在硬件实现中达到预期的性能和功能。

这篇关于Vitis HLS 学习笔记--Syn Report解读(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940221

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]