Complete end-to-end ASIC implementation project demonstrating the full RTL-to-GDSII flow using OpenLane and SkyWater 130nm PDK.
Design: 8-bit Up/Down Counter with Reset and Enable
Target PDK: SkyWater Sky130
Flow: OpenLane (Yosys + OpenROAD + Magic)
Goal: Identify bottlenecks and demonstrate Python-based automation
asic_hello_world/
βββ rtl/
β βββ counter.v # 8-bit Up/Down Counter RTL
βββ tb/
β βββ counter_tb.v # Testbench for functional verification
βββ openlane/
β βββ config.json # OpenLane configuration
βββ scripts/
β βββ automation_proposal.py # Python automation framework
βββ docs/
β βββ config_parameters.md # Config parameter deep dive
β βββ flow_guide.md # Complete flow walkthrough
βββ README.md
# Install iverilog if not already installed
sudo apt-get install iverilog gtkwave
# Run simulation
cd asic_hello_world
iverilog -o counter_sim tb/counter_tb.v rtl/counter.v
vvp counter_sim
# View waveforms
gtkwave counter_tb.vcd# Set up environment
export OPENLANE_ROOT=/path/to/openlane
export PDK_ROOT=/path/to/skywater-pdk
# Start OpenLane Docker
cd $OPENLANE_ROOT
make mount
# Inside Docker container - Interactive mode
./flow.tcl -interactive
package require openlane 0.9
prep -design /project/openlane/counter
run_synthesis
run_floorplan
run_placement
run_cts
run_routing
run_magic
run_magic_drc
run_lvs
# OR - Automated mode
./flow.tcl -design /project/openlane/counter# View synthesis reports
cat runs/<run_name>/reports/synthesis/1-synthesis.AREA_0.stat.rpt
# View timing reports
cat runs/<run_name>/reports/cts/sta.rpt
# View DRC violations
cat runs/<run_name>/reports/signoff/drc.rpt
# View final GDSII
klayout runs/<run_name>/results/signoff/counter.gds| Parameter | Value | Purpose |
|---|---|---|
CLOCK_PERIOD |
10.0 ns | Target clock frequency (100 MHz) |
FP_CORE_UTIL |
50% | Core area utilization |
PL_TARGET_DENSITY |
0.55 | Placement density |
SYNTH_STRATEGY |
AREA 0 | Balanced area/timing optimization |
DIODE_INSERTION_STRATEGY |
3 | Antenna violation prevention |
See docs/config_parameters.md for detailed explanations.
| Stage | Tool | Duration | Common Failures | Fix |
|---|---|---|---|---|
| Synthesis | Yosys | ~30s | Timing violations | β CLOCK_PERIOD |
| Floorplan | OpenROAD | ~10s | Die size issues | Adjust FP_CORE_UTIL |
| Placement | RePlAce/OpenDP | ~1-2m | Overflow, congestion | β PL_TARGET_DENSITY |
| CTS | TritonCTS | ~30s | High skew | Adjust CTS_TARGET_SKEW |
| Routing | TritonRoute | ~2-5m | DRC violations | β Density, β GLB_RT_ADJUSTMENT |
| Signoff | Magic/Netgen | ~1-2m | DRC/LVS failures | Manual layout fixes |
See docs/flow_guide.md for complete stage-by-stage breakdown.
The scripts/automation_proposal.py demonstrates:
- Report Parsing: Extract metrics from Yosys, OpenSTA, and DRC reports
- Bottleneck Detection: Identify timing, area, and routing issues
- Parameter Tuning: Automatically adjust
config.jsonbased on failures - Iterative Optimization: Re-run flow with updated parameters
# Parse synthesis reports
area, errors = SynthesisReportParser.parse_stat_report(report_path)
# Analyze timing
timing, errors = TimingReportParser.parse_sta_report(sta_report)
# Detect bottlenecks
suggestions = BottleneckAnalyzer.analyze_routing(result)
# Auto-tune parameters
tuner.adjust_for_routing_congestion()python3 scripts/automation_proposal.py- β Unmapped cells β Check RTL for unsupported constructs
- β Timing violations β Increase
CLOCK_PERIODor useSYNTH_STRATEGY = DELAY 0
- β Overflow β Reduce
PL_TARGET_DENSITYby 0.05-0.10 - β Congestion β Reduce
FP_CORE_UTILby 5-10%
- β DRC violations β Reduce density, increase
GLB_RT_ADJUSTMENT - β Antenna violations β Ensure
DIODE_INSERTION_STRATEGY = 3
- β LVS mismatch β Check for shorts or missing connections
- β DRC failures β Manually edit layout in Magic
- Timing Report Parser: Extract WNS/TNS from STA reports β Auto-adjust
CLOCK_PERIOD - DRC Violation Tracker: Parse DRC reports β Suggest density reduction
- Congestion Analyzer: Parse placement logs β Predict routing failures
- Parameter Sweep: Grid search over
FP_CORE_UTILΓPL_TARGET_DENSITY - Regression Testing: Track metrics across design iterations
- Visualization: Plot area vs. timing trade-offs
pandas: Report data analysismatplotlib/seaborn: Visualizationsubprocess: Flow executionre: Log parsing
- config_parameters.md: Deep dive into OpenLane parameters
- flow_guide.md: Complete flow walkthrough with commands and artifacts
After completing this project, you will understand:
- β Complete RTL-to-GDSII flow using OpenLane
- β
Impact of
FP_CORE_UTILandPL_TARGET_DENSITYon routing - β How to debug synthesis, placement, and routing failures
- β Where manual intervention is required in the flow
- β How to automate report parsing and parameter tuning with Python
- OpenLane: v2.0+ (with Docker)
- PDK: SkyWater Sky130
- Simulation: iverilog, gtkwave
- Python: 3.8+ (for automation scripts)
- Viewer: KLayout (for GDSII viewing)
This is a learning project. Feel free to:
- Add more complex designs
- Improve the automation framework
- Add visualization scripts
- Document additional bottlenecks
MIT License - Feel free to use for learning and research.