基于HLS工具的进阶实战学习笔记2——Stream与DataFlow

笔记——学习HLS:Stream与DataFlow

HLS的一个类 hls::stream, 来流式处理数据,综合以后形成一份FIFO
在c仿真时,如果模块内部定义了这个类型的变量,这个fifo被认为是无限长度,但综合为电路时,长度默认为1,需要加约束设置其长度。
基于HLS工具的进阶实战学习笔记2——Stream与DataFlow_第1张图片如果不做约束,在综合时会报如下错误:
ERROR: [XFORM 203-733] An internal stream ‘tp_stream.V.V’ (stream_test/stream_test.cpp:23) 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.
ERROR: [HLS 200-70] Pre-synthesis failed.

如果是main函数里定义该类型变量,由于不会综合成电路,仍然会认为是个无限容量的FIFO。

定义两个模块:
typedef ap_uint<128> my_uint128_t;
void stream_test_part1(
hls::stream &stream_in,
hls::stream &stream_out,
ap_uint<16> stream_len
)
{
for(int i=0;i #pragma HLS LOOP_TRIPCOUNT min=10000 max=10000 avg=10000
my_uint128_t tp;
tp = stream_in.read();
tp = tp+1;
stream_out.write(tp);
}

}

void stream_test_part2(
hls::stream &stream_in,
hls::stream &stream_out,
ap_uint<16> stream_len
)
{
for(int i=0;i #pragma HLS LOOP_TRIPCOUNT min=5000 max=5000 avg=5000
my_uint128_t tp,tp2;
tp = stream_in.read();
tp2 = stream_in.read();
stream_out.write(tp+tp2);
}

}

void stream_test(
hls::stream &stream_in,
hls::stream &stream_out,
ap_uint<16> stream_len)
{
hls::stream tp_stream;
#pragma HLS STREAM variable=tp_stream depth=4 dim=1

stream_test_part1(
	stream_in,
	tp_stream,
	stream_len
);

stream_test_part2(
	tp_stream,
	stream_out,
	stream_len
);

}
由于stream_len是参数,在综合时需要加上约束HLS LOOP_TRIPCOUNT,否则无法得到Latency
基于HLS工具的进阶实战学习笔记2——Stream与DataFlow_第2张图片加上约束后
基于HLS工具的进阶实战学习笔记2——Stream与DataFlow_第3张图片发现Latency为20002,也就是说
stream_test_part1(
stream_in,
tp_stream,
stream_len
);

stream_test_part2(
	tp_stream,
	stream_out,
	stream_len
);

这两个模块没有并行工作,如同C语言函数调用在串行。
需要对stream_tes模块进行并行约束。
基于HLS工具的进阶实战学习笔记2——Stream与DataFlow_第4张图片基于HLS工具的进阶实战学习笔记2——Stream与DataFlow_第5张图片通过联合仿真,检查时序波形
基于HLS工具的进阶实战学习笔记2——Stream与DataFlow_第6张图片

你可能感兴趣的:(Vivado,HLS)