A template for mixed-signal ASIC design using open-source tools, featuring automated workflows for digital, analog, and integration for TinyTapeout chip projects.
The UWASIC template provides a structured approach to ASIC design with three distinct workflows:
- Digital flow: RTL-to-GDS using OpenLane2
- Analog flow: Schematic-driven layout using Xschem/Magic
- Mixed-signal flow: Combined analog and digital designs
- TinyTapeout integration: Tapeout-ready chip submission to Efabless
- Quick Start
- Environment Setup
- Project Management
- Command Reference
- Project Structure
- Digital Workflow
- Analog Workflow
- Mixed-Signal Workflow
- TinyTapeout Integration
- Workflows and CI/CD
Navigate to the flows/ directory and choose your project type:
cd flows/
# Digital-only project
make CreateProject PROJECT_NAME=my_counter PROJECT_TYPE=digital
# Analog-only project
make CreateProject PROJECT_NAME=my_opamp PROJECT_TYPE=analog
# Mixed-signal project (digital + analog)
make CreateProject PROJECT_NAME=my_processor PROJECT_TYPE=mixedmake help # Show all available commands
make status # Show current project modules and their parents
make DeleteAll # Clean up all projectsThe template uses Nix to ensure consistent tool versions across all platforms.
# Install Nix (single-user)
sh <(curl -L https://nixos.org/nix/install) --no-daemon
# Enable flakes
mkdir -p ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
# Restart shell
exec $SHELL# Due to finicky mac support,
# all mac users must run a docker wrapper around nix-shell
# Which makes it slower, but usable!
chmod +x mac_shell.sh
./mac_shell.sh# In PowerShell as Admin
wsl --install
# Restart, then in WSL2 Ubuntu:
sh <(curl -L https://nixos.org/nix/install) --no-daemon
# Enable modern Nix features
mkdir -p ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
# Restart your shell
exec $SHELLFrom the project root:
# For WSL and Linux users
nix-shell
# For macos
./mac_shell.sh # This will always be your entry instead of nix-shell
# NOTE: Whenever you get python installation errors of UWASIC-ALG or gmid, then you need to,
rm -rf .venv
# Then re-run the shellThis provides all necessary tools:
- Digital: OpenLane2, Yosys, Icarus Verilog, cocotb, slang
- Analog: Xschem, Magic, ngspice, netgen, KLayout
- Verification: CACHE, OpenSTA
The template tracks project state automatically:
none: No projects createddigital: Digital-only projectanalog: Analog-only projectmixed: Combined digital + analog project
After creating projects, your directory structure will be:
uwasic-template/
├── .github/ # Automated workflows
├── shell.nix # Nix environment configuration
├── flows/ # Project management system
│ ├── Makefile # Main project commands
│ └── templates/ # Project templates
├── digital/ # Digital design projects
│ └── project_name/
│ ├── build/ # Build system (synthesis, verification)
│ ├── src/ # RTL source files
│ └── test/ # Testbenches and verification
├── analog/ # Analog design projects
│ ├── library/ # Shared analog IP library
│ ├── build/ # Build system (layout, validation)
│ ├── layout/ # Magic layout files
│ ├── schematics/ # Xschem schematic files
│ └── symbols/ # Xschem symbol files
└── caravel/ # TinyTapeout submission package
├── src/ # Verilog wrapper and sources
├── analog/ # Copied analog project files
├── docs/ # Documentation
└── info.yaml # TinyTapeout project configuration
-
Digital Projects:
- Can have child analog modules with
PARENTparameter - Use
src/directory for internal submodules
- Can have child analog modules with
-
Analog Projects:
- Child modules automatically symlink
.gdsfiles to parent'slayout/dep/directory
- Child modules automatically symlink
-
Mixed-Signal Projects:
- Combine both analog and digital components
- Digital components must implement TinyTapeout interface
The digital flow uses OpenLane2 for automated RTL-to-GDS conversion with comprehensive verification. However, the final conversion will be done with github workflows after caravel/ is formed and it is pushed.
digital/
└── <project_name>/
├── build/ # Build system
│ ├── config.mk # Project configuration
│ ├── des_tb/ # RTL simulation
│ ├── lint/ # Static analysis
│ ├── synthesis/# Physical synthesis
│ └── verification/ # Formal verification
├── src/ # RTL source files (.v, .sv)
└── test/ # Testbenches and cocotb tests
cd digital/your_project/build/des_tb
make test-rtlcd digital/your_project/build/lint
make lintcd digital/your_project/build/synthesis
make synthesis # Synthesis only
make harden # Full flow to GDScd digital/your_project/build/verification
make verificationThe analog flow uses Xschem for schematic capture and Magic for layout, with comprehensive DRC/LVS verification.
analog/
├── library/ # Shared analog IP library
├── build/
│ ├── config.mk # Project configuration
│ ├── layout/ # Layout tools
│ ├── schematic/ # Schematic tools
│ └── validation/ # DRC/LVS verification
├── layout/ # Magic layout files (.mag)
├── schematics/ # Xschem schematics (.sch)
│ └── testbenches/ # Testbench schematics
└── symbols/ # Xschem symbols (.sym)
cd analog/build/schematic
make setup # Organize files
make schematic # Open Xschemcd analog/build/layout
make layout # Open Magiccd analog/build/schematic
make spice # Run simulationscd analog/build/validation
make magic_test # Magic DRC/LVS
make klayout_test # KLayout verification
make full_verification # Complete suiteMixed-signal projects combine digital and analog designs into a single tapeout-ready submission.
# Create mixed-signal project with both components
make CreateProject PROJECT_NAME=mixed_adc PROJECT_TYPE=mixed
# Add additional modules as needed
make AddModule MODULE_NAME=adc_core MODULE_TYPE=analog PARENT=mixed_adc
make AddModule MODULE_NAME=digital_filter MODULE_TYPE=digital PARENT=mixed_adc
# Create TinyTapeout integration
make CreateCaravel PROJECT_NAME=tt_mixed_adcThe template automatically tracks project states and allows:
- Multiple analog modules with parent-child relationships
- Digital modules that implement TinyTapeout interface
- Automatic integration of both domains in Caravel generation
TinyTapeout integration creates submission-ready packages for the Efabless shuttle program. The template automatically generates proper pin assignments, power connections, GitHub Actions workflows, and project configuration files.
- Interface: Standard TinyTapeout digital interface (8 inputs, 8 outputs, 8 bidirectional)
- Tile Configuration: 1x1 tiles for digital projects
- Testing: Includes gate-level testing workflows
- Pin Assignment: Uses
ua[5:0]analog pins (configure count ininfo.yaml) - Power Connections: Includes
VGND,VDPWR, andVAPWRconnections - Tile Configuration: Defaults to 1x2 tiles for analog projects
- Pin Limits: Up to 6 analog pins
- Tile Configuration: 2x2 tiles for mixed projects
- Analog Interface: Proper
ua[]pin assignments - Digital Integration: Complete TinyTapeout digital interface
- Power Distribution: Separate analog and digital power domains
The template automatically generates GitHub Actions workflows based on project type for automated verification and tapeout preparation.
When you create a TinyTapeout project, appropriate workflows are automatically generated but are only run on the caravel/ directory, so you need to create one:
make CreateCaravel PROJECT_NAME=my_chipgds.yaml: GDS generation and precheck using TinyTapeout actionsdocs.yaml: Documentation generation workflow
test.yaml: RTL simulation using Icarus Verilog + cocotbfpga.yaml: FPGA implementation for ICE40UP5K platform
- Automated Testing: RTL and gate-level simulation
- FPGA Prototyping: Automatic bitstream generation
- Analog Characterization: Automated circuit parameter extraction
- Documentation: Automatic generation of project documentation
- Tapeout Preparation: GDS generation with precheck validation
Check current project state:
make statusView all available commands:
make helpClean up and restart:
make DeleteAll# Create digital project
make CreateProject PROJECT_NAME=counter_demo PROJECT_TYPE=digital
# Implement your counter in digital/counter_demo/src/counter_demo.v
# Create tests in digital/counter_demo/test/
# Create TinyTapeout integration
make CreateCaravel PROJECT_NAME=tt_counter_demo
# Check status
make status# Create analog project
make CreateProject PROJECT_NAME=amplifier PROJECT_TYPE=analog
# Create TinyTapeout integration
make CreateCaravel PROJECT_NAME=tt_amplifier
# Check status
make status# Create mixed-signal project
make CreateProject PROJECT_NAME=mixed_adc PROJECT_TYPE=mixed
# Add additional modules
make AddModule MODULE_NAME=digital_filter PARENT=mixed_adc
# Create TinyTapeout integration
make CreateCaravel PROJECT_NAME=tt_mixed_adc
# Check status
make status