为什么即使做了 array_partition 还是出现“limited memory ports”警告和 II 违规?

为什么即使做了 array_partition 还是出现“limited memory ports”警告和 II 违规? 一、设计line_buf[2][INWIDTH]应用了#pragma HLS ARRAY_PARTITION variableline_buf cyclic factor9 dim2#pragma HLS ARRAY_PARTITION variableline_buf dim1 complete二、现象做了 array_partition 还是出现“limited memory ports”警告和 II 违规。三、分析1.RESIZE_NPPC_LOOP2 中读取 line_buf 时仍然因为内存端口不足而无法调度2.RESIZE_NPPC_LOOP 和 RESIZE_NPPC_LOOP1 有 carried dependence 导致 II 83.“Unable to schedule load operation ... on array line_buf[0][7].V ... due to limited memory ports.” 这意味着对同一个数组元素 line_buf[0][7] 有多个读请求同时发生而该元素所在的 memory bank 端口数不足以同时服务这些读取。就是同一个地址需要多次获取发生了拥挤从而造成II的值特别大。对于不同的 kx0 和 x1 可能相同吗有可能。例如当缩放导致多个相邻输出像素映射到同一个输入坐标但注意 dst_x 每次递增 NPPC内层 for k 展开current_dst_x 连续x0 和 x1 可能会相邻但不太可能所有 k 都映射到同一点。然而警告特别指出 line_buf[0][7].V 读取操作 line_buf_0_7_V_loa_4。4.如果 scale_x 1缩小那么 x0 可能跳跃如果 scale_x 1放大x0 可能重复。所以可能多个 k 的 x0 相同或 x1 相同。即使不同由于 cyclic factor9相邻的 x0 可能落在不同 bank5.line_buf[0][7] 被多次 load说明 bank 7 上的 7 号元素被多次读取也许是不同 k 的 x0 都等于 7或者 7 与 6、8 在不同 k 中同时需要 bank 7 的元素。此外还要注意 line_buf 也可能在 RESIZE_NPPC_LOOP2 之前被写入但此循环只读无写冲突只考虑读端口。