Длинный извилистый путь Школы Синтеза Цифровых Схем приближается к годовой кульминации. 21–23 пройдет хакатон по процессорам в зеленоградском МИЭТ, после чего 150 слушателей из дюжины российских городов оправятся готовится к майским праздникам, приближающимся сессиям и лету.

Но для тех, кто воспринимает школу не просто как научпоп, а реально собирается стать проектировщиком микросхем, мы приготовили экзамен с задачками в духе задачек на собеседованиях в Silicon Valley. В некоторых крупных электронных компаниях для решения таких задачек соискателя заводят в комнату без интернета, и он делает это под глазами экзаменатора на компанейском компьютере. Но так как ученики школы не волшебники, а только учатся, экзамен выкладывается открытым, но по его результатам школа будет давать рекомендации в электронные компании.

Все упражнения выполняются на языке описания аппаратуры System Verilog. Для проверки используется open‑source симулятор Icarus Verilog и не‑open‑source Questa от Siemens EDA. А также бесплатная среда синтеза для ПЛИС Intel FPGA Quartus Prime Lite.

Для экзамена мы выбрали три темы в четырех упражнениях:

  1. Конечные автоматы.

  2. Контроль потока данных.

  3. Верификация.

Мы не стали вводить в экзамен ничего про процессоры, так как после Школы мы будем проводить хакатон по проектированию процессоров в МИЭТ.

Упражнения/задачи экзамена находятся в репозитории valid‑ready‑etc, поддиректории boards/omdazz/09_exam.

Упражнение 1. exam_1_pow_5_multi_cycle_fsm

В этом упражнении нужно спроектировать еще один блок для вычисления пятой степени аргумента. Этот блок имеет тот же интерфейс, что и конвейерный блок, который мы разбирали на занятиях. Но мы хотим, чтобы вы спроектировали новый блок не с помощью конвейера из четырех умножителей, а с помощью конечного автомата, который итеративно повторяет умножение четыре раза, используя только один умножитель. Да, у блока будет более низкая пропускная способность, чем у конвейерного блока, но зато он будет гораздо меньше: как умножители, так и D‑триггеры для организации конвейера занимают много места и потребляют много электроэнергии.

Более подробный список требований вы можете прочесть в файле pow_5_multi_cycle_fsm.sv. Вы также можете ориентироваться на лог golden_log.txt и скриншот временных диаграмм golden_wave.png, созданных при симуляции нашего решения.

Для симуляции задания используется Icarus Verilog вместе с программой для просмотра временных диаграмм GTKWave. Для поддержки симуляции в директории упражнения есть следующие файлы:

  • 02_simulate_rtl.bash — скрипт на Bash для запуска симулятора.

  • gtkwave.tcl — скрипт на языке Tcl для добавления сигналов для отладки на временные диаграммы.

  • tb.sv — тестовое окружение.

Если у вас есть плата Omdazz/RzRd с ПЛИС Intel FPGA Cyclone IV, вы можете проверить работу вашего блока на этой плате. В директории упражнения есть следующие файлы, которые поддерживают синтез:

  • 03_synthesize_for_fpga.bash — скрипт для запуска синтеза и конфигурации ПЛИС на плате через программатор USB Blaster.

  • 04_configure_fpga.bash — скрипт для конфигурации ПЛИС без запуска синтеза.

  • fpga_top_extra.qsf — скрипт на языке Tcl для синтеза в Intel FPGA Quartus Prime Lite.

  • fpga_top.sv — верхний модуль для синтеза. Устанавливает блок, содержит соединения портов модуля с кнопками и светодиодами.

Для дополнительной информации вы можете прочитать заметку на Хабре «Третий вопрос на интервью в электронные компании». В ней описывается та же организация симуляции и синтеза, которая используется и в этом упражнении, но не для блока возведения в степень, а для очереди FIFO.

Работа схемы на плате с искуственно медленным тактовым сигналом с частотой 1 Герц (1 такт в секунду):

Упражнение 2. exam_2_gearbox_1_to_2

Упражнение 3. exam_2_gearbox_2_to_1

Упражнение 2 и 3 связаны. Упражнение 2 описано в посте на Хабре “Как подготовиться к собеседованию в Samsung Advanced Computing Lab”.

Блок в этом упражнениии превращает поток данных c протоколом valid/ready в другой поток данных, тоже с протоколом valid/ready, но трансферами двойной ширины. Упражнение 3 выполняет противоположную операцию — превращает поток данных в поток половинной ширины.

Для упражнения 2 код для RTL уже написан, но вам нужно дописать код для верификации (см. TODO в tb.sv). Для упражнения 3 тестовое окружение полностью написано, но вам нужно написать RTL (см. TODO в gearbox_2_to_1.sv).

Симуляция и синтез для упражнений 2 и 3 выполняется аналогично упражнению 1.

Временная диаграмма для упражнения 2
Временная диаграмма для упражнения 2
Временная диаграмма для упражнения 3
Временная диаграмма для упражнения 3

Видео работающей схемы для упражнения 2:

Видео работающей схемы для упражнения 3:

Упражнение 4. exam_4_axi_pipelined_wr_out_of_order_rd

В этом упражнении вы реализуете пассивный монитор, важную часть Verification IP (VIP) для упрощенного протокола AXI, который мы разбирали на занятии.

IP в данном контексте означает Intellectual Property («интеллектуальная собственность»), а не Internet Protocol. Термином «Verification IP» называют пакеты, которые включают в себя функциональные модели шин (Bus Functional Model — BFM), модели слейвов (reference slaves) и мониторы шин (passive monitors).

Мониторы AXI используются для как для верификации устройств ввода‑вывода, подключенных к процессору, так и для верификации процессорных ядер, соединенных с блоком кэша второго уровня или с контроллером памяти.

Вы можете прочитать про Verification IP в заметке на Хабре «Причина агонии студентов во время интервью, или популярно о моделях интерфейсов шины».

В отличие от моделей мастера и слейва, монитор не формирует никакие сигналы. Он следит за шиной, печатает лог проходящих транзакций и выполняет проверки данных, которые приходят со слейва во время операции чтения. Для проверки монитор использует так называемую «теневую память», структуру данных, которая моделирует работу настоящей памяти внутри слейва и для которой монитор повторяет транзакции, которые он видит на шине. Если слейв вернул не те данные, которые находятся в теневой памяти, то это повод для инженера‑верификатора вместе с проектировщиком RTL кода слейва разобраться, почему это произошло.

Синтез для проверки упражнения 4 не используется, так как все компоненты в этом упражнении — поведенческие модели. При использовании Verification IP в реальной практике верификации одна или несколько из моделей заменяются верифицируемым блоком RTL. Последний часто называют Design Under Test (или Device Under Test — DUT).

Симуляция упражнения 4 выполняется с тем же скриптом 02_simulate_rtl.bash, что и для других упражнений, но при этом используется симулятор Questa Advanced Simulator от Siemens EDA. Для работы с ним в директории упражнения есть скрипт на языке Tcl — questa.tcl, который запускает компиляцию и симуляцию проекта, а также добавляет к временным диаграммам нужные для отладки сигналы.

Код монитора содержит куски кода из моделей мастера и слейва. Если вы будете смотреть на мастер, слейв и текст ожидаемого лога в файле golden_log_monitor_only.txt, реализация кода для монитора не должна вызвать у вас трудностей.

Успеха в проекте!

Приложение. TODO для упражнений 1 и 2 на русском языке (в коде они на английском)

Упражнение 1. exam_1_pow_5_multi_cycle_fsm

Разработайте параметризованный модуль, который вычисляет пятую степень числа итеративно, за несколько тактов.

Требования:

  1. Вы можете использовать только одну операцию умножения в вашем коде. Программа синтеза должна поставить только один экземпляр блока умножения в синтезированную схему.

  2. Если входные данные идут один за другим (back‑to‑back, up_vld=1) и задержка на выходе (backpressure) отсутствует (down_rdy=1), блок должен выдавать результат каждые 5 тактов.

  3. Вычисление не должно ломаться при появлении задержки на выходе (backpressure). Сигнал down_rdy может быть выставлен в 0 в любой момент, без потери результатов текущей операции.

  4. Синтезированная схема должна работать на плате ПЛИС.

  5. Модуль должен быть полностью совместим с тем же тестовым окружением, которое использовалось для верификации модулей pow_5_single_cycle и pow_5_pipelined.

  6. Дополнительное задание 1: Сравните тактовую частоту и утилизацию ресурсов ПЛИС спроектированной схемы — с pow_5_single_cycle и pow_5_pipelined. Для корректного синтеза убедитесь, что путь через умножитель начинается с D‑триггера и заканчивается D‑триггером.

  7. Дополнительное задание 1: Напишите утверждение темпоральной логики (continuous assertion или System Verilog Assertion — SVA), которое проверяет, что: если down_rdy=1 на протяжении всего вычисления, и мы установили up_vld=1, тогда мы получим down_vld=1 и правильное значение down_data=up_data в степени 5 в течение 5–7 тактов после того, как up_vld=1 будет подтвержден как принятый, сигналом up_rdy=1.

Про использование утверждений темпоральной логики для верификации вы можете прочитать в заметке на Хабре «Слышали ли вы про язык „e“? А ведь он был продан за $315 миллионов долларов». В ней же упоминается связаная тема — функциональное покрытие последовательностей (cover properties).

Для справки при проектировании блока вы можете использовать лог golden_log.txt, а также скриншот временных диаграмм golden_wave.png, результаты симуляции нашего решения.

Упражнение 2. exam_2_gearbox_1_to_2

Напишите код для верификации переходника gearbox_1_to_2. Для справки вы можете использовать тестовое окружение из примера boards/omdazz/06_pipelines/26_pow_5_pipelined/tb.sv

Общая идея как верифицировать переходник с valid/ready протоколом для входящего (upstream) и выходящего (downstream) потоков передач (transfers):

  1. Создайте очередь для отслеживания данных, используя соответствующую конструкцию языка SystemVerilog (queue [$]). Ширина этой очереди устанавливается параметром width.

  2. Каждый раз, когда вы наблюдаете входящую передачу на положительном фронте тактового сигнала (up_vld & up_rdy), вталкивайте up_data в хвост очереди для отслеживания данных.

  3. Каждый раз, когда вы наблюдаете выходящую передачу (down_vld и down_rdy), сначала проверьте, что очередь содержит как минимум два элемента, затем сравните два элемента в голове очереди с down_data, и, наконец, вытолкните элементы из очереди.

  4. В конце симуляции (блок final) проверьте, что очередь пуста. Если нет, выведите содержимое очереди в лог.

Все эти задачи можно решать дома, а вот хакатон по процессорам будет в Зеленограде. Вот его объявление:

Для тех, кто собирается возмутиться «А как же заголовок? Что там такое автор говорил про миллиард пользователей устройства?» Все честно, как в швейцарском банке. Сегодня у нас в Самсунге (автор работает в группе GPU в Самсунге) менеджер автора сообщил, что у нас открылись свежие позиции для проектировщиков именно таких устройств. Вот объявление.

Правда для поступления на эту позицию нужно право на работу в США, а также соблюдение экспортных ограничений. И не все читатели, которые могут решать задачки, могут пойти на эту позицию. Но если вы не будете решать микроархитектурные задачки, то вы не сможете поступить на такую позицию даже через 10 лет, когда (я надеюсь) и в России будет возможность проектирования устройств с миллиардом потенциальных пользователей. Тем или иным способом.

Комментарии (16)


  1. punzik
    05.04.2023 07:09

    А в упражнениях 2 и 3 сигналы flow control должны разрываться триггером, или допустим сквозной комбинационный путь?


    1. YuriPanchul Автор
      05.04.2023 07:09

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


      1. punzik
        05.04.2023 07:09
        +2

        Да я всё равно не решу :)


  1. progchip666
    05.04.2023 07:09
    +1

    Для меня является хорошей новостью что МИЭТ возвращается к своим корням и в ближайшем будущем его выпускники снова смогут заниматься разработкой чипов(именно для этого институт и создавался). Я правильно понял что институту ещё и исходное имя вернули и выбросили эту противную буковку Г из названия, добавленную несколько лет назад?


  1. byman
    05.04.2023 07:09

    Сложные задачи. Я впал в ступор уже на умножителе 5-й степени. Смотрел на картинку и не мог понять как перемножая 8-разрядные числа непонятного формата получить верный 8-разрядный результат :)


    1. YuriPanchul Автор
      05.04.2023 07:09
      +1

      Картинка приведена для иллюстрации. Она вообще не является решением, так как в ней не реализована backpressure, нет сигналов ready для upstream и downstream. Только сигналы valid.

      Читайте текст. В тексте сказано "параметризованный модуль", то есть должен работать и с 8-битными, и с 32-битными, и с 786-битными числами.

      Далее, в тексте сказано "совместим с тестбенчем".

      https://gitflic.ru/project/yuri-panchul/valid-ready-etc/blob?file=boards%2Fomdazz%2F09_exam%2Fexam_1_pow_5_multi_cycle_fsm%2Ftb.sv

      Из тестебенча очевидно что речь идет о целых числах. Причем со знаком они или беззнаковые - не имеет значения в данном случае, так как количество бит у аргумента и у результата одинаковое, и младшие N бит результата что умножения со знаком, что беззнакового умножения двух N-битных чисел совпадают. У них отличаются старшие N бит (от бита 2*N-1 до бита N), но мы эти биты обрезаем.

      Уточнение: когда я говорю выше "числа со знаком" я имею в виду в дополнительном коде (two's complement). Если вы хотите привести решение в one's complement, можете сами ответить, будет ли оно совместимо с тестбенчем.

      При этом, если вы перепишете тестбенч, и при этом напишете решение:

      1. С фиксированной точкой, округлением и насыщением.

      2. В формате с плавающей точкой IEEE 754 - 32 бита или 64-бита.

      3. В новомодных форматах unum или posit.

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

      И да, кстати о верности результата. Если вы напишете на Си: "unsigned a, b; a = 2000000000; b = a * a * a * a * a;" - то у вас будет верный или неверный результат?

      Впрочем вы можете написать модуль который принимает числа с разрядностью N, и выдает результаты с разрядностью 5*N - к цели задачки это ортогонально.


      1. byman
        05.04.2023 07:09
        +1

        это ортогонально.

        "Так бы и сказал"(с) Джентльмены удачи :)


  1. Andy_Big
    05.04.2023 07:09

    Вот какого лешего эта статья делает в хабе "Программирование микроконтроллеров"? Уже не в первый раз задаюсь подобным вопросом, видя Ваши статьи. Зачем Вы суете их туда, где им делать совершенно нечего?


    1. YuriPanchul Автор
      05.04.2023 07:09
      +1

      Объясняю: я лично встречал программистов микроконтроллеров, у которых в какой-то момент своей карьеры возникала мысль "а не попробовать ли мне ПЛИС"?

      Комбинация из программиста микроконтролеров и проектировщика ПЛИС хорошо продается, если вы захотите интервьироваться в аэрокосмические компании типа Blue Origin. Так как на ракете сеть их микроконтроллеров, ПЛИС и сенсоров. Они называют ПЛИС "an I/O extension for microcontrollers".

      А чтобы эффективно использовать ПЛИС, нужно уметь решать микроархитектурные задачки по контролю потока, а также владеть интерфейсами шин - RTL и верификацией. Задачка с интервью в Blue Origin: напишите слейв с шиной AHB-Lite внутри которого два регистра.

      Принимаете такое объяснение?


      1. Andy_Big
        05.04.2023 07:09

        Демагогия. Если программист микроконтроллеров захочет попробовать себя в FPGA, то он пойдет читать статьи из хаба "FPGA". А если я отслеживаю хаб "Программирование микроконтроллеров", то это значит, что меня интересует именно программирование микроконтроллеров, как ни странно. А не финансы (а вдруг программист захочет попробовать себя в финансах), не разработка под Линукс, не веб-дизайн, не FPGA и т.д.


        1. YuriPanchul Автор
          05.04.2023 07:09

          Если программист микроконтроллеров захочет попробовать себя в FPGA, то он пойдет читать статьи из хаба "FPGA". 

          А если он не знает, что это за хрень? А тут увидит и узнает.

          Следующий аргумент: когда я лет 10 назад поехал на конференцию микроконтроллерной компании Microchip в Аризоне - Microchip Masters - там был в том числе и класс, на котором объяснялась структура конвейера микропроцессорного ядра MIPS M4K и его производных (4Kc/14K/microAptiv/M5150) которые используются в микроконтроллерах PIC32. У меня многие заметки именно про микроархитектуру микроконтроллерных ядер. Почему Микрочипу можно, а мне нельзя? На их конференцию тоже ездят поголовно программисты микроконтроллеров.


          1. Andy_Big
            05.04.2023 07:09

            А если он не знает, что это за хрень?

            То он эту статью даже по диагонали не осилит.

             когда я лет 10 назад поехал на конференцию

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


            1. YuriPanchul Автор
              05.04.2023 07:09

              Вы про сейчас думайте, а не про 10 лет назад в Аризоне.

              Держу пари, что этот класс у Микрочипа и сейчас в программе 2023 года есть. И вообще, микрочиповцы сделали встроенный ПЛИС в микроконтроллеры. См. напр. https://www.microchip.com/en-us/products/fpgas-and-plds/system-on-chip-fpgas

              SmartFusion® SoC FPGAs

              If you need a true SoC that gives more flexibility than traditional fixed-function microcontrollers without the excessive cost of soft processor cores on traditional FPGAs, SmartFusion SoCs offer full customization, IP protection and ease of use.

              Industry’s only FPGAs with hard 32-bit Arm Cortex-M3 core

              Programmable analog with Analog-to-Digital Converter (ADC), voltage/current/temperature monitors, Digital-to-Analog Converter (DAC), comparators, and Analog Compute Engine (ACE)

              Proven ProASIC® 3 FPGA fabric with up to 500K gates and 204 analog and digital I/Os


              1. Andy_Big
                05.04.2023 07:09

                Вот когда будете писать статью про этот микроконтроллер - тогда заслуженно разместите ее в обоих хабах :)


        1. Brak0del
          05.04.2023 07:09

          А если я отслеживаю хаб "Программирование микроконтроллеров", то это значит, что меня интересует именно программирование микроконтроллеров, как ни странно.

          В наше время тема FPGA и микроконтроллеров местами пересекаются и дополняют друг друга. Во многих современных FPGA встречаются встроенные микроконтроллерные или микропроцессорные hard/soft ядра. У каждого более-менее серьезного вендора есть свой SoC с хард-процессором и FPGA на борту, а также своё софт-процессорное ядрышко для тех, кто не хочет платить лишнюю копеечку. Иногда эти софт-процессорчики приходится писать и fpga-шникам, а затем программировать. Иногда fpga-шникам приходится писать базовую периферию к этим soft/hard ядрышкам, а затем писать базовый драйверок для взаимодействия со своей периферией. Тогда всплывают все эти вопросы проектирования шин, транзакции, арбитраж и всё остальное.


          1. Andy_Big
            05.04.2023 07:09

            Местами пересекаются. Но не часто и уж точно не в этой статье.