When the memory depth is non-power of 2, Vivado Synthesis extends the depth to a power of 2 to do BRAM inference, which results in more BRAMs being inferred than expected.
An example of this is as follows:
For a RAM with depth=1146880 and width=3, which is 1146880x3 = 70 x (16K x 1) x 3, the expectation is 70x3=210 RAMB18s.
However, Vivado Synthesis extends the depth to a power of 2 (2^21 = 2097152), which means it needs 128x3=384 RAMB18s=192 RAMB36s.
Block RAM inference with a supported depth other than power of 2 has been supported for UltraScale and newer devices.
However, this is not supported for 7 Series devices.
To work around this issue in the meantime, manually change the code to split the RAM into several parts so that it consists of several small RAMs whose depth is a power of 2.
For the example above, this 1146880x3 RAM can be split into three parts: 1048576 (2^20) x 3 + 65536 (2^16) x 3 + 32768 (2^15) x 3