Real microcode is below the level of assembly language. E.g. a horizontal microcode will potentially be controlling the function of each gate or sub-block in a microprocessor.
The clock frequency of a synchronous design is generally the time it takes to execute each microcode instruction. So one machine code op code may translate into several microcode operations to achieve the desired outcome.
Writing microcode is hard.
Doing the microcode for those projects was kind of fun, I miss that kind of work sometimes. Now get off my lawn.
Back in the late '80s a friend who was taking it told me about a contest of sort they had to the side: you were given an instruction set to implement in hardware and firmware (microcode) and on the day of the contest you were given a program to run on it. The fastest implementations after a day of hacking and tuning won.
I notice that the last lab for the above spring 2009 version has a price/performance challenge, which is very apropos to what's hot in this area today (e.g. the ARM, Atom, etc.). You're to minimize the number of gates while still making it run a sample application quickly.