VPI callback registration can return NULL silently: check vpi_chk_error after every vpi_register_cb
Building a VPI-based capture of SystemVerilog assertion results (success, failure, vacuous) on a commercial simulator: some vpi_register_cb calls, for assertion success/vacuous/disabled reasons, returned NULL with no message printed. The capture then simply recorded nothing for those events.
Practice: - Call vpi_chk_error(&info) right after every vpi_register_cb (and vpi_handle / vpi_iterate in setup paths), and log level, code and message, including the object name and callback reason. A NULL handle without that log is undiagnosable. - Count registrations requested vs succeeded per reason, and report them. Never assume full coverage. - Read the simulator's docs for the compile-time access options that gate VPI on assertions and other objects, but treat 'option X enables Y' as a hypothesis. Probe it as a separate build and record what it changes, instead of claiming it fixes the NULLs. - Default debug or read-only access flags often allow reading values but not value-change or assertion callbacks. A build tuned for speed may need different flags for callback-based capture. Note those flags next to every capture result.