HLS 流传输库hls::stream

2023-11-15

流传输数据是一种数据传输形式, 其中数据样本从第一个样本开始按顺序发送。流传输不需要地址管理。

Vivado HLS 提供了 C++ 模板类 hls::stream<>, 用于对流传输数据结构进行建模。使用 hls::stream<> 类实现的流传输具有如下属性。

  • 在 C 语言代码中, hls::stream<> 的行为与无限深度的 FIFO 相似。无需定义 hls::stream<> 的大小。
  • 按顺序对其执行读取和写入。即, 从 hls::stream<> 读取数据之后, 无法再次对其进行读取。
  • 顶层接口上的 hls::stream<> 默认情况下使用 ap_fifo 接口来实现。
  • 设计内部的 hls::stream<> 作为 FIFO 来实现, 深度为 2。最优化指令 STREAM 用于更改此默认大小

注释: hls::stream 类应始终在函数之间作为 C++ 参考实参来进行传递。例如, &my_stream。
重要提示! hls::stream 类仅限在 C++ 设计中使用。不支持流传输数组。

C 语言建模与 RTL 实现

数据流在软件中(以及在测试激励文件中进行 RTL 协同仿真期间) 作为无限队列来建模。在 C++ 中对数据流进行仿真
无需满足任意深度。数据流可在函数内部使用, 也可在函数接口上使用。内部数据流可作为函数参数来进行传递。
数据流仅限在基于 C++ 的设计中才能使用。每个 hls::stream<> 对象都仅限单一进程写入, 且仅限单一进程读取。
如果在顶层接口上使用 hls::stream, 默认在 RTL 中会将其作为 FIFO 接口 (ap_fifo) 来实现, 但可选择将其作为
握手接口 (ap_hs) 或作为 AXI-Stream 接口 (axis) 来实现。
如果在设计函数中使用 hls::stream 并将其综合到硬件中, 那么会将其作为 FIFO 来实现, 且默认深度为 2。在某些
情况下(如使用内插时), 可能必须增大 FIFO 深度以确保 FIFO 可保存硬件生成的所有元素。如果无法确保 FIFO 大
小足以保存硬件生成的所有数据样本, 则可能导致设计停滞(可见于 C/RTL 协同仿真和硬件实现中) 。 FIFO 深度可使
用 STREAM 指令搭配 depth 选项来进行调整。在示例设计 hls_stream 中提供了相关示例。

重要提示! 确保 hls::stream 变量在默认非 DATAFLOW 区域内使用时的大小设置正确。

如果使用 hls::stream 在不同任务(子函数或循环) 间传输数据, 应考量在不同任务间存在数据流传输的DATAFLOW 区域内实现这些任务。默认(非 DATAFLOW) 行为是完成每一项任务后再开始下一项任务, 在此情况下必须确保用于实现 hls::stream 变量的 FIFO 大小足以保存生产者任务所生成的所有数据采样。不增大
hls::stream 变量的大小会导致如下错误:

ERROR: [XFORM 203-733] An internal stream xxxx.xxxx.V.user.V' with default size is used in a non-dataflow region, 
which may result in deadlock. Please consider to resize the stream using the directive 'set_directive_stream' or the 'HLS stream' pragma

此错误表示在非 DATAFLOW 区域内(默认 FIFO 深度为 2), 其大小可能不足以保存生产者任务写入 FIFO 的所有数
据采样。

全局和局部流传输

流传输可定义为局部或全局。局部流传输始终作为内部 FIFO 来实现。全局流传输可作为内部 FIFO 或端口来实现:

  • 仅读取或者仅写入的全局定义的流传输推断为顶层 RTL 块的外部端口。
  • 支持读取和写入的全局定义的流传输(位于顶层函数下的层级内) 作为内部 FIFO 来实现。

全局作用域内定义的流传输遵循的规则与任何其它全局变量相同

Using HLS Streams

使用 hls::stream<> 对象, 包含 hls_stream.h 头文件。数据对象流传输是通过指定类型和变量名称来定义的。

给定指定为 hls::stream 的流传输的情况下, 类型 T 可以是:

  • 任何 C++ 原生数据类型
  • Vivado HLS 任意精度类型(例如, ap_int<> 或 ap_ufixed<>)
  • 用户定义的结构体struct(包含以上任意类型)

注释: 用户定义的通用类(或结构), 所含方法(成员函数) 不应用作为流传输变量的类型 (T)
Note: General user-defined classes (or structures) that contain methods (member functions) should not be used as the type (T) for a stream variable

stream命名为可选操作,给定以下 2 个流传输的情况下:
stream<uint8_t> bytestr_in1;
stream<uint8_t> bytestr_in2(“input_stream2”);

命名的好处:容易在警告信息中定位问题。
有关流传输中剩余元素的任何警告均按如下方式报告, 其中明确标明与 bytetr_in2 的消息:

WARNING: Hls::stream 'hls::stream<unsigned char>.1' contains leftover data,which may result in RTL simulation hanging.
WARNING: Hls::stream 'input_stream2' contains leftover data, which may result in RTL simulation hanging.

函数传入或传出的流传输必须按引用传递, 如以下示例所示:

void stream_function (
	hls::stream<uint8_t> &strm_out,
	hls::stream<uint8_t> &strm_in,
	uint16_t strm_len
)

Vivado HLS 支持阻塞访问方式和非阻塞访问方式。

  • 非阻塞访问只能作为 FIFO 接口来实现。
  • 作为 ap_fifo 端口实现并以 AXI4-Stream 资源定义的流传输端口不得使用非阻塞访问。

阻塞读写/Blocking Reads and Writes

对hls::stream<> 对象的基本访问为阻塞读取/写入。这些访问是使用类方法完成的。这些方法会停止(阻止) 对空的流传输 FIFO 的读操作以及对满的流传输 FIFO 的写操作, 直至相应的ap_hs 接口协议的流传输完成握手为止。

Blocking Write Methods

// Usage of void write(const T & wdata)
hls::stream my_stream;
int src_var = 42;
my_stream.write(src_var); // or my_stream << src_var;

“<<”运算符已重载, 可按相似方式应用于 C++ 流传输(例如, iostreams 和 filestreams) 的流插入运算符。要写入的
hls::stream<> 对象将作为左侧实参提供, 而变量则作为右侧实参写入。

Blocking Read Methods

// Usage of void read(T &rdata)
hls::stream my_stream;
int dst_var;
my_stream.read(dst_var); //or int dst_var = my_stream.read(); //or my_stream >> dst_var;
或者, 通过将流传输赋值(例如, 使用 = 或 +=) 给左侧对象, 可读取流传输中的下一个对象。
或者,“>>”运算符已重载, 支持以相似方式用于 C++ 流传输(例如, iostreams 和 filestreams) 的流提取运算符。

Non-Blocking Reads and Writes

非阻塞读写方法同样可用。这些方法允许在空的流传输上尝试读取或者尝试写入已满的流传输时仍可继续执行。
这些方法会返回布尔值以指示访问状态(true 表示成功, false 表示失败) 。此外还包含其它方法用于测试
hls::stream<> 流传输的状态。
重要提示! 仅在使用 ap_fifo 协议的接口上支持非阻塞方法。更确切地说, AXI-Stream 标准和赛灵思 ap_hs I/O 协议不支持非阻塞访问。
在 C 语言仿真期间, 流传输大小无限。因此, 无法对 C 语言仿真验证流传输是否已满。只能在 RTL 仿真期间已定义
FIFO 大小(默认大小 1。或者通过 STREAM 指令定义的任意大小) 的情况下验证这些方法。
重要提示! 如果设计指定为使用块级 I/O 协议 ap_ctrl_none 且设计包含采用非阻塞行为的任意 hls::stream 变量, 则无法保证完成 C/RTL 协同仿真。

Non-Blocking Writes

此方法会尝试将 src_var 变量推送到 my_stream 流传输, 如果成功, 则返回布尔值 true。否则返回 false, 队列
不受影响。
// Usage of void write_nb(const T & wdata)
hls::stream my_stream;
int src_var = 42;
if (my_stream.write_nb(src_var)) {
// Perform standard operations

} else {
// Write did not occur
return;
}

Fullness Test

bool full(void)
仅当 hls::stream<> 对象已满时返回 true。
// Usage of bool full(void)
hls::stream my_stream;
int src_var = 42;
bool stream_full;
stream_full = my_stream.full();

Non-Blocking Read

bool read_nb(T & rdata)
此方法会尝试从流传输中读取值, 成功则返回 true。否则返回 false, 队列不受影响。

Emptiness Test

bool empty(void)
如果 hls::stream<> 为空, 则返回 true。
// Usage of bool empty(void)
hls::stream my_stream;
int dst_var;
bool stream_empty;
stream_empty = my_stream.empty();

控制 RTL FIFO 深度

对于使用流传输数据的大部分设计, 默认 RTL FIFO 深度 2 足矣。每次仅处理一个采样的流传输数据。
对于执行实现所需的 FIFO 深度大于 2 的多速率设计, 必须判定(并使用 STREAM 指令设置) 完成 RTL 仿真所需的深
度。如果 FIFO 深度不足, RTL 协同仿真将停滞。
由于在 GUI 指令窗格内无法查看流传输对象, 因此在该窗格内无法直接应用 STREAM 指令。
对于包含已声明的 hls::stream<> 对象(或者实参列表中已使用或包含该对象) 的函数, 右键单击并执行以下操作:
• 选中 STREAM 指令。
• 使用流传输变量的名称手动填充 variable 字段。
或者可以:
• 在 directives.tcl 文件中手动指定 STREAM 指令, 或
• 在 source 中添加该指令作为编译指示。

C/RTL 协同仿真支持

Vivado HLS C/RTL 协同仿真功能不支持在顶层接口中包含 hls::stream<> 成员的结构或类。 Vivado HLS 支持对这些结构或类进行综合。(不能协仿,但可综合)

typedef struct {
hls::stream<uint8_t> a;
hls::stream<uint16_t> b;
} strm_strct_t;
void dut_top(strm_strct_t indata, strm_strct_t outdata) { }

上述限制适用于顶层函数实参和全局声明的对象。如果使用流传输结构体进行综合, 则必须使用外部 RTL 仿真器和用户创建的 HDL 测试激励文件来验证设计。对于仅含内部链接的 hls::stream<> 对象并无此类限制。

知识点

  • 重要提示! hls::stream 类仅限在 C++ 设计中使用。不支持流传输数组。

  • Vivado HLS C/RTL 协同仿真功能不支持在顶层接口中包含 hls::stream<> 成员的结构或类。 Vivado HLS 支持对这些结构或类进行综合。(不能协仿,但可综合)

  • 重要提示! 仅在使用 ap_fifo 协议的接口上支持非阻塞方法。更确切地说, AXI-Stream 标准和赛灵思 ap_hs I/O 协议不支持非阻塞访问。

  • 重要提示! 如果设计指定为使用块级 I/O 协议 ap_ctrl_none 且设计包含采用非阻塞行为的任意 hls::stream 变量, 则无法保证完成 C/RTL 协同仿真。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HLS 流传输库hls::stream 的相关文章

  • 当 Stream.Read() 存在时,StreamReader 的用途是什么?

    这一直困扰着我 我知道Stream是一个抽象类 因此无法实例化 但它具有派生自它的类 为什么有一个流阅读器类和一个流 Read 方法 反之亦然 流写入器 and 流 Write 您可以使用 300 万种不同的方法写入文本文件 但尝试了解所有
  • 文件上传到文件流

    我正在将文件与 HttpWebRequest 一起发送 我的文件将来自 FileUpload UI 这里我需要将文件上传转换为文件流 以将流与 HttpWebRequest 一起发送 如何将 FileUpload 转换为文件流 由于 Fil
  • TCPStream.Read 会阻塞直到收到发送消息中的所有数据吗?

    我编写了一个多线程简单服务器 它使用 clientStream Read message 0 4096 阻塞直到客户端发送消息 然后代码继续处理该消息 到目前为止我只用它来发送短命令 ex login username login 但我担心
  • 如何在 Bash 中添加到流之前?

    假设我在 bash 中有以下命令 one two one运行很长时间产生输出流并且two对该流的每一行执行快速操作 但是two除非它读取的第一个值告诉它每行要读取多少个值 否则根本不起作用 one不输出该值 但我提前知道它是什么 假设它是1
  • 如何安全地读取 ASP.NET 中的流?

    byte bytes new byte uploader UploadedFiles 0 InputStream Length uploader UploadedFiles 0 InputStream Read bytes 0 bytes
  • 从另一个进程的输出流读取

    我想在我的 Java 程序中读取 c 应用程序的输出流 iremoted 可在此处获取 Link https web archive org web 20200505051207 http www osxbook com software
  • Openfeign ErrorDecoder 导致 java.io.IOException:流已关闭

    当我尝试实施时ErrorDecoder为了解码假装异常 我在中找到了流response body 已关闭 因此当我尝试读取流并将其转换为字符串时 它会抛出java io IOException stream is closed 这真的很困惑
  • 将猫鼬流转换为数组

    我曾经使用过 mongodb 但对 mongoose ORM 还很陌生 我试图从集合中获取数据 explain 输出显示 50 毫秒 通过 mongoose 获取数据的总时间为 9 秒 这是查询 Node find dataset data
  • 如何在 ActionScript 3 中从缓冲区(ByteArray/Stream)播放 MP3 声音?

    所以 我有一个MP3 数据缓冲区 如果我保存此缓冲区并将其命名为 buffer mp3 它就会播放 但在这种情况下我不应该将其保存到文件系统 我必须玩 但我不能 我该怎么办 我尝试了下一个代码来播放该缓冲区 ByteArray Stream
  • 如何将 pcap 文件流式传输到 RTP/RTCP 流?

    我已经捕获了三个不同的流作为带有元数据的 pcap 文件 如何流回 RTP RTCP 流 如果我理解正确的话 你有 pcap 但你想从他们那里得到 RTP 吗 Wireshark 用户界面 您可以使用 Wireshark 的 UI 通过菜单
  • 使用返回 Future 的函数映射 Stream

    有时我发现自己处于这样的境地 Stream X and a function X gt Future Y 我想组合成一个Future Stream Y 而且我似乎找不到办法做到这一点 例如 我有 val x 1 until 10 toStr
  • 分析云数据流 BigQuery 吞吐量/管道

    我试图弄清楚 DataFlow 如何扩展某些操作以及如何使其表现最佳 首先 我刚刚创建了一个简单的流程 从 BigQuery 读取数据 约 25M 行 总共 30GB 执行 JSON 提取 按键进行简单的分组 然后对分组进行聚合 每个约 1
  • ffmpeg流rc缓冲区下溢

    目前我正在使用开源工具 ffmpeg ffserver 建立一个屏幕共享平台 分享之初一切都很好 大约 1 1 2 分钟后 我在输出中得到以下异常 flv 0x3a47aa0 rc buffer underflow flv 0x3a47aa
  • 从流中读取多个 protobuf 消息的 python 示例

    我正在处理来自 spinn3r 的数据 它由序列化为字节流的多个不同的 protobuf 消息组成 http code google com p spinn3r client wiki Protostream http code googl
  • 如何检查 Stream.Null?

    我有一个 WCF 服务 它返回一个 Stream 如下所示 public Stream StreamFile string filepath try Grab the file from wherever it is Throw an ex
  • REtful POST :要写入流的字节超过指定的 Content-Length 字节大小

    抛出此错误 Bytes to be written to the stream exceed the Content Length bytes size specified 当我运行以下代码时 var request HttpWebRequ
  • 您能解释一下流的概念吗?

    我知道流是字节序列的表示 每个流都提供了向其给定的后备存储读取和写入字节的方法 但流的意义何在 为什么我们与之交互的不是后备存储本身 不管出于什么原因 这个概念并不适合我 我读过很多文章 但我想我需要一个类比或其他东西 选择 流 这个词是因
  • 如何在 python apache beam 中展平多个 Pcollection

    应该如何实现位于以下位置的以下逻辑 https beam apache org documentation pipelines design your pipeline https beam apache org documentation
  • 如何在webRTC android中将视频流数据录制为mp4?

    请帮我 我在中使用了这个例子https github com pcab AndroidRTC https github com pchab AndroidRTC将视频和音频从 Android 设备流式传输到其他 Android 设备 在这个
  • 在 HTML5 websocket 服务器中切割媒体流,用于基于网络的聊天/视频会议应用程序

    我们目前正在开发一个聊天 文件共享 视频会议应用程序使用 HTML5 websocket https stackoverflow com questions 4220672 implementing webbased real time v

随机推荐

  • idea强制回退gitlab分支代码

    1 如果合并分支出错 执行以下两步操作 1 切换到本地分支 找到要回退到的点 2 找到本地该项目的文件目录 空白处右键选择 git bash here 将本地分支代码强推到远程库 执行命令符 git push f origin develo
  • 1.MySQL数据库的基本操作

    数据库操作过程 1 用户在客户端输入 SQL 2 客户端会把 SQL 通过网络发送给服务器 3 服务器执行这个 SQL 把结果返回给客户端 4 客户端收到结果 显示到界面上 数据库的操作 这里的数据库不是代表一个软件 而是代表一个数据集合
  • Navicat 15安装教程,强烈推荐收藏!

    Navicat是一款轻量级的用于MySQL连接和管理的工具 非常好用 使用起来方便 简洁 下面讲讲其安装的过程 1 进入navicat官网 选择Navicat for MySQL 然后点击进行下载即可 官网连接 http www navic
  • VSCode+Qt+MinGW开发环境搭建

    VSCode Qt MinGW开发环境搭建 概述 VSCode扩展性很强 插件机制让其具备不断演进的潜力 适合作为稳定的开发工具 VSCode Qt开发环境的搭建需要依赖于以下工具 VSCode Qt 其中Qt需要安装MinGW编译工具 V
  • 【python-数据分析】笔记1

    数据库vs 仓库 数据库 gt 业务存储 针对应用 仓库 gt 主题存储 针对分析 数据来源 Kaggle 阿里云天池 在python console输入 import pandas as pd df pd read csv data HR
  • 理解javascript的同步与异步模式

    你可能知道 Javascript语言的执行环境是 单线程 single thread 所谓 单线程 就是指一次只能完成一件任务 如果有多个任务 就必须排队 前面一个任务完成 再执行后面一个任务 以此类推 这种模式的好处是实现起来比较简单 执
  • Leetcode 第 43 场双周赛题解(Python)

    Leetcode 第 43 场双周赛题解 周赛日期 2020 01 09 题目1 1716 计算力扣银行的钱 难度 简单 Hercy 想要为购买第一辆车存钱 他 每天 都往力扣银行里存钱 最开始 他在周一的时候存入 1 块钱 从周二到周日
  • 《一个操作系统的实现》读书笔记--第二章--搭建工作环境

    一 熟悉Bochs虚拟机 第一章我们使用虚拟机VMware运行了该最最简单的操作系统 由于VMware虚拟机不具备调试操作系统的功能 因此对于开发操作系统的程序员来说 VMware是不完备的 故本章介绍另一款虚拟机Bochs 下面我们就介绍
  • python 连续比较_python等值和大小比较

    等值 大小比较 在python中 只要两个对象的类型相同 且它们是内置类型 字典除外 那么这两个对象就能进行比较 关键词 内置类型 同类型 所以 两个对象如果类型不同 就没法比较 比如数值类型的数值不能和字符串类型的数值或字母比较 对于py
  • 计算机图形学GAMES101(十五)光线追踪(蒙特卡洛积分与路径追踪)

    本节涉及内容 蒙特卡罗积分 路径追踪 蒙特卡罗积分 蒙特卡罗积分的核心思想还是求一个不规则图形的面积 它的做法是 首先在a和b之间找一个值xi然后求f x 接着以f x 为高 ab为宽求矩形的面积 最后将所有的值求平均 当采样数量xi趋于无
  • C++斩题录

    个人主页 平行线也会相交 欢迎 点赞 收藏 留言 加关注 本文由 平行线也会相交 原创 收录于专栏 手撕算法系列专栏 LeetCode 本专栏旨在提高自己算法能力的同时 记录一下自己的学习过程 希望对大家有所帮助 希望我们一起努力 成长 共
  • 华南技术栈CNN+Bilstm+Attention

    我的目标适用于文本分类 这里有一个 技术栈完全一样但是目标不一样的应该可以参考 现在的情况 2022年7月6日21 16 04已解决 换成了CPU 因为电脑太破旧了 cuda跟不上pytorch官网 已安装 cuda cudnn anaco
  • 兼阅万分享:适合上班族下班时间做的6项兼职小副业

    你的收入还在8000以下 车贷 房贷 孩子学费 兴趣班费用要交 开车油门踩深点 都会心疼油费 每个月的压力都很大 白天要干活 有没有适合晚上下班后做的兼职或者副业 今天推荐6项 可以保存下来 如果真的撑不住了 挑一个干 虽然发不了大财 但改
  • python提高办公效率-【纯干货】提高Python运行效率的小窍门

    Python是一门优秀的语言 它能让你在短时间内通过极少量代码就能完成许多操作 不仅如此 它还轻松支持多任务处理 比如多进程 不喜欢Python的人经常会吐嘈Python运行太慢 但是 事实并非如此 尝试以下六个窍门 来为你的Python应
  • 爬虫日常练习-selenium登录12306

    文章目录 前言 页面分析 代码设计 前言 hello 好兄弟们 经过前面几篇文章后 想必小伙伴们对于简单的网页文本爬取 图片爬取类的内容已经熟练掌握了 今天我们开始练习一个新的内容 selenium 有关这一块的基础知识网上太多了 我们作为
  • 微信小程序如何测试?

    不需要安装 只要在微信里找到这个小程序打开即可使用 由于小程序的便捷 如今越来越多的平台开发方都纷纷推出自身的小程序应用 那我们该如何进行微信小程序测试呢 1 功能测试 功能测试以需求文档和交互视觉文档为准 如果没有这些文档 参考APP的测
  • 卷积神经网络的评价_金工研报:利用卷积神经网络进行多因子选股

    写在前面 下面这篇文章的内容主要来自华泰证券的研究报告 人工智能选股之卷积神经网络 文中首先通过对卷积神经网络 CNN 进行分析 然后通过将因子数据转换为二维图片的形式 并根据CNN原理给出了通过CNN运用于多因子选股的经验和方法 最后通过
  • map中取值转BigDecimal报错 java.lang.Integer cannot be cast to java.math.BigDecimal

    Map
  • Elasticsearch 中文分词&多词搜索&权重

    目录 中文分词器 一 安装中文分词器ik 二 使用中文分词器 多词搜索 权重 中文分词器 一 安装中文分词器ik 源码地址 https github com medcl elasticsearch analysis ik 根据提示 进行安装
  • HLS 流传输库hls::stream

    流传输数据是一种数据传输形式 其中数据样本从第一个样本开始按顺序发送 流传输不需要地址管理 Vivado HLS 提供了 C 模板类 hls stream lt gt 用于对流传输数据结构进行建模 使用 hls stream lt gt 类