Another important point: the .pcf file that's in ./examples/common assigns all PMOD pins to a single PMOD vector that looks like PMOD[55:0] in the chip.v.
This doesn't work if you want to use inferred IOs and, at the same time, have some PMOD signals input and some output: you can't declare the PMOD vector inout (because Yosys will croak), and you can't define part of the vector input and part of it output.
So for the uart_loopback example, I was forced to use a custom .pcf file instead.
Ultimately, I personally don't like a .pcf file with generic names like PMOD-this, PMOD-that. I prefer to use the actual functional name in the chip.v and the .pcf (UART_TX, UART_RX), and just mention which PMOD it's connected to in the .pcf comments. That way, the chip.v doesn't have these meaningless names that aren't scalable if you wanted to use your code on a different FPGA board.