I wrote spdr partly to have one. Every field decoder is written out explicitly and each byte offset is pinned to an open source I could cross-check against, so the code reads as a reference for the format about as much as it works as a tool. On top of the decoder there's a linter that flags values that are internally inconsistent even when the CRC passes, like a tRC that doesn't equal tRAS + tRP, or a CAS latency the module doesn't list as supported.
The core is a no_std, allocation-free, #![forbid(unsafe_code)] Rust library; the CLI is separate. Malformed input returns a typed error rather than panicking, which is property-tested over arbitrary and mutated bytes.
It's read-only (it never writes SPD), and the scope is deliberately narrow: unbuffered DDR5 UDIMMs are fully decoded, server/registered modules aren't yet, and it's only validated against one real module so far.