"mcc" is a compiler written in C# that takes symbolic descriptions of microcode instructions and generates mapper and microcode ROM initialization files, typically used in FPGA syntesis of CPU control units.
The basic idea behind it is a standardized microcontrol unit, which is simple yet powerful and can easily drive devices such as various processors and controllers. It allows for example relatively easy recreation of 8- and 16-bit historic CPUs in VHDL. Key elements:
-
Mapper memory. Address is the instruction register (or any sub/superset of it), and output the entry point where the microinstruction sequence implementing it starts
-
Microcode memory. Address is output from microinstruction program counter, and output is the microinstruction word driving the machine
-
Control unit. It is driven by 3 fields of microinstruction word:
- "if" -- this is simply a select of a n to 1 mux which decides if the condition is true or false
- "then" -- target to execute or jump to if the condition is true
- "else" -- target to execute of jump to if the condition is false
The control unit is made simple by 2 innovations:
a) The jump target and instructions are overlapped. Typically the first 4 codes are reserved for: next ... upc <= upc + 1; repeat ... upc <= upc; fork ... upc <= mapper(instruction_register); return ... upc <= stack pop;
All the other targets presented on "then" or "else" are interpreted as upc <= target
b) a limited depth stack (typically 4 levels) is built in. That means each upc <= target also pushes the previous address on the stack in one machine cycle, and return is also executed in 1 machine cycle. This means that at each jump the bottom of the stack is lost, in other words programmer must take care to never nest more than 3 levels if stack is 4 levels deep.
You can find a bit more info about the ideas behind this here: https://hackaday.io/project/167457-tms0800-fpga-implementation-in-vhdl/log/168280-patterns-for-creating-microcode-driven-core-in-vhdl