Another approach to solve memory port conflicts is to use the Array_Partition directive to reconfigure the structure of an array. Array_Partition lets you partition an array into smaller arrays or into individual registers instead of one large array. This effectively either increases the amount of read and write ports for the storage and potentially improves the throughput of the design. However, Array_Partition also requires more memory instances or registers, and so increases area and resource consumption. For more information, refer to ARRAY_PARTITION.
Open the Config File editor and add to the
Array_Partitiondirectives as follows:
dct_2d col_inbuf dim=1 factor=8 type=cyclic
dct buf_2d_out dim=1 factor=8 type=cyclic
The reason for choosing a cyclic partition with a factor of 8 has to do with the code structures involved. The loop is processing an 8x8 matrix, which requires taking eight passes through the outer loop, and eight passes through the inner loop. By selecting a cyclic array partition, with a factor of 8, you are creating eight separate arrays that each get read one time per iteration. This eliminates any contention for accessing the memory during the pipeline of the loop.
Run synthesis and re-examine the Synthesis Summary report to see the results of this latest change.
ACTION: Back out the prior change before proceeding.