Signal integrity fixes reduce the coupling between neighbouring wires on the nets where it matters: the critical paths, the clocks and the nets that must never glitch. The coupling itself is explained in Crosstalk, Shielding and Non-Default Rules. This article is about applying the fixes after routing has shown where they are needed: choosing the nets, applying extra spacing to them, measuring the result in the extracted parasitics, and knowing what an open-source timer can and cannot tell you about it.

7 min read | Intermediate

What You'll Learn

  • Choose which nets need signal integrity fixes
  • Apply extra spacing to selected nets with a non-default rule
  • Measure coupling before and after from the SPEF file
  • Explain the limits of a timer without crosstalk analysis

Which Nets to Fix

Coupling is everywhere: in the extracted multiplier at a 6 ns clock, 2,145 fF of the 4,860 fF of total net capacitance, 44 %, is coupling to neighbouring nets. Fixing all of it would mean spacing every wire apart, which the routing resources cannot afford. The fixes go where coupling costs the most:

  • Critical timing paths. A delay change from a switching neighbour can turn a path with little slack into a violation. These nets come from the timing report.
  • Clock nets. A glitch on a clock is an extra clock edge, and delay changes on the clock become skew and jitter.
  • Asynchronous resets and other glitch-sensitive nets. A noise bump on a reset can clear a flip-flop.
  • Long parallel buses where many bits switch at the same time in the same direction or opposite directions.

Signal integrity tools rank nets by computed noise and delta delay. Without one, the timing report and the extracted coupling per net are the best guides.

Spacing the Critical Path

The worst path of the multiplier after clock tree synthesis was collected in the script, and every signal net on it got a rule with double spacing before global routing. Clock nets and ports were left out:

create_ndr -name sp2 -spacing {*2}
set crit {}
set pe [lindex [find_timing_paths -path_delay max -group_path_count 1] 0]
foreach pin [[$pe path] pins] {
    set n [get_nets -quiet -of_objects $pin]
    if {$n != "" && $n ne "NULL"} {
        set nm [get_full_name $n]
        # signal nets only: no clock nets, no ports
        if {![string match clk* $nm] && [llength [get_ports -quiet $nm]] == 0} {
            lappend crit $nm
        }
    }
}
foreach nm [lsort -unique $crit] {
    assign_ndr -ndr sp2 -net $nm
}
global_route

The rule sets twice the default spacing on every layer and keeps the default width. It was applied to 30 nets. After detailed routing and extraction, the same 30 nets compared with the run without the rule:

The 30 critical-path netsDefault rulesDouble spacing
Coupling capacitance35.1 fF (41 %)19.1 fF (26 %)
Ground capacitance50.2 fF55.6 fF
Total capacitance85.3 fF74.7 fF
Routed wire length518 um542 um
Worst setup slack, extracted-1.07 ns-1.00 ns
Total negative slack, extracted-4.81 ns-4.64 ns
  • Coupling fell by 46 %. With twice the space, the neighbours are farther away and part of the coupling turns into capacitance to the layers above and below, which is why the ground part grew.
  • The total fell by 12 %, so the path also got a little faster: 0.07 ns on the worst slack.
  • The wires got 5 % longer, because the spaced nets cannot take every track their default route would use.

Unlike the clock rule in the crosstalk article, which doubled width and spacing and left the total capacitance almost unchanged, spacing alone lowers the total as well. Width lowers resistance; spacing lowers coupling.

Quick Check

Q: Why were clock nets left out of the rule in this experiment, even though clocks are the most common target of non-default rules?

Show Answer

To measure one change at a time. The worst path includes the clock pins of its flip-flops, so a rule on every net of the path would also change the clock tree, and the slack difference could then come from the clock as well as from the data path. Clock rules are a separate decision with their own trade-offs.

What the Timer Does Not See

OpenROAD's timer, OpenSTA, reads the coupling capacitances from the SPEF file but has no crosstalk analysis: it does not compute noise bumps, and it does not change a net's delay depending on whether its neighbours switch at the same time. Coupling counts as ordinary load. The 0.07 ns gain above is therefore only the effect of the lower total capacitance.

A signal integrity tool would also credit the 46 % lower coupling. It computes, for each victim net, the timing windows of its aggressors, and adds a delta delay when they can switch at the same time in opposite directions. In the worst case a coupling capacitance acts as twice its value, as shown in the crosstalk article. On the 30 nets above that is a difference of 2 x 35.1 = 70 fF of worst-case effective load against 2 x 19.1 = 38 fF, much larger than the 10.6 fF difference the timer saw.

In an open-source flow, keep timing margin on paths with a high coupling share, and use spacing and shielding where a failure would be costly. The theory of delta delay and glitch analysis is in the STA tutorial articles on crosstalk delay and crosstalk noise.

Quick Check

Q: The spaced nets showed 10.6 fF less total capacitance in the timer. Why can the real benefit on a critical path be larger?

Show Answer

The timer counts each coupling capacitance once, as if the neighbour were quiet. When a neighbour switches in the opposite direction at the same moment, the voltage across the coupling capacitance changes twice as much and it acts like twice its value. Spacing removed 16 fF of coupling, which in that worst case is about 32 fF of effective load, three times what the timer credited.

Other Fixes After Routing

  • Driver upsizing on the victim. A stronger driver holds the victim closer to its value and recovers faster from a bump. It is a cell swap, so it fits an ECO.
  • Downsizing or slowing the aggressor. A slower edge injects less charge through the coupling capacitance, if the aggressor's own timing allows it.
  • Buffer insertion. Splitting a long victim net shortens each parallel run with its aggressors.
  • Shielding. Routing a power or ground wire beside a sensitive net replaces its coupling with ground capacitance. It costs a track on each side.
  • Layer changes. Moving a net to a layer with fewer or more distant neighbours breaks the parallel run.

Running It in ChipVerify Lab

Run Place and Route on the multiplier and look at the critical path in the timing report. The lab's flow extracts the routed design, coupling capacitance included, and its final timing uses the extracted values, although OpenROAD does not turn coupling into crosstalk delay, as described in Crosstalk, Shielding and Non-Default Rules. With PRO, the Clock NDR option gives the clock nets double width and spacing, and the routing layer options keep signal or clock nets on chosen layers; other non-default rules can be added before global_route in a custom script.

Common Mistakes

Mistake #1: Reading a clean OpenSTA report as signal-integrity clean

OpenSTA counts coupling as plain load. Glitches and delta delay are not in its report, however large the coupling.

Mistake #2: Spacing nets that are not critical

Each spaced net takes extra tracks. Choose the nets from the timing report and the coupling per net, not by default.

Mistake #3: Changing several things in one experiment

A rule that also catches the clock nets changes the clock tree too, and the result can no longer be credited to the data path.

Practice Exercise

Challenge: Effective Load on a Victim

A critical net has 4 fF of ground capacitance and 3 fF of coupling to one neighbour, plus 5 fF of pin capacitance. What load does OpenSTA use? What is the worst-case effective load if the neighbour switches in the opposite direction at the same time? And if the net is spaced so that the coupling falls to 1.5 fF and the ground capacitance rises to 4.5 fF?

Hint

OpenSTA adds all capacitances; the worst case doubles the coupling part.

Solution

OpenSTA: 4 + 3 + 5 = 12 fF. Worst case: 4 + 2 x 3 + 5 = 15 fF. After spacing, OpenSTA: 4.5 + 1.5 + 5 = 11 fF; worst case: 4.5 + 3 + 5 = 12.5 fF. The timer sees a 1 fF improvement, while the worst case improves by 2.5 fF.

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

Summary

  • Signal integrity fixes target critical paths, clocks, resets and parallel buses, where coupling costs the most.
  • Double spacing on the multiplier's 30 critical-path nets cut their coupling by 46 % and their total capacitance by 12 %, for 5 % more wire.
  • OpenSTA counts coupling as ordinary load, so it showed only a 0.07 ns gain; crosstalk analysis would credit the lower coupling as well.
  • Upsizing victims, slowing aggressors, buffering, shielding and layer changes are the other fixes after routing.
Did you find what you were looking for?

Quiz

Test Your Knowledge

1 of 5 Score: 0 / 5