В субботу прошло первое занятие Школы Синтеза Цифровых Схем. Записалось 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-graphics\labs\01_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 просто нет.
Видео занятия:
Еще из творчества учеников:
Комментарии (52)
igor_suhorukov
25.09.2023 05:08+3C hardware сложнее, если бы не доступ к апаратуре - упаковка в Docker и все воспроизводимо у всех кто запускает контейнеры, как и виртуальные машины (если бы не досуп к аппаратным ресурсам)
tzlom
25.09.2023 05:08Нет никаких проблем пробросить нужные устройства внутрь контейнера. В тяжелых случаях поможет баш скрипт.
hssergey
25.09.2023 05:08+1Помню, сталкивался где-то у себя с разным поведением, если в скрипте #!/bin/sh или !#/bin/bash . Но как-то сильно на это внимание не обратил, исправил в проблемном скрипте на bash и все...
YuriPanchul Автор
25.09.2023 05:08+1Так вот если после этого взять ваш исправленный скрипт и запустить его "sh скрипт", то он снова поломается, потому что #!/bin/bash" будет проигнорирован.
Yak52
25.09.2023 05:08+25То есть криво написаный скрипт, с использованием относительных путей, без проверок на то, что за оболочка используется, но удар в спину почему то от Ubuntu?
YuriPanchul Автор
25.09.2023 05:08Пути используются корректно - когда надо realpath, когда надо относительный.
Если хотите покритиковать - покажите конкретные некорректные места вот здесь - https://github.com/yuri-panchul/basics-graphics-music/tree/main/scripts/steps
Что касается проверок - я никогда не видел и не слышал, чтобы скрипт, в котором есть shebang bash, как-то проверялся что его кто-то пытается выполнять как "sh скрипт". Как это вообще проверять? При этом shebang игнорируется.
А удар в спину заключается в том, что еще в 1990-х куча материалов говорила, что bash - оболочка по умолчанию в линукс, и sh привязан к ней через symbolic link, а вдруг оказалось что они втихую подменили bash на dash и теперь надо проверять против еще одного кривого сценария использования.
Hamer13
25.09.2023 05:08+11Всё же вы не правы на счёт удара в спину. В 90-х, да и в 00-х, в куче статей говорилось что bash в линуксе используется по умолчанию, а в другой куче говорилось только о том что он в линуксе есть по умолчанию. Те статьи ведь писали обычные люди, которые установили себе какой-то конкретный дистрибутив и работали, в основном, только с ним.
Применение же bash в качестве sh как раз и породило массу проблем с башизмами: человек честно указывает в шебанге «/bin/sh», а на самом деле система использует bash. При этом он эти самые башизмы использует, просто об этом не подозревая — работает же. И, в результате, этот скрипт прекрасно работает на компе пользователя, но при запуске в каком-нибудь hp-ux валится. Почему? От чего? Мы же явно указали «/bin/sh»! А вот фигвам, вы указали, а у ОС своё прочтение.
Собственно, использование в качестве sh чего-то, реализующего только POSIX SHELL и есть стандарт.YuriPanchul Автор
25.09.2023 05:08Ну это да, "удар в спину" - это преувеличение. Я-то никогда не считал, что sh - это баш, и для башевских скриптов пишу всегда bash в shebang. Но другие-то считают! Иначе почему ученик написал "sh скрипт.bash"
Irvus
25.09.2023 05:08-1Ну, badstyle кнш, но проблема не в этом же. По команде sh вместо bash вызывается dash. Не знаю, кстати, что это такое, пошел гуглить
Hamer13
25.09.2023 05:08+16Dash для sh вместо bash в debian/ubuntu используется очень давно. Проверять это в скрипте достаточно просто: если в переменной BASH_VERSION что-то есть — скрипт выполняется башем.
Куда на самом деле указывают sh и bash:
$ readlink -f $(which sh) /usr/bin/dash $ readlink -f $(which bash) /usr/bin/bash
В сеансе bash переменная есть:
$ echo $BASH_VERSION 5.1.16(1)-release
А в dash — нет:
$ sh -i $ echo $BASH_VERSION $ set | grep ^BASH $
Hamer13
25.09.2023 05:08+30Простая проверка.
В начале скрипта добавляем:
$ cat test_bash.sh #!/bin/bash [ -n "$BASH_VERSION" ] || { echo "please run this script with bash"; exit 1; } echo "начинаем начинать"
И запускаем:
$ ./test_bash.sh начинаем начинать $ bash test_bash.sh начинаем начинать $ sh test_bash.sh please run this script with bash
YuriPanchul Автор
25.09.2023 05:08+5О, спасибо!
White_Thrasher
25.09.2023 05:08Когда в 2021 ставил Ubuntu 20.04LTS, то там sh была симлинком на dash. Возможно кто- то из причастных скучает по Korn shell или ему там что-то недодали, не знаю.
А не решило бы проблему на месте, в качестве "временной меры" , добавление команды, bash перед скриптом? То есть:
$ bash ./some_path/ some_script.sh
YuriPanchul Автор
25.09.2023 05:08Так это и написано в инструкции для Windows. А для Linux сказано делать ./some_path/some_script.bash . Но люди инструкции не читают, и пишут то some_script.sh без ./ то sh ./some_path/some_script.bash
iig
25.09.2023 05:08+10Тестировать свои скрипты на работоспособность на разных ОС?
Явно указывать, на каких ОС они протестированы?
Заорачивать в docker?
Не использовать bash?
Использовать python?
Да нет, сложно как-то… @#$-@#$ и в production наше все.YuriPanchul Автор
25.09.2023 05:08+10Я протестировал скрипты этой и предыдущей инкарнации в Ubuntu, Lubuntu, CentOS, ALT, Simply Linux, Astra Linux и других. Докер в решении всех проблем не поможет - там проблемы с USB Blaster и его драйверами.
Почему не использовать bash, если он везде есть и нормально работает кроме вот таких кривых сценариев использования.
Питон... Да у питона куча проблем с совместимостью с библиотеками.
iig
25.09.2023 05:08Питон… Да у питона куча проблем с совместимостью с библиотеками.
Какие библиотеки нужно использовать в обертке над zip, чтобы словить несовместимость?
Shaman_RSHU
25.09.2023 05:08Для этого нужно знать, какие библиотеки нужно использовать в обертке над zip :)
kulikser
25.09.2023 05:08По части docker, есть флаги privileged и device, не знаю, пробовали или нет. Я работаю с Xilinx программатором, там вообще все удобно по сети без заморочек с USB.
А по поводу dash в Ubuntu это давно известный факт, а не удар в спину, особенно для тех кто Petalinux от Xilinx использует если говорить об FPGA, куча одинаковых вопросов на форуме. У того же digilent например прям в инструкции об этом написано,
dpkg-reconfigure dash
илиln -fs /bin/bash /bin/sh
рекомендуют обычно, лучше в docker конечно.
unaimillan
25.09.2023 05:08-1писать негативные комментарии в интернете — yees,
помочь школе, протестировать всё во всех предложенных случаях, открыть Pull Request на GitHub со своими идеями и предложениями по улучшению — noo
Val_SA
25.09.2023 05:08Вопрос немного не по теме: у меня древний офисный ноут 2012 года с целероном и 2 гигагми оперативки(2 ядра, 2 гига, игровой, классика). ОС Linux Mint. Необходимое ПО у меня запуститься хотя бы?
YuriPanchul Автор
25.09.2023 05:08+1Запустится, но на пределе. У меня есть ноут с такими параметрами (2012 год, 2GB, Lubuntu), на нем Intel FPGA Quartus работает. Нужно swap не забыть сделать в несколько гигов.
Johan_Palych
25.09.2023 05:08+2Откопал свой старый комментарий. У меня такой старикан:
Laptop System: Acer product: Aspire 5030 v: V1.40 BIOS: Phoenix v: 1.40 date: 03/02/2006 AMD Turion 64 Mobile ML-32 bits: 64 type: UP RAM:2 GiB ID-1: /dev/sda vendor: Hitachi model: HTS421280H9AT00 size: 74.53 GiB
Много перепробовал дистрибов и остановился на Debian GNU/Linux 11 (bullseye) - LXDE(Openbox 3.6.1). Ставил в начале этого года.
Сейчас актуален Debian 12 Bookworm.
https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-12.1.0-amd64-lxde.iso
Если есть время и навык - неплохо зайдет Arch Linux
https://wiki.archlinux.org/title/LXDE_(Русский)Старый скрин: Старичок без томозов воспроизводит ролики yutube в Chromium(480p). Загрузка CPU в среднем 80% Используется родной HDD IDE.
Купил HDD кредл в отсек CD/DVD IDE(PATA), добавил SSD и развернул Debian на него.
NivER
25.09.2023 05:08+11От части пользователей был запрос к организаторам не валять дурака и показать как работать по нормальному, то бишь в Windows GUI и без скриптов.
facepalm.jpg
Может, ребята просто ошиблись профилем? ИМХО, если они изначально неспособны осилить консоль и скрипты, это уже вполне себе маркер для первичного отсеивания.
erlyvideo
25.09.2023 05:08+7нет, они просто изуродованы неправильным нормированием. Их надо не фильтровать и отсеивать, а объяснить и занести другие знания в голову.
Boilerplate
25.09.2023 05:08+1К чему такой скепсис? И в Quartus, и в ISE Xilinx / Vivado отличные графические приложения. И это как раз те программные комплексы, где писать скрипты - себе дороже и проще использовать GUI. Особенно забавно смотрится про "долгое возюканье мышью", когда обычно нужно ткнуть что-то типа "Implement" и потом "Programming" / "Simulation". Скрипты имеют там смысл, если нужно писать свою какую-то хитрую обертку, например, для сетевого подключения, прошивки. И, кстати, обычно большая часть времени уходит на ожидание синтеза / оптимизации.
Brak0del
25.09.2023 05:08И это как раз те программные комплексы, где писать скрипты - себе дороже и проще использовать GUI.
Без скриптов не получится CI. Не сможете погонять регрессионные тесты. Со скриптами какой-нибудь Jenkins раз в сутки будет собирать ваш проект и гонять полсотни тестбенчей в автоматическом режиме, а затем рисовать какую-то красивую статистику по этому поводу.
dimaaannn
25.09.2023 05:08+5Пишем фигню - получаем фигню.
Внезапно? Нееет! Виноват убунту! И билл гейтс. Не ну а шо система работает не так как мы себе придумали?
webhamster
25.09.2023 05:08#!/usr/bin/env bash
#!/usr/bin/bash
или, что правильней
#!/bin/bash
И всегда будет запускаться именно bash.
iig
25.09.2023 05:08+1Ubuntu наносит ответный удар:
/usr/bin/bash
bash: /usr/bin/bash: No such file or directory
R0bur
25.09.2023 05:08+5В том случае, который описан в статье, пользователи явно указывают в командной строке, какой они хотят использовать командный интерпретатор:
$ sh 03_synthesize_for_fpga.bash
От этого никакие декларации не помогут. Но таким пользователям можно предложить попробовать ещё много неработающих вариантов:
$ perl 03_synthesize_for_fpga.bash
$ python 03_synthesize_for_fpga.bash
$ ...И каждый раз будут выдаваться новые ошибки, которым можно удивляться.
Описанная в статье претензия претензия относится к разряду "Компьютер (операционная система) работает не так, как я хочу!". Ну, ок.Vermut666
25.09.2023 05:08-1...и правильный ответ было бы запускать
$ ./03_synthesize_for_fpga.bashтогда shebang сработает. Чуть ли ни на syscall уровне, как недавно в статье писали.
AlexanderS
25.09.2023 05:08+1Работать с GUI просто неэффективно, в Quartus нужно долго водить мышкой, нажимать на кнопки и открывать разные диалоги просто чтобы запустить прошивку платы.
Потоково работать может и неудобно, но обучаться-то - вполне. Чего может быть проще окошек? Тем более есть вещи, где графика нагляднее, например подсветка линий с невыполненными временными ограничениями, модульный дизайн проще мышкой нарисовать... А скрипты - это дело наживное и кто пойдёт по стезе сам себе велосипедов нужных напишет там где потребуется.
checkpoint
25.09.2023 05:08+2Потоково работать может и неудобно, но обучаться-то - вполне. Чего может быть проще окошек?
Проще окошек может быть только командная строка, согласен. Никогда не программировал и не программирую в окошках и своих студентов обучал этому же подходу.
AlexanderS
25.09.2023 05:08Не знаю что вы там в шелле программируете, но я программирую в Notepad++. А окошки это иерархию собрать и удобные отчеты посмотреть.
YuriPanchul Автор
25.09.2023 05:08Когда у вас тысячи модулей, их рисовать мышкой неудобно. Хотя рассматривать мышкой иерархию в waveform viewer - это OK.
Opaspap
25.09.2023 05:08мы не смогли победить Windows Subsystem for Linux ...
Это как ? Хотите совет ? wsl2+docker - 99% повторяемость. А вот как раз git bash врагу не посоветую.
sanstorm
25.09.2023 05:08Как раз так и запускал под убунтой! И у меня была эта проблема. Спасибо за разъяснение. Потом перезагрузил компьютер в виндовс, а там gowin eda была установлена в не стандартый путь, пока не перенес все в стандартые катологи. Почему-то переменная среды GOWIN_HOME ге подхватывалась скриптом и он не мог найти установленную ide. Спасибо за ваш труд!
bindek81
На такой вопрос нужно отвечать не "Y", а "YES I DO create run directories rather than with the synthesis scripts". Еще бы стихи Пушкина в вопрос вставили.