Как стать автором
Обновить

Ни дня без строчки верилога — учим язык решением большого количества простых задач

Время на прочтение7 мин
Количество просмотров13K

30 октября прошло первое занятие Сколковской Школы Синтеза Цифровых Схем. Из-за Ковида его пришлось провести в онлайн-формате. Трансляция первого занятия:

Возможно онлайн-формат - это и к лучшему, так как в офлайне в Технопарке Сколково есть только 25 посадочных мест, и мы приготовили только 25 FPGA плат, а количество заявок привысило 300. Теперь мы на спонсорские деньги от компании Ядро Микропроцессоры и Максима Маслова @Armmaster заказали еще 100 плат и собираемся их раздать бесплатно для занятий дома, преподавателям вузов и руководителям кружков в других городах.

Чтобы быть уверенным, что получатели плат смогут их использовать, мы поставили в качестве пререквизита их получения прохождение короткого онлайн-курса от Роснано (см. детали в хабрапосте Готовимся к Сколковской Школе Синтеза Цифровых Схем: литература, FPGA платы и сенсоры). 40 с чем-то участников школы прошли этот курс и им будут высланы платы, как только заказанные платы прибудут из Китая.

При этом, так как школа уже началась, а до следующего занятия 13 ноября еще есть время, мы решили попробовать другой пререквизит - решение последовательности коротких задач на верилоге, используя не плату, а бесплатный симулятор Icarus Verilog. Всем участникам, которые собираются дойти в курсе до проектирования процессоров, все равно нужно будет освоить механику кодирования на верилоге, а для этого симулятор просто быстрее, чем учить это на FPGA платах.

Учить верилог в симуляторе Icarus так же просто, как учить программирование на питоне, за исключением того, что у верилога есть синтезируемое подмножество. То есть не все что вы можете сделать в симуляторе вы можете превратить в схему на фабрике или в прошивку в ПЛИС. Кроме этого в верилоге, в отличие от питона, есть физический тайминг, задержки в пикосекундах и максимальная тактовая частота, которые выясняются во время синтеза, то бишь одной симуляцией для обучения не обойтись. Тем не менее, упражнения на симуляторе - это оптимальный способ набить руку на многих вещах.

Идея та же, что научиться игре в шахматы или игре Го с помощью решения большого количества задач в несколько ходов. В качестве справочника для решения верилоговских задач можно использовать учебник Харрис & Харрис (планшетная версия, краткие слайды для лекций), лабник Цифровой Синтез и книгу Дональда Томаса (PDF начала к ней).

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

ChipEXPO 2021 Digital Design School package v2.3
Ссылка через bit.ly - https://bit.ly/chipexpo2021dds23
Прямая ссылка

Если вы хотите не скачивать готовый пакет, а клонировать его из GitHub с некоторой настройкой, см. в конце поста инструкцию Приложение. Как клонировать пакет упражнений из GitHub и наcтроить его после этого.

Упражнения находятся в директории ce2020labs/quizes/problems_001_011. Это 11 файлов на верилоге. В каждом из них вначале пример модуля, потом незаконченный модуль, который вам нужно изменить (с комментарием TODO), а потом тест (модуль testbench). Как работает тест, вам понимать необязательно, про тесты объяснит Александр Силантьев из МИЭТ и Илья Кудрявцев из Самарского Университета на следующем занятии. Пока все что вам нужно сделать - это:

  1. Установить Icarus Verilog по инструкциям ниже. Для него есть версии для Линукса, Windows и MacOS.

  2. Прочитать модуль в начале файла.

  3. Проконсультироваться со слайдами Александра Силантьева с первого занятия, а также возможно с книгами Харрис & Харрис, лабником Цифровой Синтез и книжкой Дональда Томаса, что все это значит.

  4. Прочитать задание под комментарием TODO. Задание я написал на английском, если вы учили в школе другой язык, спросите на телеграм-канале DigitalDesignSchool объяснение задания.

  5. Написать код из нескольких строчек под заданием.

  6. Под Линуксом или MacOS: запустить скрипт run_all_using_iverilog_under_linux_or_macos_brew.sh . Его можно запустить из командной строки в терминале (на Apple тоже есть приложение Terminal если вы не знали) или просто кликнуть на него из менеджера файлов.

  7. Под Windows: запустить пакетный файл run_all_using_iverilog_under_windows.bat . Его можно запустить из командной строки в терминале (на Apple тоже есть приложение Terminal если вы не знали) или просто кликнуть на него из менеджера файлов.

  8. Скрипт или пакетный файл создаст файл log.txt с результатами компиляции и симуляции всех 11 файлов. Если что-то не скомпилировалось, там будет сообщение об ошибке syntax error. Если тест не прошел, там будет сообщение FAIL и информация об ожидаемом значении.

  9. Когда все тесты пройдут, зазипуйте все что вы написали в один файл и пришлите в емейле мне ( yuri@panchul.com с копией yuri.panchul@gmail.com ), с копией Александру Силантьеву в МИЭТ ( olmer.aod@gmail.com ), Илье Кудрявцеву в Самарский Университет ( rtf@ssau.ru ) и Сергею Иванцу ( sergey.ivanets@gmail.com ) в Черниговский НПУ.

  10. Если что-то непонятно, задавайте вопросы в телеграм-канал.

Задачи можно решать с любым симулятором верилога, который поддерживает SystemVerilog. А также c бесплатным симулятором Icarus Verilog, который хотя и не поддерживает весь SystemVerilog, но поддерживает Verilog 2005 с некоторыми элементами SystemVerilog, достаточных для решения наших задач.

.

Icarus Verilog чаcто используют с GTKWave, программой для работы с временными диаграммами. Для первых десяти задач GTKWave нам не понадобится, но его стоит установить вместе с Icarus Verilog на будущее.

Под Linux Icarus Verilog и GTKWave ставится "sudo apt-get install verilog gtkwave".

Версия Icarus Verilog и GTKWave для Windows здесь. !!! Важно !!! Нужно брать свежую версию iverilog-v11-20210204-x64_setup.exe [44.1MB] в которой есть поддержка некоторых конструкций SystemVerilog которые мы используем в примерах.

Icarus можно поставить даже на Apple Mac, что необычно для EDA tools (EDA - Electronic Design Automation). Это можно сделать в консоли с помощью программы brew: brew install icarus-verilog.

Видео установки Icarus Verilog для Windows

Примечание: если видео рекомендует старую версию, нужно скачивать новую (см. выше).

Видео установки Icarus Verilog для MacOS

Примечание: если видео рекомендует старую версию, нужно скачивать новую (см. выше).

Теперь про первые 11 задачек. Общая тема - мультиплексор - блок выбора. Если селектор стоит в 0, на выход идет значение из входа d0, иначе - значение из входа d1. Но даже такую незамысловатую функциональность в верилоге можно выразить минимум пятью способами:

  • Через операцию "?" и непрерывное присваивание (continuous assignment) - s001_mux_question.v

  • Через оператор "if" и блокирующее присваивание внутри комбинационного always-блока - s002_mux_if.v

  • Через оператор "case" и блокирующее присваивание внутри комбинационного always-блокаs - 003_mux_case.v

  • Через индекс двумерного массива типа logic - s004_mux_index.v

  • И даже просто через логические операции и/или/не, вместе с операцией размножения последовательности битов { n { m } } - что значит "построй последовательность состоящую из n копий последовательности m - s005_mux_gates.v

Можно строить большие мультиплексоры с многими входами из мультиплексоров с небольшим количеством входов. Этому посвящено упражнение s006_mux_2n_using_muxes_n.v, которое также вводит иерархию экземпляров модулей:

Также можно строить мультиплексоры для широких данных из мультиплексоров для узких данных - про это упражнение s007_mux_using_narrow_data_muxes.v.

Выше мы строили мультиплексоры из логических элементов И, ИЛИ, НЕ. А можно ли строить логические элементы И, ИЛИ, НЕ из мультиплексоров? Это посвящены четыре задачки, в которых нужно построить модули, реализующие комбинационную логику И, ИЛИ, НЕ и ИСКЛЮЧАЮЩЕЕ-ИЛИ (xor) только из мультиплексоров, констант 0 и 1, а также соединений между ними:

  • s008_not_gate_using_mux.v

  • s009_and_gate_using_mux.v

  • s010_or_gate_using_mux.v

  • s011_xor_gate_using_mux.v

Я не обещаю, что мы дойдем до задачи номер 999 (наверное это будет алгоритм Томасуло, который показывает девушка Ирина на рисунке 7.71 на фотографии ниже, и про который любят спрашивать недавних студентов на собеседованиях в электронные компании) но мы будем работать в этом направлении. Загружаем, приступаем и ждем вас на занятии 13 ноября, которое по-видимому начнется с разбора этих задачек.

Приложение. Как клонировать пакет упражнений из GitHub и наcтроить его после этого

Вместо использования готового пакета упражнений (и для симуляции, и для синтеза) вы можете клонировать его код из двух репозиторий GitHub-а:

https://github.com/DigitalDesignSchool/ce2020labs
https://github.com/zhelnio/schoolRISCV

После клонирования вам нужно запустить башевский скрипт ce2020labs/scripts/create_run_directories.bash, находясь при этом в директории ce2020labs/scripts. Этот скрипт создает временные директории run с копиями скриптов для синтеза и симуляции в каждой поддиректории, в которой есть файл top.v. В директориях run потом скапливаются все временные файлы, которые создает Intel FPGA Quartus и другие программы. Сами run директории игнорируются в .gitinfo чтобы случайно не занести временные файлы в github.

Под Линуксом и MacOS скрипт запускается прямолинейно:

cd ce2020labs/scripts
./create_run_directories.bash

Под Windows это тоже будет работать, так как если вы установили Git для Windows то у него внутри есть встроенный интерпретатор bash в директории "C:\Program Files\Git\usr\bin", а также другие нужные для скрипта утилиты: sed и линуксный вариант find. Вам нужно будет точно так же пойти в директорию скрипта и запустить его, используя bash:

cd ce2020labs\scripts
bash create_run_directories.bash

Если у вас под Windows что-то не работает, проверьте, какие директории стоят у вас в path. Вот что стоит у меня:

  • C:\Program Files (x86)\Common Files\Oracle\Java\javapath
    Java понадобиться на занятии про архитектуру RISC-V, так как ее использует симулятор RARS

  • C:\Program Files\Git\cmd
    C:\Program Files\Git\mingw64\bin
    C:\Program Files\Git\usr\bin

  • C:\intelFPGA_lite\20.1\quartus\bin64
    C:\intelFPGA_lite\20.1\modelsim_ase\win32aloem
    ModelSim внутри пакета intelFPGA - это симулятор Verilog, мощнее и быстрее чем Icarus. Однако версия ModelSim в последнем бесплатном пакете intelFPGA не поддерживает черты SystemVerilog, которые мы используем в задачах, например тип logic.

  • C:\Program Files (x86)\GnuWin32\bin
    Здесь установлены GNU утилита make.exe, которая нужна для занятий про микроархитектуру RISC-V, а также линуксная версия zip.exe для формирования пакета скриптом create_ce2020labs_zip.bash

  • C:\iverilog\bin
    C:\iverilog\gtkwave\bin

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Как вы относитесь к идее учить язык через решение тысячи задач с повышением сложности?
53.23% Идеальный формат для меня. Учебники читать мне лень, а на лекциях я засыпаю.33
35.48% Как вспомогательный формат пойдет, чтобы набить руку. Мне нужна плата, чтобы делать свой проект.22
11.29% Нет уж, я не буду писать код бесплатно. Поставьте меня сразу делать чип для айфона, пусть из-за каждого бага делают перевыпуск на фабрике за $20 миллионов.7
Проголосовали 62 пользователя. Воздержались 6 пользователей.
Теги:
Хабы:
Всего голосов 19: ↑17 и ↓2+15
Комментарии5

Публикации

Истории

Ближайшие события

Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург