TGViewer
позитивслэк позитивслэк @positiveslack · 993 subscribers
Post #359 1.97K
Играемся с Verilator, SMT2, Z3

Сделал тут небольшую песочницу, чтобы поиграться с рандомизацией в вериляторе.

Напоминаю, что в предущих сериях верилятор перешёл на такой формат рандомизации: SV констрейны парсятся, из них составляется запрос в SMT2 синтаксисе, запрос отправляется в решатель в системе (типа z3). Там есть разные хитрости в процессе, захотелось на них посмотреть и поиграть с z3.

В итоге сделал репо, в котором разворачивается верилятор и slang-server, есть сниппеты кода с рандомизацией, а z3 обернут в скрипт, чтобы дампить ввод-вывод в файлы.
https://github.com/esynr3z/verilator-rand

Вот так, например, преобразование выглядит на практике:

Класс с констрейном:

class Test;
rand byte a;

constraint a_c {
a >= 0;
a <= 10;
}
endclass

SMT2 код:

(set-logic QF_ABV)
(check-sat)
(reset)
(set-option :produce-models true)
(set-logic QF_ABV)
(define-fun __Vbv ((b Bool)) (_ BitVec 1) (ite b #b1 #b0))
(define-fun __Vbool ((v (_ BitVec 1))) Bool (= #b1 v))
(declare-fun a () (_ BitVec 8))
(assert (= #b1 (__Vbv (bvsge ((_ sign_extend 24) a) #x00000000))))
(assert (= #b1 (__Vbv (bvsle ((_ sign_extend 24) a) #x0000000a))))
(check-sat)
(get-value ( a))
(assert (= #b0 (bvxor ((_ extract 1 1) a) ((_ extract 2 2) a) ((_ extract 3 3) a) ((_ extract 5 5) a))))

(check-sat)
(get-value ( a))
(assert (= #b1 (bvxor ((_ extract 0 0) a) ((_ extract 2 2) a) ((_ extract 6 6) a) ((_ extract 7 7) a))))

(check-sat)
(get-value ( a))
(assert (= #b1 (bvxor ((_ extract 0 0) a) ((_ extract 1 1) a) ((_ extract 3 3) a) ((_ extract 4 4) a))))

(check-sat)
(get-value ( a))
(assert (= #b1 (bvxor ((_ extract 0 0) a) ((_ extract 1 1) a) ((_ extract 3 3) a) ((_ extract 7 7) a))))

(check-sat)
(get-value ( a))


Понятно, что подобные развлечения они для гурманов, но из практической пользы - можно забрать девконтейнер себе. Можно использовать чтобы баги в вериляторе воспроизводить/репортить, slang-server тестить, ну или просто разработку/ci вести. Удобно когда в два клика в вскоде разворачивается рабочее окружение с нужными версиями тулов и плагинов.

#verilator
@positiveslack
GitHub GitHub - esynr3z/verilator-rand: 🎲 Minimal playground for studying Verilator randomization 🎲 Minimal playground for studying Verilator randomization - esynr3z/verilator-rand
  • 🔥 12
  • ✍ 1
More from @positiveslack
  1. Sep 18, 2026Чет я закопался в этой проблеме. Я что многого прошу? Я даже про единый формат баз данных…
  2. Aug 25, 2026Интеграция проприетарных форматов вейвформ Из предыдущего поста у меня родилось несколько…
  3. Aug 24, 2026wavepeek 3.0 С момента моего доклада прошло некоторое время и случился переход от v0.5.0 к…
  4. Aug 22, 2026Post #388
  5. Jul 31, 2026Поделюсь историей успеха на поприще ИИ-ассистированного баг-хантинга в RTL. А точнее, прор…
  6. Jul 17, 2026Проверка верилятора на прочность Всё началось с проверки того, а насколько реально verilat…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →