ROMs whose array depth is significantly over 64 bits are better inferred into block RAM. The synthesis tool tries to do this by default but sometimes it is unable to do so due to coding or constraint restrictions.
The primary reason for not inferring a block RAM is a missing output register.
Block RAMs only support a synchronous read, but Distributed RAMs do not have this requirement.
The second reason when reading the array or a ROM_STYLE
attribute forcing the type of resource that must be inferred.
By making a simple modification, you can expect improvements in LUT utilization, timing, and where applicable, congestion.