Как обычно выглядит регрессионное тестирование RTL?
На условный IP есть большой набор тестов. Писать полный waveform dump для каждого из них - плохая идея: очень быстро закончится место на диске, а сама симуляция из-за tracing может замедлиться.
Поэтому regression обычно запускают без waves.
А дальше начинается классический debug workflow:
1) Запускаем regression без tracing.
2) Тест из regression коллекци падает, допустим, через 40 минут.
3) Видим error и время падения.
4)Пересобираем или перезапускаем тест с --trace-fst.
5) Ждём, ждём, ждём.
6) Получаем огромный FST файл, где информация нужна не вся, а в некотором окне от момента падения.
wzv решает именно эту проблему.
Вместо полного waveform dump симуляция запускается практически как обычно, но wzv записывает только информацию, которую Verilator не сможет потом восстановить самостоятельно:
- значения top-level inputs при каждом eval();
- simulation/tick time;
- периодические checkpoints состояния модели через VerilatedSave.
Такая запись получается очень маленькой и почти не влияет на скорость основной regression.
После падения теста workflow становится примерно таким:
1) Запускаем regression + wzv.
2) Тест падает. Получаем failure time.
3) Запускаем wzv replay только для небольшого окна, относительно failure time.
4) Получаем небольшой FST для интересующего участка.
То есть вместо того, чтобы заранее сохранять огромные дампы значений внутренних сигналов, мы сохраняем stimulus + checkpoints, а waveform восстанавливаем post-mortem только там, где он реально понадобился.
Причём можно восстановить как произвольное временное окно, так и весь run целиком.
Как же это работает?
This works because a Verilator model (2-state, --no-timing) is a deterministic function of its state and its inputs: the waveform carries no information beyond the input stream, so it doesn't have to be stored — only replayed. Checkpoints exist purely so replay can start near the window you ask for instead of at time 0.
Больше деталей - https://github.com/muzafferkal/wzv