一、single producer-consumer violation单一生产者-消费者违例
1.任务、函数、循环之间的数据流通道通常是FIFO或者RAM
2.单一生产者-消费者违规一般指的是同一个变量被多个生产者或者多个消费者访问,这样综合工具无法推断数据流的通道情况;
3.dataflow优化要求在其管控的数据流区域内只能存在一个生产者或者消费者,确保插入FIFO或者RAM来实现任务之间的并行;
二、如何理解违规的危害
1.数据流的分析
2.通道的插入
3.内存映射
4.握手信号
5.死锁
6.存储bank冲突
7.多生产者-消费者
8.生命周期分析
9.数据依赖图
三、违规后果
1.多个生产者会竞争写端口,多个消费者竞争读端口,无法静态调度,需要仲裁;破坏确定性;无法确定数据完成;无法分析数据依赖;可能导致读写顺序错误/数据覆盖/丢失;Vivado HLS 保守拒绝。
2.多个生产者写同一变量:工具无法判断哪个生产者写入的数据被消费者看到;
3.多个写者需要写仲裁,导致资源冲突;通道写入端口不唯一,无法用单个 FIFO 的写端口;无法确定数据顺序;可能产生数据覆盖;工具无法生成可靠的同步逻辑。可能可以合并,但 HLS 不做,因为保守。
4.如果多个消费者读同一变量:如果变量是 FIFO,数据一旦读出就消耗;多个消费者同时读会破坏数据流语义;需要复制数据或广播总线/多个读端口,资源不确定;工具无法为每个消费者分配独立的读端口和同步;可能导致一个消费者读走另一个消费者需要的数据。对于 RAM 可以多读,但数据流需要知道每个消费者何时完成才能释放缓冲;多个消费者生命周期不同,无法确定何时安全覆盖/释放,可能导致数据冒险。所以要求单一消费者。
四、违规案例
1.违规案例一
void top(int in[N], int out[N]) {
#pragma HLS dataflow
int buf[N];
proc1(in, buf);
proc2(in, buf); // 第二个写者
proc3(buf, out);
}
2.违规案例二
void top(int in[N], int out1[N], int out2[N]) {
#pragma HLS dataflow
int buf[N];
proc1(in, buf);
proc2(buf, out1);
proc3(buf, out2); // 两个消费者
}

378

被折叠的 条评论
为什么被折叠?



