In a Harvard architecture, instructions and data live in two separate memories, each with its own address and data path. The alternative, one shared memory for both, is the von Neumann design of the stored program computer.
Why split them? Because one memory can do only one access per cycle. With separate memories, the CPU can fetch the next instruction and read or write data at the same time.
That matters most for a single cycle processor. It must fetch an instruction and read its operand within one clock cycle, so it needs two memories (or one memory with two ports). A multi cycle processor like Tiny8 doesn't: the instruction fetch (F2) and the operand read (E1) happen in different cycles, so one memory serves both.
Trade-offs:
- Harvard: more bandwidth, but two memories to build, and a program can't easily treat its own code as data.
- Shared (von Neumann): simpler and more flexible, but instruction and data accesses take turns.
Many real chips mix the two: separate instruction and data caches in front of one shared main memory.