HLS介绍 - 05 - 软件仿真

简介: HLS介绍 - 05 - 软件仿真

写在前面


本文参考xilinx的UG998的第七章,主要介绍了关于仿真测试平台的相关内容,以及在HLS中无法进行验证的相关情况的说明。

Testbench


类似在FPGA开发平台的testbench,这里只需要进行编写main函数进行测试hls综合的目标函数,在HLS可以进行C仿真还有C和RTL联合仿真。

image.png

软件测试平台


任何HLS生成模块的验证都需要软件测试台。软件测试台具有以下重要功能:

  • 证明针对FPGA实现的软件运行且不产生分段故障
  • 证明算法的功能正确性

分段错误在HLS中是一个问题,就像在任何其他编译器中一样。但是,在如何检测导致问题的编码错误方面存在差异。在基于处理器的执行中,分段错误是由程序试图访问处理器未知的内存位置引起的。此错误最常见的原因是,在分配内存并将其连接到指针之前,用户程序试图访问内存中与指针地址关联的位置。基于以下事件序列,在运行时检测此错误相对简单:

  • 处理器检测到内存访问冲突并通知操作系统(OS)。
  • 操作系统向导致错误的程序或进程发送信号。
  • 在接收到来自操作系统的错误信号后,程序终止并生成一个内核转储文件以供分析。

在HLS生成的实现中,很难检测分段故障,因为没有处理器,也没有操作系统监视程序执行。分段故障的唯一指示器是电路产生的不正确结果值的出现。 仅此一项不足以确定分段故障的根本原因,因为存在多个问题可能会触发错误的结果计算。

软件测试台的另一个目的是验证针对FPGA执行的算法的功能正确性。对于生成的硬件实现,HLS编译器仅保证与原始C/C++代码的功能等价性。因此,需要有一个良好的软件测试平台,以尽量减少硬件验证和确认的工作量。

一个好的软件测试平台的特点是在一个算法的软件实现上执行数千或数百万个数据集测试。这使得设计者能够高度自信地断言算法被正确捕获。然而,即使有许多测试向量,在FPGA设计的硬件验证期间,有时仍可能检测HLS生成输出中的错误。在硬件验证期间检测功能错误意味着软件测试台不完整。将有问题的测试向量应用于C/C++执行会揭示算法中的错误语句。

Co-Simulation


用于C/C++程序分析和功能测试的工具捕获了影响HLS实现的大多数问题。但是,这些工具无法验证顺序C/C++程序在并行化后是否保持功能正确性。该问题在HLS编译器中通过协同仿真过程得到解决。

协同仿真是由软件仿真过程中使用的相同C/C++测试平台执行生成的FPGA实现的过程。HLS以对用户透明的方式处理C/C++测试台和生成的RTL之间的通信。作为该过程的一部分,HLS调用硬件模拟器,如Vivado模拟器,以模拟RTL在设备上的工作方式。此模拟的主要目的是检查用户提供的并行化指导没有破坏算法的功能正确性。

代码覆盖率


代码覆盖率表示测试台代码执行设计中语句的百分比。该度量可以由gcov等工具生成,它给出了用于执行该算法的测试向量的质量。

至少,测试台必须获得90%的代码覆盖率分数才能被视为算法的适当测试。这意味着测试向量触发case语句、条件if-else语句和for循环中的所有分支。除了总体覆盖率指标外,代码覆盖率工具生成的报告还提供了对函数的哪些部分已执行和哪些部分未执行的深入了解。

越界内存访问问题


在HLS中,内存访问可以表示为对数组的操作,也可以表示为通过指针对外部内存的操作。在越界内存访问的情况下,重点是由HLS转换为内存块的阵列。 下图显示了具有越界内存访问的代码示例。

image.png

这段代码试图将数据写入超出分配内存范围的数组中。在处理器编译器中,这种类型的地址溢出会触发地址计数器重置为0。这意味着在处理器执行图中的代码时,位置a[0]的内容是15而不是5。尽管结果在功能上不正确,但这种错误通常不会导致程序崩溃。

当无法进行C/C++验证时


HLS的大多数用例都在算法中,这些算法可以通过C/C++仿真充分验证功能的正确性。然而,仍有一些情况下,在HLS编译之前无法完全验证算法的C/C++表示。下图显示了此类代码的示例。

image.png

这段代码显示了C中描述的UDP数据包处理引擎的一个片段。在本例中,所有指针都使用volatile关键字声明。volatile关键字的使用在设备驱动程序开发中很常见,它提醒编译器指针连接到可能在函数执行期间更改的存储元素。每次在源代码中指定此类指针时,都必须读取或写入此类指针。合并指针访问的传统编译器优化也被volatile关键字关闭。

易失性数据的问题在于,在C/C++模拟中无法完全验证代码的行为。C/C++模拟不具备在测试函数执行过程中改变指针值的能力。因此,只有在HLS编译之后,才能在RTL模拟中完全验证这种类型的代码。用户必须为C/C++源代码中的每个易失性指针编写一个RTL测试台,以便在所有可能的情况下测试生成的电路。在这种情况下,联合仿真的使用不适用,因为它受到可用于C/C++仿真的测试向量的限制。

reference


  1. UG998
目录
相关文章
|
缓存 网络协议 开发工具
庖丁解牛之-Android平台RTSP|RTMP播放器设计
我们在做Android平台RTSP或者RTMP播放器开发的时候,需要注意的点非常多,以下,以大牛直播SDK(官方)的接口为例,大概介绍下相关接口设计:
154 0
|
3月前
|
编解码 移动开发 安全
FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生
自互联网普及以来,流媒体技术特别是视频直播技术不断进步,出现了多种传输协议。早期的MMS由微软主导,但随WMV格式衰落而减少使用。RTSP由网景和RealNetworks联合提出,支持多种格式,但在某些现代应用中不再受支持。RTMP由Adobe开发,曾广泛用于网络直播,但因HTML5不支持Flash而受影响。HLS由苹果开发,基于HTTP,适用于点播。SRT和RIST均为较新协议,强调安全与可靠性,尤其SRT在电视直播中应用增多。尽管RTMP仍占一定市场,但SRT等新协议正逐渐兴起。
127 8
FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生
|
应用服务中间件 nginx
流媒体技术学习笔记之(十四)FFmpeg进行笔记本摄像头+麦克风实现流媒体直播服务
FFmpeg推送视频流,Nginx RTMP模块转发,VLC播放器播放,实现整个RTMP直播 查看本机电脑的设备 ffmpeg -list_devices true -f dshow -i dummy 红色标记表示视频设备和麦克风设备 看到乱码了吧!来这里查看哦   FFmpeg编码推送到R...
3503 0
|
7月前
|
编解码 Linux 5G
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
AVS3,中国制定的第三代音视频标准,是首个针对8K和5G的视频编码标准,相比AVS2和HEVC性能提升约30%。uavs3d是AVS3的解码器,支持8K/60P实时解码,且在各平台有优秀表现。要为FFmpeg集成AVS3解码器libuavs3d,需从GitHub下载最新源码,解压后配置、编译和安装。之后,重新配置FFmpeg,启用libuavs3d并编译安装,通过`ffmpeg -version`确认成功集成。
144 0
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
|
7月前
|
C++ 芯片 异构计算
【ZYNQ】教你用 Vivado HLS 快速设计一个 IP
【ZYNQ】教你用 Vivado HLS 快速设计一个 IP
153 0
|
编解码 监控 开发工具
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
102 0
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
|
存储 网络协议 流计算
|
监控 内存技术
博途软件PLCSIM仿真工具如何使用S7-1500 PLC仿真功能?
针对博途软件,西门子重新开发了PLCSIM,有了这个仿真工具我们就无需使用真实硬件,而可以对所编的程序进行仿真和调试。除此之外PLCSIM还增加了许多功能,比如说顺序控制的仿真。在今后的学习过程中我们会经常使用到PLCSIM,本节我们以S7-1500 PLC仿真功能为例,来介绍一下PLCSIM的操作和使用。
博途软件PLCSIM仿真工具如何使用S7-1500 PLC仿真功能?
|
测试技术
HLS开发学习-08- Vivado HLS下C_C++测试平台的基本架构
HLS开发学习-08- Vivado HLS下C_C++测试平台的基本架构
223 0
HLS开发学习-08- Vivado HLS下C_C++测试平台的基本架构
|
算法 C语言 C++
HLS开发学习-03-VIVADO HLS设计流程
HLS开发学习-03-VIVADO HLS设计流程
354 0
HLS开发学习-03-VIVADO HLS设计流程