Skip to content

Reduce simulation startup time (E4-E6 optimization phases) #18

@thomasnormal

Description

@thomasnormal

Problem

Simulation initialization takes 4+ seconds for medium designs and up to 160 seconds for large UVM AVIPs. For short simulations or regression runs with many tests, startup dominates total runtime.

Current init breakdown (500K-line AVIP design)

Step Time
discoverOpsIteratively() ~2s
registerSignals() ~1s
registerFirRegs() ~0.5s
registerProcesses() ~1-2s
initializeChildInstances() ~0.5s
initializeGlobals() one-time
executeModuleLevelLLVMOps() up to 160s
createInterfaceFieldShadowSignals() ~0.1s

The main bottleneck is executeModuleLevelLLVMOps() which runs UVM global constructors.

Planned optimization phases

Phase Name Status Expected improvement
E4 Edge fanout In progress Pre-partition sensitivity by edge type for batch wake-up
E5 Inline cache Planned Cache call_indirect dispatch (vtable lookup) per call-site
E6 Sensitivity caching Planned Avoid re-scanning sensitivity lists each delta cycle

Current performance baseline (AHB AVIP, Feb 23)

  • init: 4.67s, run: 0.92s/500ns (3.8x faster than pre-E1)
  • Main loop iterations reduced from 25,102 → 148 (170x reduction from E0-E3)

Separate track: AOT compilation

The --compile (AOT) flag compiles the MLIR to native code before simulation, which would eliminate interpretation overhead entirely. Currently WIP — gracefully falls back to interpreted mode.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions