В субботу прошло первое занятие Школы Синтеза Цифровых Схем. Записалось 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)


  1. bindek81
    25.09.2023 05:08
    +6

    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.

    На такой вопрос нужно отвечать не "Y", а "YES I DO create run directories rather than with the synthesis scripts". Еще бы стихи Пушкина в вопрос вставили.


  1. igor_suhorukov
    25.09.2023 05:08
    +3

    C hardware сложнее, если бы не доступ к апаратуре - упаковка в Docker и все воспроизводимо у всех кто запускает контейнеры, как и виртуальные машины (если бы не досуп к аппаратным ресурсам)


    1. tzlom
      25.09.2023 05:08

      Нет никаких проблем пробросить нужные устройства внутрь контейнера. В тяжелых случаях поможет баш скрипт.


    1. 13werwolf13
      25.09.2023 05:08

      nspawn..


  1. hssergey
    25.09.2023 05:08
    +1

    Помню, сталкивался где-то у себя с разным поведением, если в скрипте #!/bin/sh или !#/bin/bash . Но как-то сильно на это внимание не обратил, исправил в проблемном скрипте на bash и все...


    1. YuriPanchul Автор
      25.09.2023 05:08
      +1

      Так вот если после этого взять ваш исправленный скрипт и запустить его "sh скрипт", то он снова поломается, потому что #!/bin/bash" будет проигнорирован.


      1. erlyvideo
        25.09.2023 05:08

        ага, а ещё бывает чудной dash подкладывают


    1. coodi
      25.09.2023 05:08

      В openwrt вроде того было


  1. Yak52
    25.09.2023 05:08
    +25

    То есть криво написаный скрипт, с использованием относительных путей, без проверок на то, что за оболочка используется, но удар в спину почему то от Ubuntu?


    1. 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 и теперь надо проверять против еще одного кривого сценария использования.


      1. Hamer13
        25.09.2023 05:08
        +11

        Всё же вы не правы на счёт удара в спину. В 90-х, да и в 00-х, в куче статей говорилось что bash в линуксе используется по умолчанию, а в другой куче говорилось только о том что он в линуксе есть по умолчанию. Те статьи ведь писали обычные люди, которые установили себе какой-то конкретный дистрибутив и работали, в основном, только с ним.
        Применение же bash в качестве sh как раз и породило массу проблем с башизмами: человек честно указывает в шебанге «/bin/sh», а на самом деле система использует bash. При этом он эти самые башизмы использует, просто об этом не подозревая — работает же. И, в результате, этот скрипт прекрасно работает на компе пользователя, но при запуске в каком-нибудь hp-ux валится. Почему? От чего? Мы же явно указали «/bin/sh»! А вот фигвам, вы указали, а у ОС своё прочтение.
        Собственно, использование в качестве sh чего-то, реализующего только POSIX SHELL и есть стандарт.


        1. YuriPanchul Автор
          25.09.2023 05:08

          Ну это да, "удар в спину" - это преувеличение. Я-то никогда не считал, что sh - это баш, и для башевских скриптов пишу всегда bash в shebang. Но другие-то считают! Иначе почему ученик написал "sh скрипт.bash"


    1. Irvus
      25.09.2023 05:08
      -1

      Ну, badstyle кнш, но проблема не в этом же. По команде sh вместо bash вызывается dash. Не знаю, кстати, что это такое, пошел гуглить


  1. Hamer13
    25.09.2023 05:08
    +16

    Dash для 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
    $ 
    


    1. 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
      


      1. YuriPanchul Автор
        25.09.2023 05:08
        +5

        О, спасибо!


        1. White_Thrasher
          25.09.2023 05:08

          Когда в 2021 ставил Ubuntu 20.04LTS, то там sh была симлинком на dash. Возможно кто- то из причастных скучает по Korn shell или ему там что-то недодали, не знаю.

          А не решило бы проблему на месте, в качестве "временной меры" , добавление команды, bash перед скриптом? То есть:

          $ bash ./some_path/ some_script.sh


          1. YuriPanchul Автор
            25.09.2023 05:08

            Так это и написано в инструкции для Windows. А для Linux сказано делать ./some_path/some_script.bash . Но люди инструкции не читают, и пишут то some_script.sh без ./ то sh ./some_path/some_script.bash


  1. iig
    25.09.2023 05:08
    +10

    Тестировать свои скрипты на работоспособность на разных ОС?
    Явно указывать, на каких ОС они протестированы?
    Заорачивать в docker?
    Не использовать bash?
    Использовать python?
    Да нет, сложно как-то… @#$-@#$ и в production наше все.


    1. YuriPanchul Автор
      25.09.2023 05:08
      +10

      Я протестировал скрипты этой и предыдущей инкарнации в Ubuntu, Lubuntu, CentOS, ALT, Simply Linux, Astra Linux и других. Докер в решении всех проблем не поможет - там проблемы с USB Blaster и его драйверами.

      Почему не использовать bash, если он везде есть и нормально работает кроме вот таких кривых сценариев использования.

      Питон... Да у питона куча проблем с совместимостью с библиотеками.


      1. pulsatrix
        25.09.2023 05:08

        Питон… Да у питона куча проблем с совместимостью с библиотеками.
        Ленина

        питона не трожь.


        1. tzlom
          25.09.2023 05:08
          +2

          лучше писать на баше чем трогать питона


      1. iig
        25.09.2023 05:08

        Питон… Да у питона куча проблем с совместимостью с библиотеками.

        Какие библиотеки нужно использовать в обертке над zip, чтобы словить несовместимость?


        1. Shaman_RSHU
          25.09.2023 05:08

          Для этого нужно знать, какие библиотеки нужно использовать в обертке над zip :)


          1. iig
            25.09.2023 05:08

            Стандартную zipfile, которая есть даже в python 2.x?


      1. 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 конечно.


    1. unaimillan
      25.09.2023 05:08
      -1

      писать негативные комментарии в интернете — yees,

      помочь школе, протестировать всё во всех предложенных случаях, открыть Pull Request на GitHub со своими идеями и предложениями по улучшению — noo


      1. iig
        25.09.2023 05:08

        писать негативные комментарии в интернете — yees,

        С подключением! ;)


  1. Val_SA
    25.09.2023 05:08

    Вопрос немного не по теме: у меня древний офисный ноут 2012 года с целероном и 2 гигагми оперативки(2 ядра, 2 гига, игровой, классика). ОС Linux Mint. Необходимое ПО у меня запуститься хотя бы?


    1. YuriPanchul Автор
      25.09.2023 05:08
      +1

      Запустится, но на пределе. У меня есть ноут с такими параметрами (2012 год, 2GB, Lubuntu), на нем Intel FPGA Quartus работает. Нужно swap не забыть сделать в несколько гигов.


    1. 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 на него.


  1. NivER
    25.09.2023 05:08
    +11

    От части пользователей был запрос к организаторам не валять дурака и показать как работать по нормальному, то бишь в Windows GUI и без скриптов.

    facepalm.jpg

    Может, ребята просто ошиблись профилем? ИМХО, если они изначально неспособны осилить консоль и скрипты, это уже вполне себе маркер для первичного отсеивания.


    1. erlyvideo
      25.09.2023 05:08
      +7

      нет, они просто изуродованы неправильным нормированием. Их надо не фильтровать и отсеивать, а объяснить и занести другие знания в голову.


    1. Boilerplate
      25.09.2023 05:08
      +1

      К чему такой скепсис? И в Quartus, и в ISE Xilinx / Vivado отличные графические приложения. И это как раз те программные комплексы, где писать скрипты - себе дороже и проще использовать GUI. Особенно забавно смотрится про "долгое возюканье мышью", когда обычно нужно ткнуть что-то типа "Implement" и потом "Programming" / "Simulation". Скрипты имеют там смысл, если нужно писать свою какую-то хитрую обертку, например, для сетевого подключения, прошивки. И, кстати, обычно большая часть времени уходит на ожидание синтеза / оптимизации.


      1. Brak0del
        25.09.2023 05:08

        И это как раз те программные комплексы, где писать скрипты - себе дороже и проще использовать GUI.

        Без скриптов не получится CI. Не сможете погонять регрессионные тесты. Со скриптами какой-нибудь Jenkins раз в сутки будет собирать ваш проект и гонять полсотни тестбенчей в автоматическом режиме, а затем рисовать какую-то красивую статистику по этому поводу.


  1. erlyvideo
    25.09.2023 05:08
    +4

    Это очень круто, вы делаете очень важные дела!


    1. pecmapm
      25.09.2023 05:08
      +1

      Юрий, вы и команда огромные молодцы!


      1. YuriPanchul Автор
        25.09.2023 05:08

        Спасибо!


  1. dimaaannn
    25.09.2023 05:08
    +5

    Пишем фигню - получаем фигню.

    Внезапно? Нееет! Виноват убунту! И билл гейтс. Не ну а шо система работает не так как мы себе придумали?


  1. webhamster
    25.09.2023 05:08

    #!/usr/bin/env bash

    #!/usr/bin/bash

    или, что правильней

    #!/bin/bash

    И всегда будет запускаться именно bash.


    1. iig
      25.09.2023 05:08
      +1

      Ubuntu наносит ответный удар:


      /usr/bin/bash
      bash: /usr/bin/bash: No such file or directory


    1. 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
      $ ...

      И каждый раз будут выдаваться новые ошибки, которым можно удивляться.
      Описанная в статье претензия претензия относится к разряду "Компьютер (операционная система) работает не так, как я хочу!". Ну, ок.


      1. Vermut666
        25.09.2023 05:08
        -1

        ...и правильный ответ было бы запускать

        $ ./03_synthesize_for_fpga.bash

        тогда shebang сработает. Чуть ли ни на syscall уровне, как недавно в статье писали.


  1. AlexanderS
    25.09.2023 05:08
    +1

    Работать с GUI просто неэффективно, в Quartus нужно долго водить мышкой, нажимать на кнопки и открывать разные диалоги просто чтобы запустить прошивку платы.

    Потоково работать может и неудобно, но обучаться-то - вполне. Чего может быть проще окошек? Тем более есть вещи, где графика нагляднее, например подсветка линий с невыполненными временными ограничениями, модульный дизайн проще мышкой нарисовать... А скрипты - это дело наживное и кто пойдёт по стезе сам себе велосипедов нужных напишет там где потребуется.


    1. checkpoint
      25.09.2023 05:08
      +2

      Потоково работать может и неудобно, но обучаться-то - вполне. Чего может быть проще окошек?

      Проще окошек может быть только командная строка, согласен. Никогда не программировал и не программирую в окошках и своих студентов обучал этому же подходу.


      1. AlexanderS
        25.09.2023 05:08

        Не знаю что вы там в шелле программируете, но я программирую в Notepad++. А окошки это иерархию собрать и удобные отчеты посмотреть.


    1. YuriPanchul Автор
      25.09.2023 05:08

      Когда у вас тысячи модулей, их рисовать мышкой неудобно. Хотя рассматривать мышкой иерархию в waveform viewer - это OK.


      1. AlexanderS
        25.09.2023 05:08

        Извините, но когда тысячи модулей - это уже не обучение)


  1. vectorplus
    25.09.2023 05:08
    -1

    За Русь Верилогу обучусь!

    ????


    1. YuriPanchul Автор
      25.09.2023 05:08
      +2

      Наш человек! :-)


  1. Opaspap
    25.09.2023 05:08

    мы не смогли победить Windows Subsystem for Linux ...

    Это как ? Хотите совет ? wsl2+docker - 99% повторяемость. А вот как раз git bash врагу не посоветую.


  1. sanstorm
    25.09.2023 05:08

    Как раз так и запускал под убунтой! И у меня была эта проблема. Спасибо за разъяснение. Потом перезагрузил компьютер в виндовс, а там gowin eda была установлена в не стандартый путь, пока не перенес все в стандартые катологи. Почему-то переменная среды GOWIN_HOME ге подхватывалась скриптом и он не мог найти установленную ide. Спасибо за ваш труд!