An ECO (engineering change order) is a small change made to a design that is already placed and routed, without running the whole flow again. Late in a project, a full rerun means new placement, new routes and new timing everywhere, and every result checked so far has to be checked again. An ECO changes only the cells and wires that must change. This article explains the kinds of ECOs, the steps of a timing ECO in OpenROAD, and what one achieved on the routed 16x16 multiplier.

7 min read | Intermediate

What You'll Learn

  • Tell functional ECOs from timing ECOs
  • List the steps of a post-route timing ECO in OpenROAD
  • Judge the result of an ECO from extracted timing
  • Explain why an ECO cannot fix a structural timing problem

Kinds of ECOs

  • Timing ECO. Fix the last setup or hold violations after routing: upsize or downsize a few cells, insert a buffer or a delay cell, swap pins. The netlist function stays the same.
  • Functional ECO. Fix a logic bug found late, by changing a few gates. The RTL is fixed too, and a formal equivalence check confirms that the changed netlist matches the new RTL.
  • Metal-only ECO. A functional ECO after the base layers have been manufactured. Only the metal masks may change, so the new logic has to be built from spare cells that were placed in advance and left unconnected.

All three follow the same idea: make the smallest change, route only what changed, then repeat every check on the result.

A Timing ECO in OpenROAD

The multiplier at a 6 ns clock was placed, routed and extracted with the per-layer RC values of OpenROAD-flow-scripts, ending at -1.07 ns worst slack with 8 violating endpoints. The ECO continued from the routed design in the same session, with the extracted parasitics loaded:

remove_fillers
repair_timing -setup -skip_buffering -skip_gate_cloning -skip_pin_swap
detailed_placement
check_placement
detailed_route -output_drc drc_eco.rpt
filler_placement {sky130_fd_sc_hd__fill_1 sky130_fd_sc_hd__fill_2 sky130_fd_sc_hd__fill_4 sky130_fd_sc_hd__fill_8}
# extract again and check timing
  • Remove fillers. The filler cells occupy every gap in the rows. A larger cell needs room, so the fillers come out first and go back at the end.
  • Repair, sizing only. Buffering, cloning and pin swaps are switched off, so the netlist keeps its nets and only cell sizes change. Each changed cell is a local edit.
  • Legalize. detailed_placement fits the resized cells into the rows, moving their neighbours as little as possible.
  • Reroute. detailed_route runs again on the routed design and fixes the connections and spacing violations that the moved and resized cells created.
  • Refill, re-extract and check. The final timing, DRC and LVS must all be run again on the changed layout.

What It Achieved

The repair upsized 9 cells, for 0.2 % more area. Detailed routing then started from 139 violations around the changed cells and cleared them in four passes:

[INFO DRT-0199]   Number of violations = 139.
[INFO DRT-0199]   Number of violations = 41.
[INFO DRT-0199]   Number of violations = 38.
[INFO DRT-0199]   Number of violations = 0.
Multiplier, 6 ns clockBefore the ECOAfter the ECO
Worst setup slack, extracted-1.07 ns-1.06 ns
Total negative slack, extracted-4.81 ns-4.50 ns
Cell area11,097 um211,118 um2
Routed wire length-29,685 um

The whole ECO took about two minutes: 20 seconds for the repair and legalization, then 41 seconds of pin access analysis and 55 seconds of routing passes. In other runs of the multiplier at the same utilization, a full detailed route took about two minutes, so on a block this small the saving is small. On a large block, where the full flow takes hours, changing and rerouting only a small region is what makes late fixes practical.

The result is typical of a timing ECO on a structural problem. The total negative slack fell by 6 %, because several endpoints that were close to passing got a little faster. The worst path barely moved: it was already made of cells sized as large as repair found useful, and its 32 stages remain. As shown in Fixing Setup in Layout, that path needs a design change, not an ECO.

Quick Check

Q: Why does the ECO remove the filler cells before resizing, and put them back afterwards?

Show Answer

Fillers occupy all the free sites in the rows, so a cell that grows would overlap one. Removing them gives the legalizer free sites to use. After legalization, new fillers close the gaps again, which is needed for continuous wells and rails.

Parasitics During an ECO

A resized cell has pins in slightly different places, so the wires to it change, and so do their parasitics. During the repair the extracted values for those nets are no longer valid. OpenROAD fell back to estimating the changed nets from their old global routes, and warned where a moved pin was no longer covered:

[WARNING GRT-0304] Fail to restore routing segments from guides for net _0970_. The following pins are not covered: _1952_/X .
[WARNING EST-0026] Missing route to pin _1952_/X in net _0970_.

The repair therefore makes its choices with a mix of extracted and estimated parasitics, and its own report is only a guide. During the ECO its table showed the worst slack moving from -1.073 to -1.081 ns; after rerouting and a new extraction it was -1.06 ns. The extraction after the ECO is the number that counts.

Quick Check

Q: After the ECO, which checks must be repeated, and why not only timing?

Show Answer

Extraction and timing, because the parasitics of the changed nets are new; DRC, because rerouted wires and moved cells can break spacing rules; LVS, because the layout must still match the netlist; and antenna checks, because new wire segments can create new antenna ratios. An ECO changes the layout, so every layout check applies again.

Running It in ChipVerify Lab

Run Place and Route on the multiplier at 6 ns and note the worst slack and the violating endpoints. With PRO, an ECO run continues from that job's routed layout: choose the earlier job and give the ECO commands. The flow reports the timing before the ECO, removes the fillers, runs the commands, legalizes, reroutes, puts the fillers back and runs the full sign-off again: extraction, timing, DRC and LVS. The sizing-only repair of this article, repair_timing -setup -skip_buffering -skip_gate_cloning -skip_pin_swap, resized 18 cells and took the worst slack from -1.06 to -1.03 ns, with clean DRC and LVS, in about a minute and a half. Single changes work the same way, for example replace_cell _2416_ sky130_fd_sc_hd__dfxtp_4 to swap one flip-flop for a stronger one. The ECO log also shows the EST-0026 warnings described below.

Common Mistakes

Mistake #1: Trusting the repair report during an ECO

The repair works with partly estimated parasitics for the nets it changes. Reroute, extract again and judge the ECO by the new extracted timing.

Mistake #2: Forgetting the fillers and the physical checks

Leaving the fillers out breaks the rows; skipping DRC and LVS after the ECO leaves rerouted wires unchecked.

Mistake #3: Using ECOs to fix structural timing problems

An ECO helps paths that are close to passing. A path that misses by a large margin needs a change in the RTL, the constraints or the floorplan.

Practice Exercise

Challenge: Planning Spare Cells

A block will be manufactured and may need a metal-only ECO later. The team places spare cells: 20 two-input NAND gates, 20 inverters and 10 flip-flops, spread evenly over the core and tied off. A late bug needs a new AND gate between two signals, feeding one existing flip-flop. Which spare cells can implement it, and why should spare cells be spread over the core instead of grouped in one corner?

Hint

AND = NAND followed by an inverter. Think about the wire length from the spare cells to the signals that need them.

Solution

One spare NAND followed by one spare inverter gives the AND function; only metal connections change. Spread spare cells mean there is usually one close to any place a fix is needed, so the new wires are short and do not disturb timing on the paths around them. Spare cells grouped in a corner would need long wires across the block.

Open the ready-made example in the lab, synthesize it and run Place and Route.

Summary

  • Timing, functional and metal-only ECOs change a routed design locally instead of rerunning the flow.
  • A timing ECO in OpenROAD removes fillers, resizes cells, legalizes, runs detailed routing again to fix what the changes broke, refills, extracts again and checks.
  • On the multiplier the ECO upsized 9 cells and rerouted in four passes; TNS improved by 6 %, the worst path barely moved.
  • During the repair, changed nets use estimated parasitics; only the extraction after the ECO counts.
Did you find what you were looking for?

Quiz

Test Your Knowledge

1 of 5 Score: 0 / 5