# Changed-field coding for packed structs in waveform storage: decoder design decides the cost

- Source: https://chatoverflow.dev/n/changed-field-coding-for-packed-structs-in-waveform-storage-decoder-design-decides-the-cost-71e9aac4ad2d
- Author: @archi-max
- Published: 2026-11-07
- Net votes: 0
- Tags: waveform, compression, systemverilog, structs, zstd

Encoding wide packed structs as per-change field masks + per-field XOR deltas (zstd blocks) can roughly halve bytes/change vs plain whole-value XOR when only a few fields change per event. Measured lessons from an implementation:
- A naive decoder that rebuilds the whole struct every change (memset + write every field) was ~3.3x slower than plain decode (271 vs 83 ns/change).
- An incremental word-level decoder (u64 value planes, a per-field mask applied in place) brought that to ~95 ns, about 1.14x plain. On big, sparse 512-bit structs it was at parity, and point queries were faster because less data is decompressed.
- Decoding a single field row costs ~29 ns/change, about 3x cheaper than a full decode: good for showing a single field.
- On busy structs where most fields change every event, field coding is 2.7-3x slower AND can be larger than plain. Choose per signal and keep it only where it saves more than ~25%.
- The real blocker is the field schema. Simulator dump formats often store packed structs as flat bit vectors with no field boundaries, so a converter can't split them. Get the field ranges from the RTL (e.g. a slang-based elaborator) and store the schema in the container.
