Skip to content
STIMSMITH

SAT Solving

Technique WIKI v1 · 5/26/2026

SAT solving is used as a constraint-solving backend in hardware-verification randomization flows. The provided evidence shows it appearing in PyVSC, CRAVE, and eUVM contexts: PyVSC relies completely on SAT solvers for multi-variable constraints, CRAVE exposes an integrated interface to BDD and SAT solvers, and eUVM delegates convoluted constraints beyond BDD handling to SMT/SAT solvers such as Z3, Boolector, and CMSGen.

Overview

SAT solving appears in the evidence as a backend technique for solving constraints in verification and constrained-random stimulus generation flows. In the cited RISCV-DV/eUVM discussion, SAT solvers are used alongside or after other constraint-solving approaches, especially when constraints are multi-variable or too convoluted for simpler approaches such as native or BDD-based solvers. [C1]

Role in constraint-solving stacks

The evidence describes a tiered approach in eUVM: a native constraint solver handles elementary single-domain constraints; BDD-based solvers handle multi-domain constraints of medium complexity; and constraints that cannot be handled by BDD are delegated to SMT/SAT solvers. The named SMT/SAT solvers in this context are Z3, Boolector, and CMSGen. [C1]

This positions SAT solving as a fallback or heavy-duty backend for difficult constraint cases rather than the only possible technique in a constraint-processing pipeline. [C1]

SAT-only use in PyVSC

Pygen, the Python port of RISCV-DV, uses PyVSC for solving constraints. The evidence states that PyVSC does not deploy a Binary Decision Diagram solver and instead relies completely on SAT solvers for multi-variable constraints. The same source associates this SAT-only approach with less-uniform solution spread compared with SV and eUVM. [C2]

The evidence also reports poor runtime performance for Pygen in this context: it performs more than one hundred times slower than the SystemVerilog version of RISCV-DV and generates fewer than one hundred random RISC-V instructions per second. [C2]

Use in CRAVE

The SystemC UVM port relies on the CRAVE library for constrained randomization. CRAVE provides an integrated interface to a set of BDD and SAT solvers. However, the evidence states that CRAVE could not handle complex RISCV-DV constraints at the time discussed, and that SystemC and CRAVE did not offer support for multicore parallelism. [C3]

Practical implications from the evidence

From the provided material, SAT solving is useful but context-dependent:

  • It can serve as a backend for multi-variable or convoluted constraints. [C1][C2]
  • It is often combined with other techniques such as native solvers and BDD-based solvers. [C1][C3]
  • A SAT-only strategy for multi-variable constraints, as described for PyVSC, may produce a less-uniform spread of solutions compared with SV and eUVM in the RISCV-DV context. [C2]
  • Availability of SAT solving alone does not guarantee support for complex verification workloads, as illustrated by the CRAVE discussion around complex RISCV-DV constraints. [C3]

CITATIONS

3 sources
3 citations
[1] C1: eUVM uses native solving for elementary single-domain constraints, BDD-based solving for medium-complexity multi-domain constraints, and SMT/SAT solvers such as Z3, Boolector, and CMSGen for convoluted constraints not handled by BDD. [PDF] Crafting a Million Instructions/Sec RISCV-DV - DVCon Proceedings
[2] C2: Pygen uses PyVSC for constraints; PyVSC lacks a BDD solver and relies completely on SAT solvers for multi-variable constraints, with the source reporting less-uniform solution spread and poor Pygen runtime performance relative to SV RISCV-DV. [PDF] Crafting a Million Instructions/Sec RISCV-DV - DVCon Proceedings
[3] C3: CRAVE provides an integrated interface to BDD and SAT solvers, but the source states it could not handle complex RISCV-DV constraints and that SystemC and CRAVE lacked multicore parallelism support. [PDF] Crafting a Million Instructions/Sec RISCV-DV - DVCon Proceedings