Настольная библиотека HDL-дизайнера и верификатора
Небольшой обзор литературы, которая может пригодиться начинающему разработчику микроэлектроники и поможет понять, что к чему и как разработать современную микросхему.
Привет, Хабр!
Меня зовут Максим Ратников, я руковожу отделом системной верификации в компании Аквариус. Моя основная задача — убедиться, что все части микросхемы правильно собраны вместе и действительно функционируют так, как должны. Попутно работаю с теми стажерами в нашей компании, которые интересуются разработкой микросхем. Также преподаю в МАИ и рассказываю студентам про маршрут проектирования, элементы и узлы вычислительных машин.
В процессе работы со студентами и стажерами одним из первых появляется вопрос «А что посоветуете почитать?». Тема большая, интересная и бесконечная, так как сколько людей, столько и мнений. Но со временем у нас с коллегами выработался примерно такой список.
Когда где-либо заходит разговор про учебники по вычислительной технике и современным компьютерам и то, как это все работает, первое что вам скажут, скорее всего, будет классика как она есть — Эндрю Таненбаум «Архитектура ЭВМ». Версия чем свежее, тем лучше. Здоровенный том на 1000+ страниц, местами очень и очень непростой, но позволяет понять, как работает компьютер в целом.
Если «Архитектуры» показалось мало, то у Таненбаума есть еще «Сети ЭВМ» и «Операционные системы».
Классика — классикой, но начинать обучение с Таненбаума могут только очень крепкие духом и знаниями. Лучше начать с чего-то более понятного и приземленного. И для этого подойдет книга: Харрис, Харрис: »Цифровая схемотехника и архитектура компьютера».
Книга эта есть, в том числе в бесплатном доступе. Она переведена на русский специалистами-энтузиастами и известна на Хабре: https://habr.com/ru/articles/306982/. Хорошая книга, рассказ от простого к сложному, с примерами, задачами. В процессе авторы коснулись почти всего — и схемотехники, и архитектуры, и вопросов поведения схем в динамике, и языков описания аппаратуры. Старое издание содержало раздел про процессоры MIPS, новое, в духе времени, — про RISC-V. Наверное, можно рекомендовать всем, кто решил узнать, как сделать микросхему в наше время.
Дальше по направлениям.
Схемотехника.
О том, из чего все состоит, более подробно. В качестве основы я бы посоветовал не менее классические: Вэйкерли «Проектирование цифровых устройств» и Угрюмов «Цифровая схемотехника». Уместны будут и книги по разработке для ПЛИС, например Максфилд Клайв: »Проектирование на ПЛИС. Архитектура, средства и методы. Курс молодого бойца». По ПЛИС книги появляются более-менее регулярно, можно выбрать то, что подойдет лично вам.
Языки описания аппаратуры.
Если кто не знал или забыл, то разработка полноценного цифрового устройства в виде схемы сейчас почти не практикуется. Вместо этого на специальном языке (язык описания аппаратуры или hardware description language — HDL) разрабатывается функциональное описание микросхемы, которое потом с помощью программы-синтезатора превращается в логические элементы и провода между ними. Языков описания аппаратуры не очень много, и самый распространенный сейчас — SystemVerilog (или кратко SV). На русском книг по нему не так, чтобы много, но кое-что все же есть. Я обычно рекомендую Дональд Томас: «Логическое проектирование и верификация систем на SystemVerilog». Хороший вариант для начала — довольно много по теме, нормальное изложение, да еще и на русском. Но не без недостатков, конечно: многое осталось за скобками, поэтому нужны дополнения. Например: Stuart Sutherland: «SystemVerilog For Design». Хорошая книга, в ней доступным языком рассказывается, как написать на SV что-то реально работающее.
Мало написать, надо еще и протестировать то, что мы написали. В случае с разработкой аппаратуры история с тестированием — это неисчерпаемая тема (пропущенные ошибки ОЧЕНЬ дорого стоят). Тут можно посоветовать Chris Spear: »SystemVerilog for Verification». Это общее описание того, как написать код для тестирования. Но на этом разговор только начинается. Следующие шаги, без которых будет трудно, это SVA и UVM.
SVA или SystemVerilog assertions — специальный язык (в составе SV) для описания утверждений. С их помощью очень удобно проверять обмен между устройствами и соблюдение протоколов. Кое-что есть почти во всех книгах и учебниках по SV, но желательно понять, как использовать этот мощный инструмент правильно и эффективно. Почитать можно, например: Srikanth Vijayaraghavan: »A Practical Guide for System Verilog Assertions» и »SystemVerilog Assertions Handbook».
UVM, или Universal Verification Methodology — методология верификации и, одновременно, самая распространенная библиотека для верификации. Она довольно большая, объектно-ориентированная (да, SystemVerilog — это ООП язык, и без знания ООП еще можно разработать само устройство, но создать качественную систему верификации для него практически невозможно). Про нее написано довольно много, есть документы самого разного качества — каждый найдет, что почитать, себе по вкусу. Но кое-что посоветую.
Небольшой вебинар по работе с UVM: https://www.youtube.com/watch? v=WhdQJjqx9cU и методичка https://fpga-systems.ru/articles/132/uvmgiaootm.pdf от сообщества FPGA-SYSTEMS (сайт https://fpga-systems.ru тоже в списке рекомендаций для всех интересующихся). Хороший портал по UVM: http://testbench.in/ .
Практическое пособие по UVM: Sharon Rosenberg »A Practical Guide to Adopting the Universal Verification Methodology» и Vanessa R. Cooper »Getting Started with UVM. A beginner’s guide». Плюс, конечно, «рецепты от шеф-повара», т.е. от сообщества UVM:»UVM_Class_Reference_Manual_1.2.pdf» (https://accellera.org/images/downloads/standards/uvm/UVM_Class_Reference_Manual_1.2.pdf) .
В качестве настольной книги (или файла под рукой) всегда полезно иметь стандарты:
IEEE_1800–2017_SystemVerilog
IEEE_18002–2017_UVM
Дополнительно можно посоветовать следующие книги (про верификацию в целом):
1. Hamilton B. Carter & Shankar Hemmady: Metric-Driven Design Verification
2. Ashok B. Mehta: ASIC/SoC Functional Design Verication
3. PeetJames: VERIFICATION PLANS The Five-Day Verification Strategy for Modern Hardware Verijication Languages
4. William K. Lam & Sun Microsystems: Hardware Design Verification: Simulation and Formal Method-Based Approaches
5. Alan Wiemann: Standardized Functional Verification
6. Andreas Meyer: Principles of Functional Verification
7. Ray Salemi: Python for RTL verification — интересна особенным подходом к верификации с использованием языка Python.
Есть еще одно интересное направление, с которым приходится иметь дело, — SystemC. Фактически это библиотека для С++, с помощью которой можно разрабатывать функциональные описания микросхем и тестировать их. Из плюсов — скорость работы. Из минусов — С++ «как он есть». Если вы хорошо знаете «Плюсы» и плохо SV, возможно, это ваш выбор. Или вдруг вам нужно написать очень быстрый код — тоже сюда. Почитать можно, например David C. Black and Jack Donovan »SYSTEMC: FROM THE GROUND UP» .
И еще одно сравнительное новое направление — Chisel. Высокоуровневый язык (или библиотека) на базе Scala для разработки и верификации микросхем. Почитать можно, например, Martin Schoeberl: »Digital Design with Chisel» (https://github.com/schoeberl/chisel-book), и, конечно, учебник по Scala, без которого тут не разобраться: Одерски, Спун, Веннерс, Соммерс: »Scala. Профессиональное программирование. 5-е изд».
Бэкенд
После того, как мы что-то разработали и протестировали, это хорошо бы превратить в микросхему. Данный процесс называется физическим дизайном, или бэкендом (фронтенд это, соответственно, HDL). Хорошая книга про физический дизайн:»Khosrow Golshan: PHYSICAL DESIGN ESSENTIALS An ASIC Design Implementation Perspective». Еще одна интересная книга о бэкенде и процессе синтеза — «Романов А. Ю. , Панчул Ю. В.: Цифровой синтез. Практический курс».
Программирование
Микросхему мало сделать, ее надо заставить работать. И для этого, как минимум, надо знать основы программирования. Нужен Си и Ассемблер (какой именно Ассемблер, зависит от того, какой процессор мы будем использовать внутри микросхемы, если он там есть, конечно). По Ассемблеру, наверное, лучше всего читать Programmes’s Guide по той архитектуре, на основе которой разработан процессор. Что до Си, тут неоригинально: Брайан Керниган и Деннис Ричи: »Язык программирования Си» и Герберт Шильд: »C: полное руководство, классическое издание», но все на вкус и цвет, благо учебников по Си море.
Еще очень полезно ознакомиться с особенностями работы встраиваемых систем, как минимум чтобы понять процесс начальной загрузки микросхемы. Тема тоже очень большая и тут каждый может найти что-то по вкусу. В качестве точки отсчета: Тарасов Алексей: »Си для встраиваемых систем»,»Practical Aspects in U-Boot Programming»,»Making Embedded Systems».
Раз мы начали говорить о программировании и уже упомянули ООП, то хорошо бы хотя бы по верхам ознакомиться одной из этих книг: Джонсон Ральф, Гамма Эрих: »Паттерны объектно-ориентированного проектирования» (также известная как паттерны проектирования банды четырех) или »Андрей Александреску: Современное проектирование на С++. Обобщенное программирование и прикладные шаблоны проектирования». Эти книги помогут вам не потеряться в больших и развесистых системах верификации: там активно используются многие шаблоны, а Singletone и Фабрика так вообще постоянно.
Интерфейсы.
Еще могут оказаться полезными книги по интерфейсам обмена между устройствами:
Михаил Гук. «Аппаратные интерфейсы ПК. Энциклопедия»
Михаил Гук. «Интерфейсы ПК. Справочник»
Михаил Гук. «Интерфейсы устройств хранения. ATA, SCSI и другие. Энциклопедия»
Михаил Гук. «Шины PCI, USB и FireWire. Энциклопедия»
Последнее в списке, но не по значению — книги по организации процесса разработки. Как минимум, надо знать, что такое системы управления версиями. Тут информации море, но за точку отсчета давайте возьмем еще одну классику Скотт Шакон: »Pro Git».
Конечно, на этом список хороших и полезных книг и сайтов не заканчивается. Есть еще очень много интересного и полезного. Но эти книги могут стать хорошей основой для дальнейшего изучения такого интересного и многопланового процесса, как разработка современной микросхемы.