0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HLS Stream案例分析

电子工程师 来源:lq 2019-04-24 17:36 次阅读

思考空间

对于如图11所示的顶层函数,HLS会将其接口综合成何种形式?

图11形参为stream的顶层函数

对于顶层函数,如果形参类型为hls::stream,HLS会将其综合为ap_fifo类型的接口。

这里,我们看一个HLS Stream应用案例。顶层函数top由两个底层函数read_data和handle_data构成,其中read_data主要功能是从输入stream上获取特定数据;handle_data的主要功能则是对获取的数据进行处理。这里主要是为了说明stream的使用方法,所以,请大家把关注点放在stream的定义、函数之间的参数传递以及相应的directive的设置等。实际上,read_data和handle_data是可以合并的。

图1 头文件

图2 read_data源代码

图3 handle_data源代码

图4 top源代码

从图2和图3的代码中可以看到,从流中读取数据可以用>>或read(),向流中写入数据可以用 << 或write()。同时,在使用 << 或 >> 时,并不需要添加#include

首先,执行C功能仿真,仿真结束时会出现如图5所示的warning。

图5 C Simulation时出现的warning

第二步,不设置任何directive,直接执行C综合,此时会显示如下错误信息。该信息表明,在非dataflow区域使用默认的FIFO规模(这个FIFO是因为stream而生成的,默认深度为1),会导致Deadlock。根据提示我们修改这个FIFO的深度。之后,重新执行C综合和C/RTL Cosimulation,均可通过。

图6 修改FIFO深度

第三步,进一步优化,可以看到这两个底层函数是可以应用dataflow以降低latency。具体设置如图7所示。执行C综合,综合结束时会显示如图8所示信息。[HLS214-111]显示静态变量和非静态Stream不能在同一个DATAFLOW区域中使用,故需要对top.cpp第4行进行修改,只需添加static关键字,如图9所示。再次综合,该warning即被消除。

图7 设置DATAFLOW

图8 C综合后显示的warning

图9 添加static关键字

如果只设置DATAFLOW,而不设置FIFO深度,C综合是可以通过的,但执行C/RTL Cosimulation时,会显示如图10所示错误信息。可以判断与FIFO的读写相关。这通常是因为出现了FIFO写满或者FIFO读空,从而造成DEADLOCK。从这个角度而言,先设置一个solution,不用进行任何directive的设置,执行C综合,尽可能地修复所有的warning。这个阶段给出的warning及修复建议更具体、更具有针对性。

图10 C/RTLCosimulation错误信息

第四步,进一步优化,由于数组key深度只有8,可以完全打散,用register代替,具体设置如图11所示。

图11 Array partition

至此,我们创建了3个Solution:

Solution1:设置FIFO深度

Solution2:设置FIFO深度 + 设置DATAFLOW

Solution3:设置FIFO深度 + 设置DATAFLOW + ARRAY PARTITION

3个Solution综合后的性能对比如图12所示。

图12 性能对比

从这个案例我们可以得出如下结论:

-流用于内部函数间的参数传递时,会被综合为深度为1的FIFO

-当流数据被综合为FIFO时,由于默认深度为1,可能会在C/RTLCosimulation时出现DEADLOCK

-先创建一个没有任何directive的Solution执行C综合,尽可能地解决此时出现的warning或者错误,这也是UFDM所倡导的设计思想。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62427
  • 代码
    +关注

    关注

    30

    文章

    4744

    浏览量

    68344
  • HLS
    HLS
    +关注

    关注

    1

    文章

    128

    浏览量

    24028

原文标题:一个HLS Stream应用案例

文章出处:【微信号:Lauren_FPGA,微信公众号:FPGA技术驿站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Stream模块的基础用法和进阶用法

    在 Rust 语言中,Tokio 是一个非常流行的异步编程框架。它提供了一系列的模块,其中最常用的就是 Stream 模块。Stream 模块允许我们以异步的方式处理数据流,这在很多情况下非常
    的头像 发表于 09-19 15:33 1149次阅读

    Stream API原理介绍

    Stream API 是 Java 8 中最重要的新特性之一,它是处理集合和数组的一种新方式。它提供了一种简单、灵活和可读的方式来处理集合和数组中的元素,从而使代码更加简洁、高效和易于维护。 1.
    的头像 发表于 09-30 15:31 672次阅读

    新手求助,HLS实现opencv算法加速的IP在vivado的使用

    是video in to AXI4-Stream,接到DMA,而HLS生成的算法IP是AXI4-Stream in and out。我想把AXI-Stream信号输出接到
    发表于 01-16 09:22

    可以在EDK中使用Axi4Stream接口/总线吗?

    你好,我正在EDK中使用axi4stream。有人可以帮助我如何使用通过Vivado高级综合(HLS)生成的ap_fifo / axi4stream接口可以在EDK中使用吗?我正在使用Export
    发表于 02-28 13:47

    Vivado HLS直通AXI Stream IP-Core如何分配

    嗨,我已经创建了一个带有IP-Core的硬件设计。但它不能正常工作。对于我提到的调试问题,我创建了一个IP-Core,然后通过AXI Stream。所以我可以检查我的IP-Core是否不起作用
    发表于 04-14 09:25

    【正点原子FPGA连载】第六章OV5640摄像头灰度显示实验-领航者ZYNQ之HLS 开发指南

    对一些常用的硬件结构或功能使用C/C++进行建模,并且能够综合成RTL。在Vivado HLS中提供的C库有下面几种类型:1、任意精度数据类型库2、HLS Stream库3、HLS数学
    发表于 10-13 16:58

    【正点原子FPGA连载】第十一章基于OV5640的自适应二值化实验-领航者ZYNQ之HLS 开发指南

    rows,6 int cols7 ){89 #pragma HLS INTERFACE axis port=INPUT_STREAM10 #pragma HLS INTERFACE axis
    发表于 10-14 16:04

    Vivado HLS实现OpenCV图像处理的设计流程与分析

    ,需要将输入和输出HLS可综合的视频设计接口,修改为Video stream接口,也就是采用HLS提供的video接口可综合函数,实现AXI4 video stream到VivadoH
    发表于 07-08 08:30

    HLS系列–High Level Synthesis(HLS)的端口综合2

    在上一章HLS的端口综合里有提及,HLS综合后的端口分为2中类型:BlockLevel和Port Level Interface。其中Port level是我们需要重点关注的,它又可以细分为4中类型
    发表于 02-08 03:27 564次阅读
    <b class='flag-5'>HLS</b>系列–High Level Synthesis(<b class='flag-5'>HLS</b>)的端口综合2

    HLS系列–High Level Synthesis(HLS)的端口综合3

    在上一章HLS提到了axi lite端口的综合方式,以及directive的一些语法规则。这一章里面,介绍一下axi-stream和full axi端口的综合实现问题。 1. AXI-Stream
    发表于 02-08 03:31 537次阅读
    <b class='flag-5'>HLS</b>系列–High Level Synthesis(<b class='flag-5'>HLS</b>)的端口综合3

    HLS系列–High Level Synthesis(HLS)的端口综合4

    在上一章HLS提到了axi lite端口的综合方式,以及directive的一些语法规则。这一章里面,介绍一下axi-stream和full axi端口的综合实现问题。 AXI FULL端口的实现
    发表于 02-08 03:35 962次阅读
    <b class='flag-5'>HLS</b>系列–High Level Synthesis(<b class='flag-5'>HLS</b>)的端口综合4

    HLS系列–High Level Synthesis(HLS)的端口综合5

    在之前的3章里,着重讲解了HLS对AXI端口(包括axi-lite,axi-stream和full axi端口)的综合实现问题,下面让我们来介绍一下其它的端口类型是如何实现的。 在开始之前,先来
    发表于 02-08 03:39 567次阅读
    <b class='flag-5'>HLS</b>系列–High Level Synthesis(<b class='flag-5'>HLS</b>)的端口综合5

    Vivado HLS(Zynq TRD)源码分析

    源码是官方的2014.4 TRD工程里的,整个工程是基于zc702板子的,但手里只有块小zybo >_ 里面的硬件设计很有参考价值,最近想用FPGA加速surf算法,先在这分析下TRD工程里
    发表于 02-08 10:12 559次阅读

    Vitis HLS相关问答详解

    需要手工在 C++ 代码里明确指定可并行执行的任务(用 task,添加头文件 hls_task.h),同时可并行执行的 task 接口(对应 C++ 函数的形参)必须是 streamstream_of_blocks。
    的头像 发表于 08-11 11:23 692次阅读

    Java的Stream的常用知识

    什么是Stream 生产线 Stream就像处理生产流水线一样去工作,传送带就是Stream的管道,每个工厂关注直接的生产,将上游产品加工成下游需要的产品。为什么Stream比传统的处
    的头像 发表于 10-11 15:45 434次阅读
    Java的<b class='flag-5'>Stream</b>的常用知识