一、loop_merge & loop_split
1.loop merge循环合并是有指令的
2.loop split也就是循环拆分
loop fission或者loop distribution这个没有指令,需要开发者手动来进行拆分。
3.循环合并(Loop Merge) 和 循环拆分(Loop Split / Fission) 是两种方向相反的优化策略,分别用于解决不同的问题。
二、loop merge
1.将多个连续的循环合并,减少状态机开销,共享资源;
2.#pragma HLS LOOP_MERGE 指令,用于将多个连续的循环合并为一个循环。合并后,原本多个循环的控制逻辑(状态机、计数器等)被共享,循环体可能被拼接在一起顺序执行。
3.在 HLS 综合中,每个循环通常会被映射为一个有限状态机(FSM),包含初始化、条件判断、循环体执行和递增计数等状态。多个连续的循环会生成多个 FSM,它们串行工作。循环合并将这些 FSM 合并成一个,减少了状态转换开销和硬件资源(如计数器、比较器、多路选择器)。此外,如果循环体之间没有数据依赖,合并后可能增加资源共享的机会(例如乘法器、加法器等可时分复用)。
4.合并的好处:
多个短循环:当多个循环的迭代次数相同或相近,且循环体较简单时,合并可以减少控制逻辑面积。
顺序执行的循环:循环之间没有数据依赖,可以安全合并。
资源共享:如果多个循环使用了相同类型的运算单元(如多个乘法器),合并后可以共享这些资源,降低面积。
减少延迟:合并后消除了循环之间的状态机切换延迟,可能略微提高吞吐率。
三、loop split
1.将大循环,手动拆分为多个循环;
2.当循环体非常庞大或包含多种不同类型的操作时,综合器可能会面临以下问题:
资源冲突:不同操作可能需要同一类资源(如 DSP 块),导致调度困难。
数据依赖复杂:多种操作混合在一起,使数据依赖分析变得复杂,阻碍流水线或并行化。
存储访问模式不佳:如果循环中同时访问多个大数组,可能导致 BRAM 端口冲突。
将循环拆分后,每个小循环专注于一种或一类操作,使得:
每个循环的数据依赖更简单,便于流水线化。
可以为不同循环应用不同的优化指令(例如对一个循环做 PIPELINE,对另一个做 UNROLL)。
每个循环可以独立进行数组分区,优化存储带宽。
四、对比
