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
  • 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
    • Why Cycles Matter
    • Simulation Speed and Its Limits
    • Emulation
    • FPGA Prototyping
    • Virtual Platforms and Hybrids
    • Debug at Scale
    • Choosing the Platform
    • Drills: Emulation and Prototyping
  • 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 10: Emulation and Prototyping
  1. Topics
  2. First Principles of Verification Strategy
  3. Part 10: Emulation and Prototyping
  4. Simulation Speed and Its Limits

Part 10 · Emulation and Prototyping · Working (W)

Simulation Speed and Its Limits

Before moving to hardware platforms, most regressions can be made several times faster in simulation itself: by simulating less design, doing less work per cycle, running fewer cycles per question and running more questions in parallel. What slows simulation down, what speeds it up, and examples from this course's own DCRouter runs.

On this page

    Note

    Level: Working (W) · Answers: How do we run enough cycles?

    Before this: Why Cycles Matter

    This course's DCRouter regressions taught a few speed lessons along the way. The constraints demonstration took 26 seconds of wall-clock time for 21,000 calls to randomize(), almost all of it waiting on the constraint solver; reduced to 4,500 calls it took 6 seconds and taught exactly the same thing (lesson 4.3). A bounded formal check of the full router took 3 seconds at depth 6 and over five minutes at depth 10 (lesson 7.2). Speed problems usually have a specific cause, and the cause decides the fix.

    What makes simulation slow, and how do you speed up a slow regression?

    The obvious answer, and why it breaks

    The obvious response to a slow regression is more machines. That helps throughput if tests are independent, and does nothing for the longest test, the turnaround of a single failing run, or a test that is slow for a reason that more hardware cannot touch: a testbench doing expensive work every cycle, a waveform dump of every signal, a test running far longer than its question needs.

    The idea: four levers

    Lever

    Examples

    Typical effect

    Simulate less design

    Block or subsystem instead of chip; stub or model neighbours; smaller configurations

    Large: simulation cost grows with design size

    Do less work per cycle

    No full waveform dumps by default; transaction-level testbench code; fewer per-cycle checks in Python or slow languages; avoid solver calls in inner loops

    Often large: testbenches can cost more than the design

    Run fewer cycles per question

    Shorter tests aimed at one question; backdoor setup for deep states (lesson 3.5); test modes for long timers

    Large for long tests

    Run more questions in parallel

    Independent tests on many machines; many seeds at once

    Throughput only; no help for the longest single test

    Measure before optimising: a simulator profiler, or simply timing the same test with dumping off, checkers off, or the design stubbed, shows where the time goes.

    Examples from this course

    Run

    Where the time went

    Fix

    Constraints demo (4.3)

    Constraint solver called 21,000 times

    4,500 calls: same lesson, a quarter of the time

    Formal proof of DCRouter (7.2)

    Search grows with depth

    Depth 7 for the bounded check, induction for full proofs

    Bug Zoo runs (4.x to 6.9)

    25 independent builds and runs per testbench

    Run in parallel across cores (bug-zoo.mjs --jobs)

    Waveforms for lessons

    Dumping every signal

    Dump only for the wave-generation build (the WAVE define)

    When simulation cannot be made fast enough

    • The question needs the whole chip and billions of cycles: OS boot, long software, end-to-end performance.

    • The design is too large to simulate the needed cycles in any reasonable time.

    • Then move platforms: emulation (lesson 10.3), FPGA prototyping (10.4), or virtual platforms and hybrids (10.5).

    How real teams keep simulation fast

    Practice

    Purpose

    Regression profiling and per-test runtime budgets

    Slow tests found and fixed, not tolerated

    Waveforms only on demand or for failing reruns

    Most runs pay no dumping cost

    Block-level environments for block-level questions

    Chip simulation reserved for chip questions

    Compile once, run many seeds

    Build time paid once per regression

    What breaks

    A team (illustrative) inherited a nightly regression that no longer finished overnight and requested twice as many licences. Profiling showed that one scoreboard compared every transaction against a list by linear search, and the list grew without bound because matched entries were never removed. Fixing the scoreboard made the regression four times faster with no new licences.

    Why this matters

    Senior lens. Treat simulation time as a budget and profile before buying hardware. Most slow regressions are slow for a specific reason in the testbench or the test design; fix that first, then parallelise, and move to hardware platforms only for questions that genuinely need the cycles.

    Interview

    Asked: "How would you speed up a slow regression?"

    Weak answer: Get more machines.

    Strong answer: Measure first, then pull four levers: simulate less design (block level, stubs, small configurations), do less work per cycle (no full dumps by default, efficient testbench code, solver calls out of inner loops), run fewer cycles per question (focused tests, backdoor setup, test modes), and only then run more in parallel. More machines help throughput but not the longest test or the turnaround of one failure. If the question genuinely needs billions of chip cycles, it belongs on an emulator or prototype instead.

    Follow-ups: (1) What is usually the biggest hidden cost? (2) When do you give up on simulation?

    Check yourself Why does adding machines not shorten the turnaround of one failing test?

    A single test runs on one machine; parallelism only increases how many tests run at once.

    Check yourself Why can a testbench be slower than the design it simulates?

    It can do expensive work every cycle: unbounded searches, slow-language callbacks, solver calls, full waveform dumps.

    Key takeaways

    • Profile before optimising: slow simulation usually has a specific cause.

    • Simulate less design, do less work per cycle, run fewer cycles per question, then parallelise.

    • Move to hardware platforms only for questions that need billions of chip cycles.

    Keep going

    Next: Lesson 10.3, Emulation. What emulators do well and badly.

    Related topics

    • Part 10 overview: Emulation and Prototyping

    Previous

    100 / 160

    Next: Emulation

    Up next

    Up nextEmulation

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • FPGA Prototyping
    • Virtual Platforms and Hybrids
    • Debug at Scale