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

AboutContactPrivacyTerms
Skip to lesson

Course contents

  • How to Use This Course
  • Reading Paths
  • Concept Map
  • Meet DCRouter
  • Glossary
  • Part 0: What Verification Is8
  • Part 1: What Can Go Wrong11
    • A Taxonomy of Bugs
    • Specification Bugs
    • Corner Cases and Boundaries
    • Concurrency and Races
    • Integration and Interface Bugs
    • Configuration and Mode Bugs
    • Performance Bugs
    • Reset, Clock and Power Bugs
    • Where Bugs Hide
    • Classifying the Bug Zoo
    • Drills: What Can Go Wrong
  • Part 2: Specifications as Checkable Rules8
  • Part 3: Observability and Controllability7
  • Part 4: Stimulus11
  • Part 5: Checking11
  • Part 6: Coverage10
  • Part 7: Formal and Simulation10
  • Part 8: Verification Levels and Reuse8
  • Part 9: Planning and Risk9
  • Part 10: Emulation and Prototyping8
  • Part 11: Post-Silicon Validation8
  • Part 12: Bug Economics8
  • Part 13: Debug7
  • Part 14: Sign-Off7
  • Part 15: Verification in Context8
  • Part 16: Case Studies5
  • Part 17: Capstones5
  • Part 18: Interview Preparation6
Loading lesson

‹Part 1: What Can Go Wrong
  1. Topics
  2. First Principles of Verification Strategy
  3. Part 1: What Can Go Wrong
  4. A Taxonomy of Bugs

Part 1 · What Can Go Wrong · Working (W)

A Taxonomy of Bugs

Bugs fall into recognisable classes, each hiding in a different place and found by a different technique. A working taxonomy (specification, corner case, concurrency, integration, configuration, performance, reset, clock and power, error handling) and why knowing the class tells you where to look.

On this page

    Note

    Level: Working (W) · Answers: What can go wrong?

    Before this: Meet DCRouter

    Ask ten verification engineers what bugs they found last year and the answers sound different but sort into a few piles: a FIFO overflowed when it was exactly full, two events in one cycle were handled as if one came first, a block assumed its neighbour would never stall, a register reset to the wrong value, the design was correct but too slow. Each pile has its own hiding places, and its own technique that finds it.

    What kinds of bugs are there, and why does the kind matter?

    The obvious answer, and why it breaks

    The obvious view treats bugs as one undifferentiated thing: write enough tests and they will turn up. But a technique that finds one class is nearly blind to another. Random traffic finds races but rarely misconfigured registers; register tests find reset values but never starvation; functional checks never see a performance bug at all. Without a taxonomy, a team cannot tell which classes its plan is missing until silicon tells it.

    The idea: classes, where they hide, what finds them

    Class

    What goes wrong

    Hides in

    Usually found by

    Specification

    The document is wrong, ambiguous or incomplete

    Assumptions nobody wrote down

    Spec review, independent readings, validation

    Corner case and boundary

    Off-by-one at full, empty, maximum, wrap-around

    Limits of counters, FIFOs, lengths

    Biased random, directed boundary tests, formal

    Concurrency and race

    Two events in one cycle handled as if ordered

    Simultaneous push and pop, grant and release

    Random timing, back-pressure, formal

    Integration and interface

    Blocks agree with themselves but not each other

    Boundaries between blocks and teams

    Subsystem and SoC tests, protocol checkers

    Configuration and mode

    Wrong behaviour in some setting combinations

    Parameters, registers, modes

    Configuration coverage, randomised setup

    Performance and fairness

    Correct results, too slow or unfair

    Arbiters, credits, queues

    Performance checks, latency and fairness monitors

    Reset, clock and power

    Wrong reset values, crossings, power states

    Initialisation, domain boundaries, sleep and wake

    Reset tests, CDC tools, power-aware simulation

    Error handling

    Faults handled wrongly or not reported

    Rarely exercised error paths

    Error injection, negative tests

    Flowchart: for a new feature or block, ask in turn whether the specification could be wrong or vague, whether it has limits, whether two events can meet in one cycle, whether it touches another block or team, whether it has modes or registers, whether it could be slow or unfair, and whether reset, clocks, power or errors are involved. Each yes adds a bug class and its technique to the plan.
    Walking each feature through the classes turns the taxonomy into a checklist of what the plan must cover.

    Why the class matters

    • It tells you where to look: a FIFO's bugs are at its limits; an arbiter's at simultaneous requests and in fairness.

    • It tells you which technique to use: a class that random stimulus rarely reaches needs biasing, directed tests or formal (Part 4, Part 7).

    • It shows gaps in a plan: map the plan's techniques against the classes; an empty row is a class nobody is looking for.

    • It turns escapes into lessons: classifying every escaped bug shows which technique the plan was missing.

    How real teams use a taxonomy

    Practice

    Purpose

    Bug class as a field in the bug tracker

    Shows which classes are being found, and when

    Plan reviews against the class list

    Finds classes no technique covers

    Escape post-mortems by class

    Feeds missing techniques back into the next plan (Part 16)

    The DCRouter Bug Zoo

    In this course: 24 planted bugs spread across these classes, used to measure each technique

    What breaks

    A team (illustrative) reviewed its bug tracker at tape-out and saw 140 bugs, nearly all functional and corner-case bugs found by random simulation. Not one performance or power bug had been filed, and nobody had asked why. In silicon, the first two escapes were a starved low-priority queue and a wake-up that failed from one sleep state: classes the plan had no technique for, so they could not have been found.

    Why this matters

    Senior lens. When you review a verification plan, read it against the bug classes, not against the feature list: for each class, which technique would find a bug of this kind, here? A plan can cover every feature and still have no way to find a whole class, and the bug tracker will look healthy right up until silicon.

    Interview

    Asked: "What kinds of bugs have you found, and how?"

    Weak answer: Lots of functional bugs, with random tests.

    Strong answer: I think of them in classes, because each hides somewhere different and needs a different technique. Corner cases at limits like FIFO full or maximum length, found with biased random and boundary tests or formal; concurrency bugs when two events land in one cycle, found with random timing and back-pressure; integration bugs between blocks, found at subsystem level and with protocol checkers; configuration bugs found with randomised setup and configuration coverage; performance and fairness bugs that functional checks never see, found with latency and fairness monitors; reset, clock and power bugs; error-handling bugs found by error injection; and specification bugs found by review and independent readings. I use the classes to spot gaps in a plan.

    Follow-ups: (1) Which class escapes most often, in your experience? (2) How do you find a performance bug?

    Check yourself A plan has thousands of random tests and full functional coverage but no latency checks. Which class can it not find?

    Performance and fairness bugs: results are correct, so functional checks pass however slow or unfair the design is.

    Check yourself A bug appears only when a FIFO is exactly full and a write arrives. Which class, and what finds it best?

    A corner case at a boundary; biased stimulus that fills the FIFO, a directed boundary test, or a formal check of the FIFO.

    Key takeaways

    • Bugs fall into classes: specification, corner case, concurrency, integration, configuration, performance, reset/clock/power, error handling.

    • Each class hides in a different place and is found by a different technique.

    • Review plans and escapes against the classes to find what nobody is looking for.

    Keep going

    Next: Lesson 1.2, Specification Bugs. When the document itself is the bug.

    Related topics

    • Part 1 overview: What Can Go Wrong

    Previous

    14 / 160

    Next: Specification Bugs

    Up next

    Up nextSpecification Bugs

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Corner Cases and Boundaries
    • Concurrency and Races
    • Integration and Interface Bugs