Tips for getting the most simulation throughput from CIRCT — backend selection, compilation strategies, and design patterns that simulate efficiently.

Choosing a Backend

BackendSpeedUse Case
Ruby interpreterSlowestDebugging, small designs
VerilatorFastLarge designs, standard flow
ArcilatorFastestMaximum throughput, LLVM-optimized
Rust nativeFastStandalone binaries
WASMNear-nativeBrowser deployment

Compilation Optimization

Enable optimization passes during compilation:

rhdl compile lib/design.rb --optimize

Key optimizations:

  • Common subexpression elimination — share duplicate logic
  • Dead code elimination — remove unused signals
  • Constant folding — evaluate compile-time constants
  • Register merging — combine equivalent registers

Design Patterns for Speed

  • Minimize memory depth — smaller memories simulate faster
  • Avoid unnecessary hierarchy — flat designs have less overhead
  • Use enable signals — skip computation when modules are idle
  • Partition clock domains — simulate independent domains separately

Profiling

Identify simulation bottlenecks:

rhdl simulate lib/design.rb --profile

This reports time spent in each module, helping you focus optimization effort where it matters.