Chip design · open-source flow

blinky

A clock divider that blinks an LED: the ChipForAll example, from RTL to GDS.

Built 2026-10-11 11:22 (UTC+8) · anlit75/ChipForAll · commit 59cc201 · CI run

5/5 on RTL5/5 on gates6/6 regression runs
Timing metSignoff clean

View sourceGDS · 274.1 kB

Layout of blinky
56.4 × 67.1 µm · 116 instances after routing · sky130A

Summary

die
56.4 × 67.1 µm
3,782.5 µm²
core utilization
51.7%
of a 45.1 × 43.5 µm core
instances
116
after routing, 65 after synthesis
clock
100 MHz
10 ns period
timing, worst slack
+5.96 ns
setup · 0 violations
+0.11 ns
hold · 0 violations
code coverage
100.0%
Block
100.0%
Branch
100.0%
Toggle
total power
0.143 mW
typical wire RC, typical transistors, 25 °C, 1.80 V
signoff
clean
DRC, LVS, antenna, XOR

Files: metrics.json 16.9 kB · history.json 3.6 kB

Tests: 5/5 on RTL, 5/5 on gates

The same cocotb tests, on the RTL and on the synthesized netlist with the PDK cell models.

Seeds: RTL 1791688714 · gates 1791688855. Each seed reruns its run exactly.

testRTLgates
reset_holds_led_lowPASSPASS
led_rises_half_a_period_after_resetPASSPASS
led_toggles_with_a_full_periodPASSPASS
reset_in_the_middle_restarts_the_countPASSPASS
random_resets_match_the_modelPASSPASS
History (7 commits)
RTL passed
  • passed
  • total
052.25.02.26.02.26.12.27.0b19b2d7: total 57b8d587: total 50cf182d: total 5b5f01fb: total 5ccca604: total 520b921b: total 559cc201: total 5b19b2d7: passed 57b8d587: passed 50cf182d: passed 5b5f01fb: passed 5ccca604: passed 520b921b: passed 559cc201: passed 5b19b2d759cc201
Gate level passed
  • passed
  • total
052.25.02.26.02.26.12.27.0b19b2d7: total 57b8d587: total 50cf182d: total 5b5f01fb: total 5ccca604: total 520b921b: total 559cc201: total 5b19b2d7: passed 57b8d587: passed 50cf182d: passed 5b5f01fb: passed 5ccca604: passed 520b921b: passed 559cc201: passed 5b19b2d759cc201

Files: cocotb-results.xml 1.3 kB · cocotb-gl-results.xml 1.3 kB

Regression: 6/6 runs passed

Each row is a module of the test list, run once for each of its seeds. Under it are the tests it holds.

Base seed 1780737999. make regress SEED=1780737999 reruns the list with the same seeds.

module and its testsseedsruns passed
test_blinky_random
  • random_resets_match_the_model
55/5
test_blinky_cocotb
  • reset_holds_led_low
  • led_rises_half_a_period_after_reset
  • led_toggles_with_a_full_period
  • reset_in_the_middle_restarts_the_count
11/1
History (7 commits)
Runs passed
  • passed
  • total
062.25.02.26.02.26.12.27.0b19b2d7: total 67b8d587: total 60cf182d: total 6b5f01fb: total 6ccca604: total 620b921b: total 659cc201: total 6b19b2d7: passed 67b8d587: passed 60cf182d: passed 6b5f01fb: passed 6ccca604: passed 620b921b: passed 659cc201: passed 6b19b2d759cc201

Files: regress-summary.json 682 B

Coverage

Code coverage of the RTL, from the 6 runs of Regression, run again under Verilator and merged.

kindcoveredshare
Block1 / 1100.0%
Branch2 / 2100.0%
Toggle19 / 19100.0%

Not measured: expression and FSM coverage. The Verilator in the image does not support them.

Coverage by module (1)
moduleblockbranchtoggle
blinky100.0%100.0%100.0%
History (7 commits)
Coverage (%)
  • Block
  • Branch
  • Toggle
01002.25.02.26.02.26.12.27.0b19b2d7: Block 100.0%7b8d587: Block 100.0%0cf182d: Block 100.0%b5f01fb: Block 100.0%ccca604: Block 100.0%20b921b: Block 100.0%59cc201: Block 100.0%b19b2d7: Branch 100.0%7b8d587: Branch 100.0%0cf182d: Branch 100.0%b5f01fb: Branch 100.0%ccca604: Branch 100.0%20b921b: Branch 100.0%59cc201: Branch 100.0%b19b2d7: Toggle 100.0%7b8d587: Toggle 100.0%0cf182d: Toggle 100.0%b5f01fb: Toggle 100.0%ccca604: Toggle 100.0%20b921b: Toggle 100.0%59cc201: Toggle 100.0%b19b2d759cc201

Files: coverage-summary.json 781 B

Timing

Timing is met: no setup or hold slack is negative.

Worst slack after routing, over every corner the flow analysed.

checkworst slackviolationsreg-to-reg
setup+5.96 ns0+6.38 ns
hold+0.11 ns0+0.11 ns

Slew, capacitance and fanout limits

Design rule violations after routing, against the limits in the run's constraints. They are warnings: the flow does not stop on them, and the timing verdict above leaves them out.

limitviolationscorners
max slew0none
max capacitance0none
max fanout0none
Constraints the run used (5)

From the post-route timing step. The slack above holds only for these values.

constraintvaluesource
clock period10 ns (100 MHz)set in config.yaml
clock uncertainty0.25 nsflow default
clock transition0.15 nsflow default
timing derate5%flow default
input and output delay20% of the clock period (2 ns)flow default
History (7 commits)
Setup WS (ns)
05.962.25.02.26.02.26.12.27.0b19b2d7: +5.96 ns7b8d587: +5.96 ns0cf182d: +5.96 nsb5f01fb: +5.96 nsccca604: +5.96 ns20b921b: +5.96 ns59cc201: +5.96 nsb19b2d759cc201
Hold WS (ns)
00.112.25.02.26.02.26.12.27.0b19b2d7: +0.11 ns7b8d587: +0.11 ns0cf182d: +0.11 nsb5f01fb: +0.11 nsccca604: +0.11 ns20b921b: +0.11 ns59cc201: +0.11 nsb19b2d759cc201

Files: blinky.sdc 1.6 kB

Area and Instances

Standard cell library sky130_fd_sc_hd, single threshold voltage.

Synthesis produced 822.0 µm² of instances. Place and route grew it by 23% to 1,014.7 µm².

Instances: 65 after synthesis, 116 after routing

Placed instances, by LibreLane class. Fill is not counted.

Drive strength of the instances (3 sizes)

Well taps, decap, fill and antenna diodes have no drive strength and are not counted.

drive strengthafter synthesisafter routing
X1017
X26569
X1603
Total6589

Place and route added 17 X1, 4 X2 and 3 X16 instances.

History (7 commits)
Area (µm²)
  • flip-flops
  • combinational logic
  • added by place and route
01,0152.25.02.26.02.26.12.27.0b19b2d7: flip-flops 420.4 µm²; combinational logic 401.6 µm²; added or resized by place and route 192.7 µm² (total 1,014.7 µm²)7b8d587: flip-flops 420.4 µm²; combinational logic 401.6 µm²; added or resized by place and route 192.7 µm² (total 1,014.7 µm²)0cf182d: flip-flops 420.4 µm²; combinational logic 401.6 µm²; added or resized by place and route 192.7 µm² (total 1,014.7 µm²)b5f01fb: flip-flops 420.4 µm²; combinational logic 401.6 µm²; added or resized by place and route 192.7 µm² (total 1,014.7 µm²)ccca604: flip-flops 420.4 µm²; combinational logic 401.6 µm²; added or resized by place and route 192.7 µm² (total 1,014.7 µm²)20b921b: flip-flops 420.4 µm²; combinational logic 401.6 µm²; added or resized by place and route 192.7 µm² (total 1,014.7 µm²)59cc201: flip-flops 420.4 µm²; combinational logic 401.6 µm²; added or resized by place and route 192.7 µm² (total 1,014.7 µm²)b19b2d759cc201
Instances
  • from synthesis
  • added by the flow
01162.25.02.26.02.26.12.27.0b19b2d7: from synthesis 65; added by the flow 51 (total 116)7b8d587: from synthesis 65; added by the flow 51 (total 116)0cf182d: from synthesis 65; added by the flow 51 (total 116)b5f01fb: from synthesis 65; added by the flow 51 (total 116)ccca604: from synthesis 65; added by the flow 51 (total 116)20b921b: from synthesis 65; added by the flow 51 (total 116)59cc201: from synthesis 65; added by the flow 51 (total 116)b19b2d759cc201

Files: blinky.nl.v 17.9 kB

Power

0.143 mW in total at corner nom_tt_025C_1v80 (typical wire RC, typical transistors, 25 °C, 1.80 V), clock 100 MHz. The table is in µW.

Switching activity is OpenSTA's default, 0.1 toggles per clock on data nets. It is not taken from simulation, so this estimates where power goes. It does not measure a workload.

groupinternalswitchingleakagetotalshare
Sequential64.90.0<0.164.945.5%
Combinational1.02.7<0.13.82.6%
Clock52.121.9<0.173.951.9%
Total118.024.6<0.1142.6100.0%

Static IR drop, worst: 0.18 mV, 0.0098% of 1.80 V, from OpenROAD (ir__drop__worst).

History (7 commits)
Total power (mW)
00.1432.25.02.26.02.26.12.27.0b19b2d7: 0.143 mW7b8d587: 0.143 mW0cf182d: 0.143 mWb5f01fb: 0.143 mWccca604: 0.143 mW20b921b: 0.143 mW59cc201: 0.143 mWb19b2d759cc201
Static IR drop, worst (% of supply)
00.00982.25.02.26.02.26.12.27.0b19b2d7: 0.0098%7b8d587: 0.0098%0cf182d: 0.0098%b5f01fb: 0.0098%ccca604: 0.0098%20b921b: 0.0098%59cc201: 0.0098%b19b2d759cc201

Signoff checks

The DRC row adds the errors of both tools.

checkerrorsresult
DRC Magic and KLayout0PASS
LVS0PASS
antenna checked by OpenROAD, not by DRC0PASS
XOR Magic GDS against KLayout GDS0PASS

Not analysed: electromigration, crosstalk and dynamic IR drop.

How it was built

One picture per stage of the real run, which took 1 min 7 s.

Floorplan: layout at the end of the stage
  • Synthesisno picture3.0 s

    RTL becomes gates; lint and a first timing check
    Your Verilog is checked, then turned into logic gates from the Sky130 cell library. There is no layout yet, so this stage has no picture.

  • Floorplan3.6 s

    pick the die size, power grid and tap cells
    The die is the outline of the chip. The empty rows are where gates will sit, and the stripes are the metal rails that bring power to them.

  • Placement8.7 s

    give every gate a place on the die
    Every gate now has a place on the die. The small colored blocks are the cells, packed into the rows.

  • Clock tree16 s

    build the clock distribution and fix its timing
    Extra buffers now carry the clock to every flip-flop at nearly the same moment. They are small cells added among the others.

  • Routing13 s

    draw the wires; repair antenna violations
    Metal wires now connect the gates. The colored lines drawn over the cells are wires on different metal layers.

  • Finish & GDS14 s

    fill, extract parasitics, final timing, write the GDS
    Filler cells close the gaps between the gates, and timing is measured again from the real wires. The picture is the layout that is written to the GDS file.

  • Signoff8.6 s

    DRC, LVS, antenna, XOR: can it be made?
    The checks a fab would run on the finished layout. This is the picture of that layout, the one that is handed over.

Files: floorplan.png 46.6 kB · placement.png 120.7 kB · clock-tree.png 130.6 kB · routing.png 162.3 kB · finish-gds.png 169.5 kB