Most Likely Required
The knowledge/experience described below is required. It doesn't matter whether you are doing just an emulator or a hardware implementation too, it will be needed (even if only as a consideration when designing the ISA).
- Knowledge of binary and hexadecimal numerical systems - These are often used when assigning and reporting values of registers, wires, memory cells, etc.
- Knowledge of boolean logic and basic logic gates (AND, OR, XOR, NOT, etc) - These are the building blocks of every moderately or highly complex circuit.
- Knowledge of sequential and combinational logic - These determine the behaviour of a circuit.
- Programming experience - You can't possibly expect to do a CPU when you don't even know how programs are executed.
- Basic understanding of assembly language (for any architecture) - You will write your first programs for your CPU in assembly after all.
- Basic understanding of CPU theory - Things like advantages and disadvantages of various instruction sets, pipelining, out-of-order execution, etc.
Not Required but Good to Have
The knowledge/experience described below isn't actually required for a CPU developer, but it can still be useful.
- Compiler development experience - A compiler has the job of translating code written in a high-level language into low-level code (bytecode, assembly code or even machine code). This gives us a good indication about:
- What kind of instructions are most likely to be used when executing a program written in a high-level language;
- The complexity level of a compiler, depending on the underlaying CPU ISA.
- Operating System development experience - An operating system has the job of providing drivers, managing hardware resources (e.g. memory, CPU time) and enforcing security policies (e.g. paging, limited access to underlaying hardware) to user-space programs. This gives us a good indication about:
- The importance of common/"standard" interconnects/peripherals in a computing system;
- The various additional features (e.g. integrated timer per each core for task switching) that would be useful in a CPU;
- The various protection capabilities (e.g. paging, supervisor level vs. user level) that would be needed (or not needed) in a CPU.