В субботу прошло первое занятие Школы Синтеза Цифровых Схем. Записалось 650 человек в 15 городах России и Беларуси, пришли 400 (250 офлайн и 150 онлайн). Российский флаг на мониторе нарисован комбинационной логикой FPGA (первое что пришло в голову рисовать студентам сразу в двух кластерах). Вообще обычно на первом занятии мигают светодиодами, но мы решили пойти дальше и показали им как рисовать картинки. Для этого два счетчика формируют X и Y, а задача студента - реализовать функцию RGB (X, Y).
Из-за наличия зоопарка плат, версий Windows и Linux, а также EDA софтвера, глючных программаторов, и при этом свежих и недотестированных bash-скриптов, возникла ситуация полного ада, особенно у онлайн-пользователей (преподаватели на местах героически справлялись). Возникла ошибка, которая меня реально удивила. И не только меня:
Про ошибку я расскажу в конце поста, но вначале более общий вопрос. От части пользователей был запрос к организаторам не валять дурака и показать как работать по нормальному, то бишь в Windows GUI и без скриптов. Можно ли это сделать? Да.
1. Что делать с пользователями, которые не хотят разбираться с проблемами со скриптами
Нужно создать несколько .zip-файлов, каждый под конкретную плату, по инструкции ниже. Пользователи будут эти файлы разархивировать, после чего находить в директориях примеров поддиректории run, под каждым примером. В каждой такой директории будет файл fpga_project.qpf. Его можно открыть в GUI программы Intel FPGA Quartus с помощью “File | Open Project” (не путать с “File | Open” - многие часто путают, даже я спустя много лет использования).
2. Как создать zip-файл под конкретную плату
Нужно заархивировать клонированный git-репозиторий basics-graphics-music. При этом перед архивацией нужно запустить ровно один скрипт в корневой директории, который называется check_setup_and_choose_fpga_board.bash. Когда после выбора платы этот скрипт спросит:
Would you like to create the new run directories for the synthesis of all labs in the package, based on your FPGA board selection? We recommend to do this if you plan to work with Quartus GUI rather than with the synthesis scripts.
то нужно ответить Y.
Скрипт создаст проекты во всем дереве под конкретную плату. Потом эти проекты можно открывать в GUI квартуса с помощью меню Open Project.
3. Отступление, почему желательно все-таки решить проблемы со скриптами, а не работать всем в GUI
В электронных компаниях никто не использует GUI для запуска синтеза или симуляции, все работают со скриптами. Работать с GUI просто неэффективно, в Quartus нужно долго водить мышкой, нажимать на кнопки и открывать разные диалоги просто чтобы запустить прошивку платы. А когда нужно запустить регрессию (симуляцию из нескольких тысяч тестов), то вопрос про GUI просто не встает - ни один человек на Земле не согласится сидеть всю ночь и десять тысяч раз водить мышкой по меню.
4. Какая может быть польза от GUI
В нашей школе GUI полезно чтобы ученики посмотрели как их код превращается в электронную схему - граф из логических элементов. Это полезно как в первый раз, так и потом, когда будет разбираться статический анализ тайминга, и нужно будет показать, что код может порождать длинные цепочки логики, которые приводят к длинным временным задержкам (в пикосекундах внутри такта, не в тактах).
Также в GUI один раз полезно показать, как этот граф из логических элементов отображается на граф из ячеек FPGA, а потом (в Chip Planner) на матрицу этих ячеек внутри FPGA. Показывать это с каждым примером не нужно, только первый раз.
5. Примеры причин, по которым могут не работать скрипты
После занятия я узнал у преподавателей, что была замечена например вот такая проблема: скрипт падает, если он находит в PATH Intel FPGA Quartus, но не находит необязательную Siemens EDA Questa. Квеста в принципе для занятий вообще не нужна, так как бесплатная квеста по покрытию SystemVerilog для наших RTL упражнений не особенно лучше чем Icarus Verilog + GTKWave. В ней все равно не поддерживаются functional coverage, concurrent assertions и constrain solver, что нужно для более продвинутых занятий по верификации.
Одна из ошибок, которая возникла у учеников, меня сильно удивила. А именно “set: Illegal option -o pipefail”. Я некоторое время сидел и думал: “Но КАК? Это же стандартная опция Bash-а” После некоторого гугления я понял как они этого добились - такое может произойти и под Linux, и под Windows.
Если пускать скрипт по инструкции, то этого произойти не может:
Под Линуксом:
cd basics-music-graphics/labs/01_and_or_not_xor_de_morgan
./03_synthesize_for_fpga.bash
Под Windows:
cd basics-music-graphicslabs1_and_or_not_xor_de_morgan
bash 03_synthesize_for_fpga.bash
Почему такой ошибки не может произойти? Потому что в первом случае используется hash-bang в начале скрипта:
#!/usr/bin/env bash
А во втором случае напрямую вызывается Bash, который такую опцию уже N лет поддерживает. Для Windows Bash берется из Git for Windows (мы не смогли победить Windows Subsystem for Linux и поддерживаем или настоящий Linux, или Windows с bash от Git).
Хотя вероятно существуют дистрибутивы линукса, в которых env стоит не в /usr/bin, а в /bin, но в таком случае ошибка была бы другой. Если бы bash не стоял в path (допустим) все равно ошибка была бы другой. И в Windows тоже.
Первая мысль - может у ученика древний bash, в котором нет этой опции? Но нет, проблема воспроизводится и на последней Ubuntu/Lubuntu/Debian.
Оказывается, в некоторой версии Debian оболочку по умолчанию /usr/bin/sh, которая указывала символической ссылкой на bash, перенаправили на dash. А dash - это POSIX-compliant shell, который работает быстрее чем bash, но не поддерживает “башизмы”, в том числе “set -o pipefail”. Потом изменение перекочевало в Ubuntu.
Но все равно встает вопрос: “Но КАК?” А вот так, попробуйте это сами и получите “set: Illegal option -o pipefail”:
sh 03_synthesize_for_fpga.bash
Таким макаром запускается не bash, а dash, который игнорирует hash-bang. Против такого использования нужно сделать проверку.
Если вы не поняли, что произошло, перефразирую: пользователь ввел "sh скрипт" а не "bash скрипт". Hash-bang учитывается если пользователь вводит "./скрипт". При вводе "sh скрипт" - hash-bang игнорируется, воспринимается просто как комментарий. И выполняется sh. А sh перенаправлен на dash, а не bash, как было до изменения в Debian/Ubuntu. И dash падает на башизмы.
Большинство других причин проблем со скриптами должно быть покрыто инструкцией (инструкции увы никто не читает - надо было делать микроменеджмент учащихся во время лекции).
Что-ж, надеюсь наши мероприятия закаляют не только будущих микроархитекторов чипов для российких ускорителей искуственного интеллекта, но и служат тренировкой в использовании линукса, без которого в индустрии чипов - никак. Его используют даже в Apple и Microsoft, потому что версий high-end софтвера для проектирования ASIC (Synopsys Design Compiler / IC Compiler и Cadence Genus / Innovus) под Windows просто нет.
Видео занятия:
Еще из творчества учеников:
Автор: Юрий Панчул / Yuri Panchul