一、流传输综述
1.流传输数据是一种数据传输方式,数据传输是按照顺序来进行的,其中,
数据样本从第一个样本按照顺序的发送。
2.流传输不需要地址管理。
3.在c中很难对流传输数据的设计进行建模,vivado hls提供了c++模板类
hls::stream<>用于对流传输数据结构进行建模。
二、使用hls::stream<>类实现的流传输具备的属性
1.在c语言代码中,使用hls::stream<>的行为和无限深度的FIFO比较类似。
不需要定义hls::stream<>的大小。
2.流是按照顺序执行读取和写入操作的。从hls::stream<>读取数据之后,是
没有办法再次进行读取的。
3.顶层接口的hls::stream<>默认情况是使用ap_fifo接口来实现
4.在函数内部的hls::stream<>是作为FIFO来实现的,这个FIFO的depth=2.
5.hls::stream不支持流传输数组:hls::stream<> arr[10];这个是不支持的。
三、hls::stream在c和rtl中建模
1.数据流在软件中,测试激励文件中,rtl协同仿真中是作为无限队列来建模实现的;
2.在c++中对数据流中进行仿真,不需要满足任意深度;
3.每个hls::stream<>对象都仅限单一进程写入,并且单一进程读取;
4.如果在顶层接口上使用hls::stream,默认作为ap_fifo接口来实现(FIFO接口来实现),
当然,可以选择将其作为ap_hs握手接口或者axi4-stream接口来实现;
5.如果在设计的函数中使用hls::stream,并且将其综合到硬件中,那么将会作为内部FIFO
来实现,并且默认FIFO的深度为2;
6.FIFO的大小需要容纳硬件能够生成的所有数据样本,否则可能导致设计停滞;
7.hls::stream在dataflow区域设置的depth=2即可满足要求;hls::stream变量在
非dataflow区域内使用的时候大小要设置合理,可以使用detph来修改深度;
8.hls::stream在不同任务之间传输数据,一般需要考虑在不同任务之间存在数据流传输的
dataflow区域内实现这些任务;
9.如果不进行dataflow修饰,那么默认就是非dataflow,这种情况就是完成每一项任务后再
开始下一项任务,再这种情况下必须要保证hls::stream的FIFO的大小能够保存生产者任务所
生成的所有数据样本。如果不增大hls::stream变量的大小会导致出问题。
四、全局流传输和局部流传输
1.流传输可以定义局部和全局的流;
2.局部流传输始终作为内部FIFO来实现;
3.全局流传输可以作为内部FIFO或者端口来实现;
4.仅读取或者仅写入的全局定义的流传输推断为顶层 RTL 块的外部端口;
如果这个全局定义的流只是读或者只是写,就会被推断为RTL块的外部接口,如果这个全局定义的流既可以
读又可以写,那么会被推断为内部FIFO来实现;
五、阻塞访问和非阻塞访问
1.非阻塞访问只能作为FIFO接口来实现
2.使用ap_fifo端口实现,但是使用axi4-stream资源定义的流接口不能使用非阻塞访问;
3.也就是ap_hs和axi4-stream是阻塞访问;
4.ap_fifo可以是阻塞访问,也可以是非阻塞访问;
六、hls::stream<>访问
1.hls::stream<>访问为阻塞读取和阻塞写入,这个方法会停止或者
阻止对空的传输FIFO尝试操作;
七、非阻塞访问
1.非阻塞访问允许读空的FIFO,允许写满的FIFO;
2.hls::stream在顶层接口上默认为ap_fifo接口,你可以使用阻塞访问,也可以使用非阻塞访问;
八、多个hls::stream作为结构体成员情况
1.vivado hls的c/rtl协同仿真不支持在顶层接口中包含hls::strem<>成员的结构体或者类;
2.虽然c/rtl仿真不支持hls::stream的结构体和类,但是可以进行综合
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) { }
上述这个代码中,在顶层中的结构体实参包含了hls::stream成员;这种情况是不能进行
c/rtl协同仿真的,但是是可以综合的;如果要对这个进行仿真,需要将这个rtl代码导出来,
然后使用verilog代码写的测试激励来测试,不能使用vivado hls自己设计的顶层来进行协同仿真设计;
3.上述的限制只是限制这个结构体或者类作为顶层函数的实际参数,或者作为global全局声明的对象,才有这个限制;
4.当这个结构体是在函数内部,不论是协同仿真,还是综合,都可以,没有任何限制;