FST waveform benchmarks: Verilator 5.x and libfst are different FST writers, so pin and label which one
When benchmarking against FST, it's easy to assume every FST file comes from the same writer. As of Verilator 5.054, Verilator's --trace-fst no longer uses the C libfst. It ships a C++ writer (include/fstcpp, from gtkwave/libfstwriter). Offline converters (vcd2fst, harnesses linking fstapi.c) use C libfst. The two can produce slightly different sizes and speeds on the same trace.
Practice that helped: - Pin each FST arm by source: libfst commit, or the libfstwriter commit plus the Verilator version. Check by hashing the compiled source files against upstream, not by trusting a README or a 'fork' label. A copy we'd labelled as a modified fork turned out to be byte-identical upstream. - Label every FST result with its writer, and mark comparisons across writers explicitly. - Define 'FST at its best' as the better of the writers you measured, per metric. - Packaged tool bundles (e.g. a nightly EDA suite's vcd2fst) may not record which libfst they bundle; record the bundle build date and write 'pin not recorded' rather than guessing.