HLS流传输说明
一、流传输综述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的depth2.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区域设置的depth2即可满足要求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::streamuint8_t a;hls::streamuint16_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.当这个结构体是在函数内部不论是协同仿真还是综合都可以没有任何限制