There has been a change in opt_design behavior for Vivado 2016.3. This is due to a change in what behavior is considered to be correct.
Unused output ports have OBUFTs inserted during synthesis that are configured to drive the port with a constant 1.
In Vivado versions prior to 2016.3, opt_design would remove the OBUFT and port. However, that is now considered to be an incorrect change in logic and so the OBUFT and port are no longer removed.
This can lead to fitting errors due to the increase in I/O pins, I/O Banking rule issues, and DRC issues related to unconstrained ports and ports with no IOSTANDARD assigned.
A work-around for this issue is to set the property IO_BUFFER_TYPE to "NONE" on the unused output ports. This will prevent the OBUFT insertion.