Фотографии, материалы и перипетии семинара MIPSfpga в МИФИ

В конце октября в МИФИ состоялся семинар по MIPSfpga — один из серии семинаров, организованных российскими вузами совместно с Imagination Technologies, Microchip Technology в партнерстве с Гамма Санкт-Петербург, представителями Xilinx в России компанией Макро Групп, с участием докладчиков из MathWorks и НИИСИ. Ниже — смесь из фотографий, ссылок на материалы, заметок о подготовке семинара и о мифишной культуре.

mipsfpga_mephi_20151028_125500-2

Ниже фотография МИФИ снаружи. Слово «ядерный» напоминает, что в МИФИ стоит ядерный реактор, поэтому туда трудно попасть, особенно с американским паспортом — пропуск мне готовили недели две, а приказ о семинаре подписывал ректор. На входе стоит автоматчик с Калашниковым (!)

(Автоматчика мне сфотографировать не разрешили)

mipsfpga_mephi_20151028_073619

Вот я (Юрий Панчул) с другими организаторами семинара — Игорем Ивановичем Шагуриным и Максимом Горбуновым:

mipsfpga_mephi_20151028_170047

Игорь Иванович Шагурин, зам. заведующего кафедрой микро- и наноэлектроники — автор книг и статей по микропроцессорам Intel, Motorola и PowerPC, лабораторных работ по MIPS.

Screenshot 2015-11-20 08.00.25

Интересно, что Игорь Иванович Шагурин ездил представлять советскую электронику на конференцию в Сан-Франциско еще в 1970-е годы, когда СССР был довольно изолированной страной. Участников той конференции по VLSI в 1970-х возили в Muir Woods, местность с самыми высокими на земле секвойами Sequoia sempervirens

MuirWoods11

Максим Горбунов — исследователь из НИИСИ / SRISA, института, который занимается в том числе разработкой российских микропроцессоров с архитектурой MIPS — КОМДИВ-32 и КОМДИВ-64.

UPD: Уточнение от Максима:

«Писать, что КОМДИВ-32 и КОМДИВ-64 имеют MIPS-архитектуру — не совсем корректно (иначе мы бы так и писали 🙂 ). Мы обычно пишем, что КОМДИВ — это MIPS-подобная архитектура и система команд. Мы можем транслировать команды RISC процессора в наш код, это делается аппаратно. Да и подобие касается старой архитектуры MIPS-I. В упоминаемом Вами лабнике Шагурина с соавторами допущена очень досадная неточность, связанная с тем, что MIPS-процессоров на тот момент в распоряжении не было, так что сделали лабы на нашем процессоре. Короче говоря, просьба заменить «архитектуру MIPS» на MIPS-подобную архитектуру. »

Максим специализируется на проектировании топологии радиационно-стойких СБИС и был сопредседателем одной из секций международной конференции RADECS в Москве:

866195_original

Перед началом семинара MIPSfpga в МИФИ один из инструкторов, Егор Кузьмин, стал спрашивать меня на тему race conditions в некоей схеме для специализированных вычислений, которая возникла у них как студенческий проект. Я не уверен, что его правильно понял, но высказал, что в правильно организованном синхронном дизайне таких проблем не возникает и пообщал прислать в качестве примера фотографию страницы из книжки «Цифровая арифметика», на которой разбирается организация конвейероного сумматора, который содержит малое количество комбинаторной логики (такое же как в сумматоре с последовательным переносом), но при этом размещает регистры (D-триггеры) таким образом, что сумматор может запускать новую операцию сложения каждый такт, с частотой тактового сигнала, определяемой задержкой однобитного полного комбинационного сумматора:

Digital Arithmetic 1st Edition by Milos D. Ercegovac and Tomás Lang

digital_arithmetic_by_milos_ercegovac_and_tomas_lang_91

Заодно сфотографировал пару страниц про self-times асинхронные схемы, тоже имеющие отношение к вопросу.

Потом я был представлен Владимиру Дементьеву, который вместе с Андреем Андриановым, Дмитрием Козловским ведет в МИФИ лабораторные занятия по программированию микроконтроллеров Microchip PIC32MX. Я рассказал Владимиру, что профессор Алекс Дин из Университета Северной Каролины скооперировался с Imagination, Microchip и Digilent и сейчас разрабатывает новый курс по программированию микроконтроллеров Microchip PIC32MZ, причем этот курс включает RTOS-ы и новомодное соединение микроконтроллеров с облаком. Микроконтроллер PIC32MZ построен на основе микропроцессорного ядра MIPS microAptiv UP, того же самого, которые используется в MIPSfpga. Посему я стал агитировать товарищей из МИФИ, чтобы они приняли участие в ревью и (если им понравится) бета-тестированию этого курса:

Screenshot 2015-11-24 23.00.09

Но вернемся к нашему семинару. Тема семинара была MIPSfpga. Что это такое:


MIPSfpga — бесплатно лицензируемые для университетов исходные тексты промышленного микропроцессорного ядра MIPS microAptiv UP.
Это ядро используется как основа микроконтроллера Microchip PIC32MZ, а также новой платформы для «интернета вещей» — Samsung Artik 1.

Ядро MIPS microAptiv UP применяется в промышленности вместе со стандартным за последние 25 лет технологическим процессом проектирования микросхем, при котором процессор и другие компоненты системы на кристалле разрабатываются на языке описания аппаратуры Verilog, после чего описание через несколько преобразований превращается в маску, по которой на фабрике изготавливаются микросхемы.

Образовательная версия MIPS microAptiv UP — MIPSfpga — использует альтернативный путь реализации: описание системы превращается в файлы конфигурации для недорогих студенческих плат с программируемыми пользователем вентильными матрицами (ППВМ), которые часто называют программируемыми логическими интегральными схемами (ПЛИС) или Field Programmable Gate Array (FPGA).

Итак, сначала выступил я и рассказал про:

1. Компанию Imagination Technologies и ее отделение MIPS business unit

2. Образовательные программы Imagination Technologies

3. Для освежения понятия о RTL-to-GDSII flow для тех в аудитории, у кого Verilo/VHDL не входили в специализацию: Как проектируются IP-блоки и cистемы на кристалле (СнК).

4. Немного рассказал про три линейки микропроцессорных ядер MIPS и более подробно — про линейку ядер микроконтроллерного класса, на основе одного из которых (MIPS microAptiv UP) создан пакет MIPSfpga

5. Так как одно из упражнений далее включало демонстрацию работы кэша, то я сказал пару слов и про кэши в MIPS microAptiv UP

mipsfpga_mephi_20151028_093512

mipsfpga_mephi_20151028_093714

После моего первого выступления выступил Михаил Песельник, докладчик от MathWorks:

mipsfpga_mephi_20151028_111807

Михаил Песельник реализовал подмножество MIPS на Simulink, что получило некий приз редакторских симпатий MATLAB Central Pick of the Week:

966399_original

Пример Михаила показал, что для студента архитектуру и микроархитектуру процессорных ядер можно изучать разными способами — хоть на Verilog и VHDL, хоть с помощью моделей на Си, хоть с помощью Simulink.

А вот после того, как основы архитектуры и микроархитектуры изучены, студенту стоит поэкспериментировать с промышленным процессором, и вот тут выходит на сцену MIPSfpga, с которым:

  1. Студенты могут строить свои собственные прототипы систем на кристалле, соединяя микропроцессорное ядро, память и спроектированные ими устройства ввода-вывода
  2. Внутренние регистры можно подсоединять к выходным портам и выводить наружу информацию о текущем состоянии процессорного конвейера, кэшей и устройства управления памятью. После этого процессор можно запустить на низкой тактовой частоте и наблюдать его работу «в замедленной съемке».
  3. Студенты могут экспериментировать со своими вариантами кэшей, проектировать многоядерные системы со специализированными сопроцессорами, эксперименторовать с разделением задачи на аппаратную и программную часть.

Но чтобы экспериментировали с разработками SoC и с ядром, им нужно хорошо владеть инструментом / средством реализации. Поэтому после Михаила выступил Александр Филиппов, инженер по применению из Макро Групп — официального представителя компании Xilinx в России. Xilinx — компания, которая в свое время изобрела FPGA и по сей день остается #1 в наиболее высокоскоростных FPGA.

Александр Филиппов сделал два доклада:

  • Новые FPGA 7-й серии и MPSoC UltraScale – продукты XILINX для реализации мощных программируемых «систем на кристалле»
  • Среда проектирования XILINX VIVADO для создания «систем на кристалле»

mipsfpga_mephi_20151028_114103

Что такое ПЛИС / FPGA я на пальцах объяснил в другом посте на Хабре — Как начать разрабатывать железо, используя ПЛИС — пошаговая инструкция. Но повторим эту информацию снова:

В самом простом варианте FPGA состоит из матрицы однородных ячеек, в функцию каждой из которых можно поменять с помощью мультиплексоров, подсоединенных к битам конфигурационной памяти. Одна ячейка может стать гейтом AND с четырьмя вводами и одним выводом, другая — однобитным регистром и т.д. Загружаем в конфигурационную память последовательность битов из памяти — и в FPGA образуется заданная электронная схема, которая может быть процессором, контроллером дисплея и т.д.

ПЛИС-ы / FPGA — не процессоры, «программируя» ПЛИС (заполняя конфигурационную память ПЛИС-а) вы создаете электронную схему (хардвер), в то время как при программировании процессора (фиксированного хардвера) вы подсовываете ему цепочку написанных в память последовательных инструкций программы (софтвер).

Внизу — схема простейшего блока FPGA, в который входит look-up table (LUT) и flip-flop. Правда в этой схеме не показаны мультиплексоры, которые меняют функцию ячейки, и соединения с конфигурационной памятью.

Диаграммы, иллюстрирующие структуру FPGA:

И еще одна:

После обеда в столовой МИФИ мы начали практическую часть. Изначально, когда Imagination Technologies и Xilinx проводили такой семинар в Лос-Анжелесе, для семинара использовались слайды, приготовленные профессорами Дэвидом и Сарой Харрис из южной Калифорнии. Как это выглядело изначально, вы можете увидеть на видео:

Все 8 видео с семинара в Лос-Анжелесе

Для семинаров в России приготовленную Харрисами обвязку ядра и лабы пришлось существенно модифицировать. Модификации вы можете найти на https://github.com/MIPSfpga/mipsfpga-plus. Отличия включают:

1. Все спортировано под дешевые платы от Altera, доступные в России без экспортно-импортной тягомотины
2. Реализована загрузка программы в синтезированную систему без использования BusBlaster, просто через UART
3. Датчик освещения как периферийное устройство вместо LCD дисплея
4. Сделан переключаемый на сверхнизкую частоту тактовый сигнал, позволяющий лабы по визуализации работы любых внутренностей процессора
5. Добавлена простая лаба по визуализации промахов кэша

+ всякая мелочь и косметика — более компактный загрузчик / bootloader, возможность узких некэшируемые транзакций к памяти и т.д.

Подробнее:

1. Портирование под Altera

Прежде всего, слайды Харрисов показывали все для Xilinx, а в последнее время доставка плат с ПЛИС Xilinx в Россию стала довольно сложной бюрократически процедурой, занимающей 3-4 месяца. То же самое произошло с лицензированием софтвера для синтеза и place-and-route Xilinx Vivado, даже с бесплатными лицензиями. У некоторых российских вузов не было ни плат Xilinx, ни лицензий на Vivado; у других была только старая лицензия на предшественника Vivado — софтвера 2013 года ISE, который не поддерживал ПЛИС-ы на платах, которые я возил по России.

Короче, для проведения семинаров в России мы с комрадами еще в Калифорнии спортировали MIPSfpga на пару дешевых плат, доступных в России, от конкурента компании Xilinx — компании Altera (эта компания сейчас сливается с Intel-ом). Альтеровские платы пожертвовала для нужд семинара зеленоградская компания НПЦ «Элвис». Основной платой в МИФИ, МФТИ и СГАУ была Terasic DE0-CV на основе Altera Cyclone V:

mipsfpga_setup_on_de0_cv_for_seminars_in_russia_20151018_115610

Другой платой была Terasic DE0-Nano — очень компактная платка, пригодная для проектов типа летающих роботов, но с небольшим количеством периферии на борту:

IMG_0016

Недостаток Terasic DE0-Nano — это небольшое количество периферийных устройств на самой плате, но это одновременно и достоинство, так как DE0-Nano можно соединять как конструктор с другими платами и встраивать в разные устройства:

mips_20121012_161629

2. Загрузка через UART

Второй проблемой слайдов от Харрисов было использование отладочного адаптера Bus Blaster и софтвера для него под названием OpenOCD. В принципе BusBlaster/OpenOCD — это довольно хорошее решение в своем роде. Оно позволяет не только загружать программы в синтезированную внутри ПЛИС-а систему, но и отлаживать их дистанционно через интерфейс EJTAG, надстройку более высокого уровня над интерфейсом JTAG. При этом BusBlaster стоит всего $43, что гораздо дешевле, чем индустриальные отладочные EJTAG-адаптеры.

К сожалению, комбинация BusBlaster/OpenOCD довольно сырая, и я опасался, что она не заработает на некоей неожиданной конфигурации компьютеров в России (я был прав — это не заработало в МФТИ и СГАУ). Кроме этого, на сайте, который продает комбинацию BusBlaster/OpenOCD для MIPS, иногда платы заканчивались.

По этой и другим причинам, я стал искать другие способы загрузки софтвера в систему (в ПЛИС нужно грузить отдельно конфигурацию/хардвер и софтвер для процессора (в синтезированную систему с процессором)). Анонимный интернет-тролль Алексей долго пробовал брать меня на слабо, чтобы я имплементоровал EJTAG загрузчик через Altera USB Blaster, но так как я не специалист по EJTAG, я выбрал простое, работающее со времен советского строя решение — грузить программу через последовательный порт / UART. Правда при советском строе был порт RS-232C, а в 1990-е появились чипы от компании FTDI, которые позволили делать все через USB кабель, соединенный с PC. Разные вариации такого переходника можно купить за $5 в Москве и менее чем за $2 через интернет из Китая:

mipsfpga_setup_on_nexys4_ddr_for_seminars_in_russia_20151021_010949

Сразу замечу, что грузить программы в синтезированную SoC можно разными способами. В одном из них, более традиционном, в системе есть небольшая фиксированная программа в памяти (bootloader), которая запускается после сброса (reset) системы и грузит бОльшую программу через UART / serial port. Этот способ применил Антон Павлов из НИИСИ, которые продемонстрировал его на семинарах в МГУ и МИФИ, а также написал о нем заметку на geektimes «MIPSfpga: вне канона».

Я же сделал загрузку альтернативным способом, при котором память наполняется конечным автоматом, полностью реализованном в хардвере. Автомат принимает с PC через UART текстовый файл в формате Motorola S-Record, парсирует его (все в хардвере) и наполняет данными память, в то время как процессор находится в состоянии сброса. Потом процессор просыпается и начинает читать программу из памяти системы. Все, что нужно сделать со стороны PC — сконвертировать исполняемый ELF-файл в формат Motorola S-Record и послать его на виртуальный COM-порт командой windoiws-shell-а «type».

3. Датчик освещения как периферийное устройство вместо LCD дисплея

В исходных лабах от Харрисов в качестве примеров периферийных устройств они использовали семисегментный индикатор и LCD-дисплей с SPI. Пример с семисегментным индикатором имхо скучный — любой студент понимает, что если вы знаете как мигать одной лампочкой, то вы знаете и как мигать семью лампочками. Пример с SPI чуть лучше, особенно если идет речь о начинающих студентах, но зачем нужен второй дисплей, если уже есть семисегментный индикатор? Короче, перед поездкой в Россию я накупил 20 датчиков освещенности, тоже с интерфейсом SPI, и использовал их вместо дисплеев:

mipsfpga_setup_on_de0_cv_for_seminars_in_russia_20151018_121450

При этом интерфейс к нему очень простой — вот написанный мною интерфейсный модуль (примечание: этот код не включает все модификации системы для сопряжения его с шиной AHB-Lite, чтобы значение видел софтвер):

Screenshot 2015-11-24 23.21.15

4. Переключаемый на сверхнизкую частоту тактовый сигнал

Когда MIPSfpga появился и его начали исследовать российские преподаватели вузов, некоторые их них стали жаловаться, что пакет в его исходном виде не очень интересен для продвинутых студентов, так как лабы, подготовленные Дэвидом и Сарой Харрис, используют процессор как «черный ящик», просто подсоединяя к нему устройства. Иными словами, Харрисы полностью проигнорировали, что процессор дается в исходном коде, и следовательно с ним можно реализовать лабы, которые бы позволили вывести наружу соединения от произвольных регистров процессора (не только видимых программисту регистров, но и вообще от любых D-триггеров), подсоединить их например к светодиодам, и наблюдать, что происходит с процессором при выполнении тех или иных программ.

Как вы понимаете, чтобы сделать такие наблюдения «вживую», необходимо заставить работать процессор на очень низкой тактовой частоте, например такт в секунду. Как это сделать? Ядро MIPS microAptiv UP реализованное в ASIC на технологии 28 нм может работать с частотой выше 500 MHz, а на технологии 65 нм свыше 300 MHz. При реализации на ПЛИС-ах частоты гораздо ниже, но все равно высокие — 50-60 MHz. Частоты имеющихся на платах генераторов синхросигналов — 50-100 MHz, с возможностью повышения или понижения частоты с помощью phase-locked loop (PLL) / фазовой автоподстройки частоты (ФАПЧ).

К сожалению, с помощью PLL можно снизить частоту до ~100 KHz, но до 1 Hz частоту нужно снижать другим способом. Сначала я пробовал сделать это используя блок от Altera под названием ALTCLKCTRL, но он почему-то не работал. Затем я попробовал делить синхросигнал с помощью счетчика, но (я это уже знал) само по себе такое решение не работает, так как синтезатор не понимает, что выходной сигнал является сигналом тактовой частоты и начинает его неправильно route, в результате чего процессор не работает. Я посовещался с несколькими товарищаями и мы стали использовать альтеровское макро «global» (и его эквивалент на Xilinx BUFG).

cou3

5. Добавлена простая лаба по визуализации промахов кэша

Теперь можно делать занятные эксперименты — например сделать, чтобы во время промаха кэша мигал светодиод, после чего наблюдать в реальном времени попадания и промахи кэша при заполнении двухмерного массива. Если заполнять массив по строкам, то мигания будут разные, чем если заполнять по стобцам:

Screenshot 2015-11-24 21.39.48

Надо заметить, что не все прошло гладко:

1. GPIO в DE0-Nano отличается от GPIO в DE0-CV и платах от Xilinx. В частности, почему-то у меня не получилось объявлять весь порт GPIO одним inout-ом и потом использовать его отдельные биты либо как input, либо как output. Хотя на DE0-CV это проходит нормально. У меня не было времени разделить разные выводы GPIO между разными логическими (на Verilog) сигналами, поэтому я просто не спортировал лабу с датчиком освещения на DE0-Nano. По этой же причине я не спортировал на DE0-CV интерфейс с Bus Blaster-ом.

2. Хуже того, загрузка через UART для DE0-Nano не сработала в МИФИ, хотя жо этого работала в МГУ и у меня на ноутбуке. Причина до сих пор не 100% ясна:

2.1. Возможно, была проблема несовместимости версии Windows (7 с патчем) и USB-to-UART кабеля применяемого для DE0-Nano. Кабель был дешевым китайским клоном кабеля на основе чипсета PL2303TA, хотя я его не пробовал до семинара. Известно, что у предыдущей версии таких кабелей на основе чипсетов с PL2303HX была проблема совместимости с Windows 8 (см.). Самое гнусное, что у меня при себе был и ноубтук с версией Windows 7, и ноутбук с версией Windows 8, и разные альтернативы этому шнуру. Но я не проверил все комбинации до семинара, хотя мог бы сделать это предыдущим вечером — увы.

2.2. За два дня до семинара я внес изменения в делитель тактового сигнала. Это тоже не стоило делать.
2.3. Хорошо хоть на DE0-CV все хорошо работало.

3. В МИФИ я показывал более сложную версию примера с кэшами, чем до этого в МГУ. Это была ошибка — в сложном примере компилятор чего-то наоптимизировал, и pattern огоньков был не таким явным, как на исходном простом примере.

mipsfpga_mephi_20151028_150617

Ситуацию несколько спас приглашенный дополнительный докладчик из НИИМИ Антон Павлов, который, хотя ему и не осталось в МИФИ времени, показал некоторым присутствующим свой собственный вариант обвязки MIPSfpga под названием myMIPSfpga который он также описан в заметке «MIPSfpga: вне канона». Помимо прочего, Антон спортировал MIPSfpga на российскую плату Марсоход 3, которую я, как человек замученный экспортом-импортом (Сцилла: американский экспортный контроль + Харибда: российская таможня), собираюсь попробовать использовать для следущих образовательных мероприятий в России:

2015-11-24 22.41.39

Во время перерыва и после семинара Максим Горбунов показал мне разные мифишные достопримечательности, в которые входят три панно в духе эпохи Туманности Андромеды и Молекулярного Кафе из красно-белого многотомника родом из 1960-х:

mipsfpga_mephi_20151028_125500

mipsfpga_mephi_20151028_125745

mipsfpga_mephi_20151028_125840

Зашел я и в мифишную церковь, вокруг которой было столько криков в интернете года три назад, из-за которой из МИФИ даже увольнялись в знак протеста сотрудники. Как человек нейтральный, т.е. истинно неверующий, а не воинствующий сторонник той или иной стороны конфликта, я должен сказать, что 1) мифишная церковь довольно скромная и не пошлая, по духу похожа на православный собор в Сан-Франциско; 2) МИФИ — не первый российский вуз с религией, курс православия появился еще в МФТИ аж в 1988 году (на него тогда сбежался весь физтех, студенты слушали первую лекцию стоя, но месяца через три осталось не более дюжины слушателей); 3) церкви есть и во многих американских вузах.

mipsfpga_mephi_20151028_125955

После МИФИ я вместе с Максимом Горбуновым отправился в отель Ренессанс (в который я поселился так как слышал, что в нем останавливался Билл Клинтон, хотя наверное без Моники Левинской). Потом я поехал на вокзал, чтобы на вечернем «Сапсане» уехать в Питер, и узнал, что я сделал еще один косяк: взял билеты не на 19.30 (7.30pm), а на 7.30 (7.30am). Тогда я купил билеты на ночной Экспресс и пошел коротать время в один из вокзальных ресторанов.

В ресторан зашли еще трое моих приятелей + прямо в ресторане я случайно встретил одного товарища из ИТМиВТ, которого до этого встречал в Пало-Альто.

Мы очень мило сидели, медленно закусывая и игриво разговаривая с официанткой, юной студенткой в больших очках, которая, как оказалось, изучает политологию в университете. Когда я это узнал, я тут же похвастался ей личным знакомством в реале с Альбац и Макфолом, а также обвинил ее ресторан в русофобии из-за отсутствия русских блинов. После этого мой приятель по физматшколе, недавно получивший российское гражданство бывший украинец, попросил у девушки телефончик, и она телефончик дала. Но не ему, а мне. Впрочем я им все равно не воспользовался, посколько после ужина уехал в Питер — делать презентации на Microchip Masters Russia и в ИТМО.

Продолжение следует.

Опрос:

Как вы думаете, какие темы следует развить в продолжениях этого поста?

Арифметические цифровые блоки
Асинхронная логика
Проектирование цифровой логики на уровне регистровых передач на языке описания аппаратуры Verilog
Проектирование цифровой логики на уровне регистровых передач на языке описания аппаратуры VHDL
Методы верификации цифровых схем — SystemVerilog, UVM, Specman e и т.д.
Микроархитектура (структура конвейера, организация блоков) микропроцессорных ядер
Добавления инструкций в ядра, интерфейсы для расширения процессоров
Многоядерные системы (с когерентностью или без)
Архитектура и использование ПЛИС / FPGA, с уклоном в Xilinx
Архитектура и использование ПЛИС / FPGA, с уклоном в Altera
Архитектура / ассемблер, низкоуровнеаое программирование
Периферийные устройства микроконтроллеров и встраиваемых процессоров
Применения микроконтроллеров и встраиваемых процессоров
Университетская культура
Образовательные программы Imagination Technologies, Microchip Technology, Digilent / National Instruments и других
Другое (пояснить в комментариях)