Vitis HLS 2022.1:如何阅读C Synthesis生成报告
相比于Vivado HLS,Vitis HLS在C Synthesis之后生成的报告内容更加丰富,更有利于工程师对设计进行分析。这里我们以Vitis HLS 2022.1为例,看看C Synthesis之后的报告都包含哪些内容。
总体而言,整个报告由8部分构成,如下图所示。Vivado HLS通常只包含前五部分内容。其中General Information部分呈现project名称、solution名称和具体的芯片型号。Timing Estimate部分则展示了目标时钟周期和预估时钟周期。
Performance & Resource Estimates是报告的重点部分之一,具体内容如下图所示。从Performance角度看,显示了每个子模块/循环的Latency以及整个设计的Latency,如图中桔色方框所示。同样也显示了相应的II(Initial Interval),如图中红色方框所示。对于循环,还能看到循环次数(Trip Count),如图中蓝色方块所示。无论是函数还是循环,是否使用了Pipeline,会以no或yes来表示,如图中绿色方框所示。从Resource角度看,报告会呈现主要资源如BRAM/URAM、DSP、LUT和FF的使用量,如图中紫色部分所示。
如果C Synthesis之后,无论是Performance还是Area未能达到预期目标,工具会给出违例类型,如下图红色方框所示出现了II违例。
Performance & Resource Estimates报告中的资源利用量是预估值,与RTL综合后的结果相比,有时会有较大出入。例如,上图中显示LUT的用量为33k,而RTL综合之后的报告显示只有6k,如下图所示。造成这种偏差的一个主要原因是Vivado在进行RTL代码综合时会进一步对设计进行优化,从而降低了资源利用率。
HW Interfaces会显示生成的RTL代码顶层对外接口,包括顶层控制接口,如ap_rst、ap_start、ap_done、ap_ready等,如下图所示。
SW I/O Information部分除了显示顶层C函数的形参信息外,还会显示形参与生成的RTL代码输入/输出的对应关系,如下图所示。
Pragma Report则会显示设计中使用并生效的Pragma,如下图所示。这对判断Pragma对设计性能和资源的影响非常有利。对于未生效的Pragma,也会在这部分以Ignored Pragmas列表显示。此外,有些Pragma尽管生效,但会有警告生成,这样就会以Pragmas With Warnings列表形式显示。
Bind Op Report则会显示设计中的一些算术运算、涉及到浮点数的运算以及消耗DSP的运算的实现形式,如下图所示。图中op列表明运算类型,Impl列表明实现方式,这里的fabric就说明使用的是SLICE里的资源实现的,Latency列则体现该运算输入到输出的时钟周期个数。从这个报告中包含Op的每一行都可以到C源文件中,这样就可以清晰地看到Op与原始C代码的对应关系。
Bind Storage Report则会显示设计中的数组在转成RTL代码后的具体实现方式,是采用LUTRAM、BRAM还是URAM。
总体而言,Vitis HLS的报告内容比Vivado HLS更为丰富,信息更为全面,例如不仅有生成RTL代码的输入/输出接口,而且还有顶层C函数形参与之的映射关系。同时,从报告可以直接到C代码,直观地体现了报告内容与C代码的对应关系。
Copyright @ FPGA技术驿站
转载事宜请私信 | 获得授权后方可转载
相关文章
- ☕【Java深层系列】「并发编程系列」让我们一起探索一下CyclicBarrier的技术原理和源码分析
- ☕【Java实战系列】「技术盲区」Double与Float的坑与解决办法以及BigDecimal的取而代之!
- ☕【Java深层系列】「技术盲区」让我们一起去挑战一下如何读取一个较大或者超大的文件数据!
- 【分布式技术专题】「OSS中间件系列」Minio的文件服务的存储模型及整合Java客户端访问的实战指南
- ☕【Java深层系列】「技术盲区」让我们一起完全吃透针对于时间和日期相关的API指南
- 🏆【JVM深层系列】「云原生时代的Java虚拟机」针对于GraalVM的技术知识脉络的重塑和探究
- ☕【Java技术指南】「序列化系列」深入挖掘FST快速序列化压缩内存的利器的特性和原理
- 【Java技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路
- ☕【Java技术指南】「技术盲区」看看线程以及线程池的异常处理机制都有哪些?
- ☕【Java技术指南】「编译器专题」深入分析探究“静态编译器”(JAVA\IDEA\ECJ编译器)是否可以实现代码优化?
- ☕【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了!
- ☕【Java技术指南】「并发编程专题」Fork/Join框架基本使用和原理探究(原理及源码篇)
- Java技术开发专题系列之【Guava RateLimiter】针对于限流器的入门到精通(针对于源码分析介绍)
- ☕【Java技术指南】「并发编程专题」针对于Guava RateLimiter限流器的入门到精通(含实战开发技巧)
- ☕【JVM技术指南】「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"【下部】
- ☕【JVM技术指南】「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"【上部】
- ☕【Java技术指南】「并发编程专题」CompletionService框架基本使用和原理探究(基础篇)
- ☕【Java技术指南】「并发编程专题」Fork/Join框架基本使用和原理探究(基础篇)
- ☕【Java技术指南】「难点-核心-遗漏」Java线程状态流转及生命周期的技术指南(知识点串烧)!
- 挂钩 NtCreateThreadEx 导致 0xC00000F2 问题