Usable CPU's do not need caches, branch prediction and pipelining, and IO can be memory mapped.
There are other bits you need to make a usable CPU (for instance: registers, instruction decoder, instruction pointer and a stack pointer and some more glue), but the ones you mention are totally optional.
There are other bits you need to make a usable CPU (for instance: registers, instruction decoder, instruction pointer and a stack pointer and some more glue), but the ones you mention are totally optional.