Skip to content
DenseChip
Learn
PracticeCode labInterview

DenseChip

Navigate

Menu

LearnPracticeCode labInterview

Tools

All toolsSV editorCode repoResume
DenseChip

Practice, courses, and chip-design tools in one focused workspace.

LearnPracticeCode labInterviewToolsLearning paths

© 2026 DenseChip

AboutRoadmapCareersInternshipsFAQContactPrivacyTerms
Skip to lesson

Course contents

  • How to Use This Course
  • The NanoSoC Tour
  • Reading Path
  • SoC Glossary10
  • SoC Metrics Reference
  • SoC Cheatsheet
  • What SoC Integration Is12
  • Architecture and Budgets21
  • Memory Maps and Address Decode26
  • Interconnect and Bus Fabrics26
  • Clock and Reset Architecture24
  • Power Architecture21
  • Interrupts, DMA and Peripherals15
  • Memories, Boot and Security21
  • IP Integration and Handoff21
  • Top-Level Verification and Bring-up21
  • Package, Pads and I/O18
    • I/O Ring and Pad Types
    • Pad Count and Simultaneous Switching
      • Signal Versus Supply Pad Budget
      • Simultaneous Switching Noise Estimation
      • Power-Ground Pairing and Drive Strength
    • Package and Ballout
    • Power Delivery Through Package and Bumps
    • ESD and Latch-Up at the Top
    • Test and Debug Pins (extension)
  • Chip Signoff and Tapeout18
  • SoC Interview Prep16
  • Capstone: Integrate NanoSoC14
Loading lesson

←Pad Count and Simultaneous Switching
  1. Topics
  2. SoC Design
  3. Package, Pads and I/O
  4. Pad Count and Simultaneous Switching
  5. Simultaneous Switching Noise Estimation
On this page

    Part 11 of 14, lesson 5 of 18Part 11 of 14/Package, Pads and I/O/Lesson 5 of 18All levels

    Simultaneous Switching Noise Estimation

    SSO as a calculator input, not a textbook number: the allowance, the pattern check, and what to do when it fails.

    Why it matters

    On NanoSoC the dangerous pattern is concrete: firmware writes 0xFFFF to the GPIO data register with every pad set as an output, all 16 pads change on one clock edge, and the shared I/O supply bounces. If the bounce crosses an input threshold, a quiet input such as the UART receive pad misreads a bit, a framing error that appears on the board only and never in simulation. Estimation before tapeout is the only cheap place to catch it.

    The core idea

    Switching noise follows one mechanism: a changing current through the inductance of the supply path makes a voltage, proportional to the number of outputs switching together, their drive current and the edge rate. No lesson can hand you the inductance or the allowance as standard numbers, since both belong to a specific package and cell library, so the integrator treats the result as an input: the package data gives the number of outputs that may switch together per I/O supply pair, and the check compares the worst pattern with it. For NanoSoC that input is an illustrative limit of 8 outputs per VDD_IO and VSS_IO pair at the default drive (4 mA, medium slew), halving to 4 per pair at a stronger, fast drive. NanoSoC has two pairs, so the capacity is 2 x 8 = 16.

    The check is per supply pair, not per chip. Only the 16 GPIO pads can ever be outputs that matter: RESET_N, UART receive and SPI MISO are inputs, and the crystal pads are analog. The worst case is one APB write of 0xFFFF to the data register with the direction register at 0xFFFF, which flips all 16 pads on one clock edge; the peripheral functions use at most four outputs, a subset. Each GPIO pad is served by the nearest I/O pair along the ring: pair 0, on the east side, serves P0 to P7, and pair 1, on the south side, serves P8 to P15, with the farthest pad 5.5 slots (440 µm) from its pair. That gives 8 and 8 against a limit of 8: the check passes with zero margin. Any new output pad, or a fast drive, makes it fail, and the fix is a third pair.

    The fixes, in order of preference when a pattern fails: stagger the switching in software, lower the drive, regroup outputs onto the quieter pair, and only then add a supply pair. Staggering and lower drive cost nothing in silicon; a new pair costs two pads, and on NanoSoC two of the 9 spare slots.

    The pattern checker

    The script below builds the groups from the ring itself, so the groups follow the placement and not a hand-typed list. It checks the whole-port write at the default drive (8 and 8, pass), at the fast drive (limit 4, fail), and the same fast-drive write staggered into two phases (pass again). It then checks two layouts that must fail: both I/O pairs placed side by side, and a seventeenth output pad.

    example.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    RING = ["VDD_CORE0", "VSS_CORE0", "XTAL_IN", "XTAL_OUT", "VSS_CORE1", "VDD_CORE1", "RESET_N", "GPIO0",
            "GPIO1", "GPIO2", "GPIO3", "VDD_IO0", "VSS_IO0", "GPIO4", "GPIO5", "GPIO6",
            "GPIO7", "VSS_CORE2", "VDD_CORE2", "GPIO8", "GPIO9", "GPIO10", "VDD_IO1", "VSS_IO1",
            "GPIO11", "GPIO12", "GPIO13", "GPIO14", "GPIO15", "VSS_CORE3", "VDD_CORE3"]
    LIMIT_DEFAULT, LIMIT_FAST = 8, 4          # illustrative inputs per VDD_IO/VSS_IO pair
    
    def groups(ring):
        n = len(ring)
        centres = []
        for k in ("0", "1"):
            a, b = ring.index("VDD_IO" + k), ring.index("VSS_IO" + k)
            centres.append((a + b) / 2)
        out = {0: [], 1: []}
        for i, p in enumerate(ring):
            if p.startswith("GPIO"):
                d = [min(abs(i - c), n - abs(i - c)) for c in centres]
                out[d.index(min(d))].append(p)
        return out
    
    def worst(groups_, patterns, limit):
        for pair, pads in groups_.items():
            for firing in patterns:
                assert sum(1 for p in pads if p in firing) <= limit, (pair, limit)
    
    G = groups(RING)
    assert sorted(len(v) for v in G.values()) == [8, 8], G
    whole = [set(G[0]) | set(G[1])]
    worst(G, whole, LIMIT_DEFAULT)                       # passes with zero margin
    try:
        worst(G, whole, LIMIT_FAST)
        raise SystemExit("fast drive should fail")
    except AssertionError:
        pass
    phases = [set(G[0][:4]) | set(G[1][:4]), set(G[0][4:]) | set(G[1][4:])]
    worst(G, phases, LIMIT_FAST)                         # staggered: 4 per pair per phase
    bad = list(RING)                                     # P2: both I/O pairs side by side
    bad[13], bad[14], bad[22], bad[23] = "VDD_IO1", "VSS_IO1", "GPIO4", "GPIO5"
    GB = groups(bad)
    assert sorted(len(v) for v in GB.values()) != [8, 8], GB
    try:
        worst(GB, [set(GB[0]) | set(GB[1])], LIMIT_DEFAULT)
        raise SystemExit("a lopsided layout should fail")
    except AssertionError:
        pass
    G[0].append("GPIO16")                                # a 17th output pad
    try:
        worst(G, [set(G[0]) | set(G[1])], LIMIT_DEFAULT)
        raise SystemExit("a 17th output should fail")
    except AssertionError:
        pass
    print("PASS: 8 and 8 at the default drive (zero margin); fast drive fails; staggered passes; lopsided pairs and a 17th output fail")

    What the review looks for

    • The SSO limit quoted as a package input with its source, never as a textbook constant, and the drive it assumes.

    • The worst switching pattern per pair identified in words: which firmware write, which pads.

    • A failing pattern paired with its fix: stagger, lower drive, regroup, or add a pair, in that order.

    • The margin stated: here exactly zero, so the next output pad or drive change reopens the question.

    Verify and debug

    Extract the real patterns from firmware and the test plan: GPIO port writes and the SPI and UART functions are the usual worst cases. On the bench, an SSO suspect shows as data-dependent errors on a quiet neighbour: repeat the pattern with the aggressors held still, then with them switching, and the difference is the noise. For NanoSoC the symptom is UART framing errors that appear only when the GPIO port is written while a frame is arriving.

    Both I/O supply pairs placed next to each other in the ring. The nearest-pair rule then makes 13 GPIO outputs share one pair (limit 8) and only 3 the other; writing 0xFFFF to the GPIO port while a UART frame is arriving causes framing errors on the board, and simulation, even gate level, is clean. It is caught by the per-pair count above and fixed by putting one pair in each half of the ring.

    If asked for an SSN rule of thumb, give a clearly labelled guideline (a supply pair for every few simultaneously switching outputs, with the real number set by the package and library data) and say that the real limit is an input from the package. A strong answer also says what happens on the failing side: stagger, slow down, add a pair.

    Check yourself Why is the check per supply pair rather than per chip?

    Because the noise is local: the bounce appears on the supply path the switching current actually flows through. Sixteen outputs spread eight and eight over two pairs disturb each pair far less than sixteen on one pair, so only the per-pair worst count predicts the worst bounce.

    Related topics

    • Signal Versus Supply Pad Budget

    • Next: Power-Ground Pairing and Drive Strength

    • Package, PCB, and Via Effects

    Previous

    218 / 289

    Next: Power-Ground Pairing and Drive Strength

    Up next

    Up nextPower-Ground Pairing and Drive Strength

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error