ISA is the most important. Caches and extra circuitry can be added onto a processor later. But the ISA can seldom be changed after the CPU is done being made.
Why can’t we just have all the instructions we want on a chip?
As usual, you want to start with something very simple and expand it later as needed. This is the same with math proofs, and the same with software.
The efficiency of your programs largely depends on the instructions that they use.
The size of individual cpu instructions is dependent on the total number of instructions that the cpu supports.
You can in general only have instructions that match the smallest unit that the bus can get, or a multiple of 8. So on an intel machine, you might have instructions that are 8 bits, 16 bits, 32 bits, etc. On ARM machines, since RISC, they only allow instructions in 32 or 64 bit lengths(all instructions must be the same size).
There are benefits and costs to each approach. Using variable length is harder to decode, but you can save some memory for example. This does mean though that a few bits have to be saved just to explain the length of the instruction.
It’s much easier to add instructions later than to remove them. So make a MVP type thing, keeping the instructions simple. Save some room for expansion later.
The process for designing an instruction set is something like:
The rest of the chapter is dedicated to putting this theory into practice designing a small ISA. Not as useful as the assembly book to read after. It also dives into 8086 instruction encodings, which I can review in depth while programming assembly.