Записки CPU designer'a
3.5K subscribers
224 photos
3 videos
5 files
326 links
Всем привет. Меня зовут Николай.
Работаю RTL design инженером, амбассадором в RISC-V International.
В свободное время пишу о магии процессоростроения и цифровом дизайне.
Download Telegram
Новый инструмент для работы с Verilator-based регрессиями - wzv. record now, get waveforms later

Как обычно выглядит регрессионное тестирование 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
14😁3👍2
И в дополнение к посту выше - практически исчерпывающий разбор доклада OpenAI о Jalapeño с конференции Hot Chips 2026.

Там довольно много сильных архитектурных инсайдов: memory locality, организация NoC, работа с KV cache, latency hiding и в целом подход к проектированию inference ASIC.

Всем, кому интересны современные AI-accelerator архитектуры - читать. Ближе к выходным разберём самые интересные моменты подробнее в чатике канала.

https://zartbot.github.io/blog/arch/jalapeno/en.html
👍106🔥2
Ещё один сайт с коллекцией die shots.

Можно выбрать несколько чипов и сравнить их на одном preview в одинаковом масштабе - удобно для визуального сравнения размеров die:

https://kurnal-insights.com/en/tools/die-composer/

Ещё есть интерактивный roadmap, где чипы можно смотреть с сортировкой по годам выпуска:

https://kurnal-insights.com/en/roadmap/
🔥24👍1👀11
--x-initial-edge в Verilator: зачем он нужен

В Verilator есть флаг --x-initial-edge. Он решает давнюю проблему разницы в поведении между Verilator и big3 симуляторами (VCS, Questa, Xcelium).

В чём суть проблемы?
В стандарте IEEE 1800 SystemVerilog (см. Table 6-7 default values) в момент времени T = 0 4-state переменные имеют значение 'X'. Согласно стандарту system verilog переход из 'X' в '0' расценивается как negedge, а из 'X' в '1' - как posedge (см. Table 9-2).
В Verilator по умолчанию начальное значение сигналов для такой edge-детекции считается равным 0. Из-за этого установка сигнала в 0 в момент T=0 выглядит как 0 -> 0 и не генерирует negedge.

Почему это критично?
Это казалось бы незначительное отличие особенно заметно при отладке схем с Clock Gate контроллерами. Если clock подмодуля во время reset загейчен (clock отсутсвует), асинхронный reset может быть единственным событием, которое переводит внутреннее состояние блока в reset state.
Но код на скриншоте в Verilator не срабатывал, поскольку Verilator по умолчанию не моделировал начальный переход X -> 0 как negedge.

Без использования этого флага момент можно было обкостылить. Например, чтобы заставить пример на скриншоте работать корректно, можно было искусственно сформировать дополнительный переход сигнала сброса:

1) 0 (T0) -> 1 -> 0 // создаём настоящий negedge
2) 0 -> 1 // снимаем reset

Теперь такие костыли городить не нужно, подробности:

https://veripool.org/guide/latest/exe_verilator.html#cmdoption-x-initial-edge
8👍7🔥1
Forwarded from Сиолошная
Astra появилась в Codex
👍15🎉6😁1👀1
Кстати, есть тут кто в канале, кто уже тестировал Astra на schematic/PCB-задачах?

В Twitter, конечно, каждый второй пост в духе «ONE SHOTTED/ЭТО КОНЕЦ/ONE PROMT RESULT». Но буквально под каждым таким постом приходит PCB-инженер и разносит результат работы Astra
это невероятно уморительно читать, особенно когда автору поста буквально нечего ответить

Интересно услышать опыт тех, кто реально пробовал: насколько оно уже применимо в работе и какие рутинные задачи уже хорошо автоматизируются?
😁2014👍1
А вот и разборы решений пазла от Jane Street подъехали🫪

https://mummanajagadeesh.github.io/blogs/janestreet-asic-puzzle/

Давайте в комментариях хвастаться кто сколько пасхалок нашел, а кто проглядел морязнку в KLayout, как я?😑
Please open Telegram to view this post
VIEW IN TELEGRAM
👀8👍1