笔记——学习HLS:Stream与DataFlow
HLS的一个类 hls::stream, 来流式处理数据,综合以后形成一份FIFO
在c仿真时,如果模块内部定义了这个类型的变量,这个fifo被认为是无限长度,但综合为电路时,长度默认为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<my_uint128_t> &stream_in,
hls::stream<my_uint128_t> &stream_out,
ap_uint<16> stream_len
)
{
for(int i=0;i<stream_len;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<my_uint128_t> &stream_in,
hls::stream<my_uint128_t> &stream_out,
ap_uint<16> stream_len
)
{
for(int i=0;i<stream_len/2;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<my_uint128_t> &stream_in,
hls::stream<my_uint128_t> &stream_out,
ap_uint<16> stream_len)
{
hls::stream<my_uint128_t> 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
加上约束后
发现Latency为20002,也就是说
stream_test_part1(
stream_in,
tp_stream,
stream_len
);
stream_test_part2(
tp_stream,
stream_out,
stream_len
);
这两个模块没有并行工作,如同C语言函数调用在串行。
需要对stream_tes模块进行并行约束。
通过联合仿真,检查时序波形