Больше тысячи человек успели поработать с упражнениями по SystemVerilog и FPGA из репозитория BGM - basics-graphics-music. Они используются в Школе Синтеза Цифровых Схем в России и Беларуси, а также на Verilog Meetup в Silicon Valley, а предыдущие версии использовались на семинарах в Украине, Казахстане, Киргизии, Грузии, Армении и Азербайджане.
Прошлым летом мы перенесли два упражнения из BGM и одно упражнение из systemverilog-homework в инфраструктуру Tiny Tapeout для проектирования ASIC. Tiny Tapeout - это компания, которая работает с eFabless и фабрикой Skywater и позволяет студентам и любителям сделать собственные микросхемы за карманные деньги.
И вот сейчас хотелось бы интегрировать BGM и Tiny Tapeout всерьез, для планируемого семинара в Мексике. Идея простая: группа из 30 студентов упражняется неделю на верилоге на платах Tang Nano 9K с графическими экранчиками и интерфейсными модулями TM1638. А потом их дизайны переносятся в репозитории на основе варианта темплейта от Tiny Tapeout - и мы вместе оформляем заказ на производство чипа на фабрике.
А какое участие я хочу от вас? А вот какое:
Мой вариант темплейта для Tiny Tapeout сейчас не синтезируется. Я скомбинировал его из кода, написанного несколькими людьми (я, Руслан Залата, Александр Кириченко, Alan Garfield), и при этом в коде есть дефекты, которые работают OK в симуляции и на FPGA, но являются нарушениями методологии для ASIC и источниками багов при синтезе с помощью Open Lane (Yosys, ABC, OpenROAD). Это все нужно разгрести и заодно удалить warning-и.
Среди очевидных дефектов:
В коде смесь из синхронных и асинхронных сбросов - см. статьи Клиффа Каммингса на эту тему (1, 2). Все эти сбросы нужно сделать синхронными, как принято у моих трех последних работодателей.
Warning-и от старомодной конструкции `timescale. Ее нужно заменить на более молодежную комбинацию timeunit / timeprecision, но делать это только после изучения вопроса.
Есть также синхронизованный сигнал сброса (нужно заменить на обычный, но вначале понять зачем он был вставлен в код).
Есть (о, ужас) инициализация logic или reg, которая синтезируется в FPGA, но не синтезируется в ASIC.
Основной баг обнаруживается на этапе оптимизации логики программой ABC (кстати мейнтейнер ABC - наш соотечественник Алан Мищенко из Киева, который учился в МФТИ в Москве, а сейчас работает в Беркли). Баг выглядит так:
Что он имел в виду - непонятно. Ну combinational и combinational - а что, нельзя? Это же не греховный level-sensitive D-latch. Там наверняка ошибка в чем-то непрямом - это нужно исследовать.
Что нужно чтобы начать это фиксить? Самое смешное - почти ничего. Это можно фиксить даже с телефона сидя в трамвае, потому что вся инфраструктура Tiny Tapeout является Web-Based. То есть вы делаете fork моего репозитория на гитхабе, потом разрешаете там Actions, и всякий раз когда вы делаете push в ваш репозиторий, github запускает runners, которые синтезируют дизайн.
Вот видео с созвона, в котором я рассказал про инфраструктуру Tiny Tapeout и дал другую вводную информацию, чтобы вы могли выполнить такое упражнение:
На ютюбе:
То же на Рутюбе:
А вот реализация классической игры Понг, которую написал Аллен Бейкер из Synopsys под нашу инфраструктуру BGM. Эту игру можно сразу посадить на Tiny Tapeout ASIC, если почистить темплейт выше от багов:
Теперь несколько скриншотов чтобы сориентировать вас как включать раннеры в Actions на github:
Отладка этого темплейта открывает возможность FPGA+ASIC семинара+хакатона, который я хочу сначала попробовать в Мексике, а потом в других местах - даже в Африке - оказывается в Кении и Нигерии тоже есть интересующиеся FPGA и ASIC-ами.