电子工程学生
补充一些容易踩的坑和选择建议。
首先,不是所有算法都适合无脑dataflow。如果步骤之间有严格的数据依赖,比如第二步必须等第一步完全算完所有结果才能开始(而不是第一个结果出来就能开始),那dataflow效果有限。图像滤波通常是滑动窗口,这种有局部依赖的,很适合用dataflow配合行缓存来实现。
组织函数时,建议把缓存管理(比如生成滑动窗口)单独封装成一个函数,这个函数用stream输入原始像素,用stream输出窗口数据。这样卷积计算函数就只需要处理窗口,结构清晰。
关于数据结构,在stream里传输的数据类型,尽量用原生C类型(如int, float)或者ap_fixed, ap_int。避免在stream里传复杂的struct,除非你很清楚综合后的硬件行为。
判断依赖是否被打破,除了看报告,一定要做C仿真(C Simulation)和C/RTL协同仿真(Co-Simulation)。C仿真可以快速验证功能正确性,看看dataflow的逻辑对不对。C/RTL仿真虽然慢,但能最真实地看到硬件时序和行为,有没有背压(backpressure)问题一目了然。
最后,如果吞吐量要求极高,可以考虑在dataflow里复制多个相同的处理单元,但这就需要手动做数据分配和收集了,复杂度会提高。先把手头的单流水线优化到极致再说。
