As a peripheral to the microcontroller, I designed an 8 bit successive approximation ADC. The main components are shown here, designed using the xschem schematic editor in separate sub-blocks, as well as the NGSpice testbench setup.
NGSpice simulations used SKY130 PDK SPICE models to make sure that timing and logic were correct. Here the ADC correctly digitizes 1.8V relative to a 3.3V supply.
This clocked comparator included different MOSFET models and level shifters to account for the different voltage levels (3.3V analog domain, 1.8V digital domain)
The successive approximation register was formed using SKY130 standard cell logic blocks to make layout easier.
The digital block of the microcontroller was designed using verilog in multiple files. Here, the 4-bit ALU is displayed.
The digital components of the microcontroller were separately simulated using iverilog and GTKWave. I created test benches for each subcomponent to verify the designs separately.
The librelane automated place-and-route software was used to generate the layout for digital blocks. The RAM16 block is an efficient D flip-flop RAM macro, Here, the CPU is shown, with power rails and a port for an SPI memory device (right).
Layouts of the analog block were done using the magic layout software in a hierarchical manner. I leveraged standard cell blocks when possible, and laid out each subcomponent individually. On the left is a sample-and-hold register; on the right is the approximation register and logic.