Junior FPGA Design Engineer: як стати?

Всім привіт!

Іноді початківці розробники не дуже добре уявляють, яку літературу треба читати для серйозного вивчення тієї чи іншої мови.

Розробка під FPGA — це не просто якась мова. Це дуже об'ємна область, з величезною кількістю підводних каменів і нюансів.

У цій статті ви знайдете:
  • список тем, які повинен освоїти початківець розробник під FPGA
  • рекомендовану літературу по кожній з тем
  • набір тестових питань та лабораторних робіт
  • класичні помилки новачків (та поради щодо виправлення)
Ласкаво просимо під кат!

Що треба знати і вміти

Цифрова схемотехніка

Необхідно:
  • знати базові цифрові вузли (логічні елементи ТА/АБО/НЕ, шифратори, мультиплексори, суммматоры та ін)
Література:
  • David Harris, Sarah Harris. «Digital Design and Computer Architecture» — дуже велика книга, що розповідає від азовов до верхів. Є версія російською мовою. Я переглянув російську версію: читається дуже швидко і легко.
  • Угрюмов Е. П. «Цифрова схемотехніка» — класичний радянський підручник, з усіма витікаючими наслідками (деякі теми пояснені занадто складно, і не можна відразу зрозуміти, чи потрібна тобі ця інформація зараз чи її можна пропустити). Я читав більш старе видання, можливо у виданні від 2010 року все змінилося в кращу сторону, не дивився.
Тестові питання:
  1. цифрова схемотехніка відрізняється від аналогової?
  2. Які є базові цифрові вузли? У яких з них вихід залежить тільки від входу?
  3. Що таке мультиплексор? Намалюйте схему мультиплексора 4 в 1 з примітивних елементів І/АБО/НЕ.
  4. Побудуйте таблицю істинності для виразу: x = a OR ( b AND c ) or d.

Синтаксис HDL-мови

Сюди входить:
  • знання синтезуються конструкцій (синтаксису) HDL-мови
  • знання, як описувати базові цифрові вузли за допомогою HDL-мови
  • розуміння у що (з боку базових цифрових вузлів) перетворюється той чи інший шматок HDL-коду
  • вміння писати на HDL-мовою для отримання потрібного поведінки
Як HDL-мови я рекомендую спочатку вивчити самі базові конструкції Verilog'a, а потім переключиться на SystemVerilog.

Література:
  • Pong P. Chu. «FPGA prototyping by Verilog examples» — розписується Verilog, починаючи з азів. Докладно розбирається синтаксис і є величезна кількість прикладів, як простих (лічильники), так і рівнем вище (UART та VGA).
  • Йосип Каршенбойм. «Короткий курс HDL» — класичний курс російською мовою.
  • www.asic-world.com — сайт з купою прикладів як з Verilog, так і за SystemVerilog.
  • David Harris, Sarah Harris. «Digital Design and Computer Architecture» (див. вище)
  • Stuart Sutherland. «SystemVerilog for Design» — книга про відмінності Verilog і SystemVerilog. Для читання необхідні базові знання Verilog'a. Рекомендується до прочитання для розуміння, які зручності були внесені в новому стандарті.
Тестові питання:
  1. Чим блокують присвоювання відрізняється від неблокірующіх? Коли варто застосовувати одне, коли інше?
  2. чи Є різниця між наступними трьома описами? Якщо так, то в чому вона проявляється?
    // 1 code:
    assign a = b + c;
    
    // code 2:
    завжди @( b or c )
    begin
    a = b + c;
    end
    
    // code 3:
    завжди @( * )
    begin
    a = b + c;
    end 
    


Тестові завдання:
1. Намалюйте схему з базових цифрових вузлів для наступного коду:
Прихований текст
test module(
input clk_i,

input a_i,
input [2:0] b_i,

output reg x_o

);

reg [7:0] cnt = 8'd0;
reg [7:0] cnt2;

wire c;
reg d;

завжди @( posedge clk_i )
cnt <= cnt + 1'd1;

завжди @(*)
begin
cnt2 = cnt + 1'd1;
end

assign c = ( cnt < 8'd5 ) && ( a_i == 1'b0 );

завжди @( posedge clk_i )
begin
d <= c;
x_o <= c ? ( d ) : ( cnt2[ b_i ] ); 
end

endmodule


2. Намалюйте поведінка схеми з п. 1 (тобто стану всіх «змінних») при наступних вхідних впливах:


Прихований текстВремянки намальовані за допомогою онлайн-редактора WaveDrom.


3. Напишіть модуль для керування світлофором, який буде запалювати червоний, жовтий та зелений ліхтарі у всім відомій послідовності: червоний, червоний і жовтий, зелений, зелений моргає, жовтий, червоний. Параметри, що задають час горіння ліхтарів світлофора і період миготіння зеленого ліхтаря є параметрами модуля. Час задається в кількості тактів синхросигналу clk_i.

Інтерфейс модуля:
Прихований текст
module traffic_light(
// синхроімпульсів
input clk_i,

// асинхронний скидання
input rst_i,

// Якщо 1, то горить відповідний колір, якщо 0 — то він не горить
output red_o,
output yellow_o,
output green_o
);


Симулирование і верифікація HDL-коду

Необхідно:
  • знати несинтезируемые конструкції Verilog'a і SystemVerilog'a
  • вміти написати простий тестбенч, запустити його в симуляторі (наприклад, ModelSim)
  • розуміти, як повинен бути влаштований «ідеальний» тестбенч
Література:
  • testbench.in — величезна кількість прикладів верифікації з використанням Verilog'a і SystemVerilog'a.
  • Chris Spear. «SystemVerilog for Verification» — гарна, велика книга про верифікації за допомогою SystemVerilog. Читається легко, можна знайти відповіді на багато питань.
Відеоуроки:
Тестові питання:
  1. function відрізняється від task?
  2. Уявімо, що Ви написали максимально просту HDL-модель 5-стадійного RISC-процесора. Як будете її верифікувати? (Питання підвищеної складності).
  3. Чим різниться queue mailbox (типи даних у мові SystemVerilog)?
  4. Чим відрізняється функціональна симуляція від тимчасової? Коли яку необхідно використовувати?


FPGA

Необхідно:
  • знати з яких основних елементів складається FPGA
  • розуміти як відбувається workflow розробки під FPGA
  • інтуїтивно уявляти які операції для FPGA дешеві, а які дорогі (по частоті і ресурсів)
Я працюю з чіпами Altera, тому тут і далі назва сімейств і утиліт буде від цього вендора. Якщо ви знаєте аналогічну літературу для Xilinx — напишіть в лічку або в коментарях — я обов'язково додам її в статтю.

Література:
Відеоуроки:
Тестові питання:
  1. Чим відрізняється FPGA від ASIC? З яких блоків складається (чи може складатися) FPGA?
  2. Спробуйте окреслити коло завдань, для яких добре (економічно доцільне) використовувати FPGA, а для яких MCU і CPU?
  3. Які апаратні блоки ви знаєте? Для чого вони використовуються? (Під апаратними блоками тут мається на увазі Hard IP).
  4. В сімействі Y використовується LUT з трьома входами і одним виходом. Яку мінімальну кількість LUT'ів треба для обчислення assign eq = ( a == b );, якщо a та b це 32-бітні цілі позитивні числа? А якщо у LUT'a буде чотири (п'ять, шість) входів?
  5. Необхідно створити одну-портову пам'ять з 16 слів. Кожне слово шириною 100 біт. Скільки блоків M9K (9216 біт) буде включена? Вважаємо, що робимо проект під Cyclone III. (*)
У питаннях, позначених (*) , зрозуміло, не треба пам'ятати все напам'ять, а можна користуватися даташитами.

Синхронний дизайн і все, що пов'язано з таймінгами

Необхідно:
  • знати принцип синхронного дизайну
  • знати до яких негативних наслідків можуть призвести ті чи інші схеми
  • мати поняття про констрейнах
Література:
Тестові питання:
  1. Що таке констрейны? Де вони описуються і для чого потрібні (для чого вони використовуються? Що буде, якщо їх не описати?
  2. Що таке clock domain crossing? Як і коли треба?
  3. У чому різниця між синхронним і асинхронним скиданням? Що буде якщо на вхід синхронного скидання завести асинхронний скидання?
  4. Що таке latch (засувка, латч)? Які наслідки використання латча? Наведіть приклад коду, який створює латч.
  5. Що таке комбінаційна петля? Які наслідки використання комбінаційної петлі?
  6. Що таке метастабильность? Як її досягти? Які у неї є плюси і мінуси?
  7. Що таке glitch (глитч)? Чи потрібно з цим боротися? І якщо так, то де і як?
  8. Що таке setup time/hold time у D-тригера?


САПР

Необхідно:
  • вміти створювати проект
  • вміти описувати I/O піни і констрейны
  • вміти користуватися інструментом для налагодження на залозі
  • вміти користуватися інструментом для аналізу таймінгів
Література:
Відеоуроки:


Лекції і лабораторні
Я два семестри читав курс «Розробка під FPGA» для студентів старших курсів університетів Санкт-Петербурга. В курс входили як лекції, так і набір лабораторних робіт. Лекції ґрунтувалися на літературу, що була перерахована вище.

План курсу:
Прихований текст
Введення:
* Що таке ПЛІС? Області застосування.
* Огляд САПР ( Quartus ).

Вивчення мови Verilog:
* Отличительне риси мов опису апаратури ( HDL ).
* Синтезуються/несинтезируемые конструкції мови. 

* Вивчення синтезованих конструкцій мови:
* Типи даних і способи їх подання.
* Операції, що блокують/неблокирующие операції присвоювання
* Керуючі конструкції.
* Блоки опису вузлів комбінаційного типу.
* Блоки опису вузлів послідовного типу.
* Структурний/поведінковий опис проекту.
* Параметризація.
* Реалізація на Verilog базових цифрових вузлів.

* Вивчення несинтезируемых конструкцій мови ( +SystemVerilog ):
* Застосування несинтезируемых конструкцій мови. Верифікація. Testbench.
Основні принципи створення testbench.
* Основні функціональні блоки testbench'їй. 
* Типи даних. Блоки процедурного типу.
* Структури даних для верифікації ( масиви, черги тощо ).
* Функції та завдання.
* Тимчасова модель симуляції.
* Використання базових принципів ООП для верифікації.
* SystemVerilog Assertions.
* Створення testbench для базових цифрових вузлів.
* Огляд існуючих методологій ( бібліотек ) верифікації.



Назви лекцій (в 2015 році):
  1. Введення в FPGA.
  2. Внутрішнє пристрій FPGA.
  3. Введення в Verilog/SystemVerilog. Приклади опису різних типів логіки.
  4. Синхронний дизайн. Створення простих тестбенчей.
  5. Опис FSM, масивів і структур у SystemVerilog. Пам'ять: створення за допомогою Verilog і MegaWizard.
  6. Як працює DCFIFO. Static Timing Analysis. TimeQuest, constraints.
  7. Верифікація: coverage, assertions, SystemVerilog interfaces
  8. Інтерфейси сімейства Avalon. IP-Cores. Qsys.
  9. Верифікація: SystemVerilog OOP, constrained-random tests.


Слайди до лекцій
Прихований текстНа жаль, це саме СЛАЙДИ, які мені допомагали розповідати лекції (не вся інформація курсу міститься на слайдах, деякі я використовував як опору, а матеріал давався на дошці).

Іноді помітні картинки, які ніяк не пов'язані з сусідніми (наприклад, завдання для тестів, які давалися на лекціях).

Лабораторні роботи:
Класичні помилки
У цій частині статті я розповім про типові помилки, які допускають початківці розробники, і дам поради щодо їх усунення.

Проблема в таймінгах

Симптоми:
  • результати симуляції не збігаються з тим, що відбувається на залозі
  • залізо працює нестабільно: іноді явно видно перешкоди (наприклад, на VGA)
  • «я додав сигналтап, і після цього схема перестала коректно працювати, я прибрав сигналтап і все добре»
Лікування:
  • прописати всі необхідні констрейны, (як мінімум використовується тактову частоту (або частоти)*.sdc файлі), підключити цей файл проекту
  • перекомпілювати проект. Зайти в TimeQuest і подивитися, чи є негативні слаки, і якщо є, то далі розбиратися чому це відбувається (можливо, досить покрутити налаштування в Quartus'e, або доведеться переписувати шматки код).
Якщо ви бачите дивацтва в SignalTap, то перевірте, синхронні ті сигнали, які ви знімаєте з частотою «стробування».

Не дотримання принципів синхронного дизайну (асинхронщина)

Продовження першого пункту, але я вирішив його виділити окремо.

Симптоми аналогічні з попереднім пунктом.

Чомусь багато хто любить робити ось так:
...
input clk_i,
...

logic [7:0] sec_cnt;
logic [7:0] min_cnt;

logic last_sec_value;

assign last_sec_value = ( sec_cnt == 8'd59 );

always_ff @( posedge clk_i )
if( last_sec_value )
sec_cnt <= 'd0;
else
sec_cnt <= sec_cnt + 1'd1;

always_ff @( posedge last_sec_value )
min_cnt <= min_cnt + 1'd1;


Тобто в якості вхідного сигналу на тригері min_cnt використовується інший сигнал, ніж синхроімпульсів clk_i. Він формується комбінаційної логікою (виходом компаратора).

Або ось так:
...
input clk_a_i,
input clk_b_i,
...

logic [7:0] cnt_a;
logic [7:0] cnt_b;
logic [7:0] sum;

always_ff @( posedge clk_a_i )
cnt_a <= cnt_a + 1'd1;

always_ff @( posedge clk_b_i )
cnt_b <= cnt_b + 1'd1;

always_ff @( posedge clk_b_i )
sum <= cnt_a + cnt_b;


На вхід тригера sum приходить вихід комбінаційної логіки, вхід у якої живиться від різних тактових сигналів.

Обидва прикладу помилкові, ніколи так не робіть! Ці приклади — явне порушення правил синхронного дизайну.

Я здогадуюся, що це все йде з 2000х, коли чіпи були маленькими і розробники виживали як могли.
Швидше за все на малих частотах (типу 1 МГц) це виходило, але якщо ви збираєтеся потрапити в команду, яка робить серйозні речі на топових чіпах, то за такі трюки можна легко вилетіти зі стажування.

Лікування:
  • пройтися по всьому проекту, виписати (на папірець) який тактирующий клок (сигнал) використовується для кожного тригера.
  • зрозуміти як це число можна звести до мінімальної кількості (в розумних межах, зрозуміло), виправити код згідно правил синхронного дизайну.
  • пройтися по всьому проектом і уважно відстежити як відбувається clock domain crossing (тобто перехід даних з однієї на іншу частоту). Виправити, якщо він відбувається некоректно.
  • виконати всі кроки з пункту «Проблема в таймінгах».


Постійне налагодження на залозі (ігнорування симуляції)

Ви допускаєте цю помилку, якщо розробка виглядає так:
  • " редагування HDL-файлу
  • компіляція повного проекту
  • прошивання бінарника на плату
  • підключення за допомогою SignalTap, перегляд потрібних сигналів
  • розуміння помилки, перехід до п. 1
Чому це погано:
  • за допомогою SignalTap ви не можете подивитися всі-всі-всі сигнали, якщо у вас великий проект
  • ви відбираєте свій час, або час роботодавця, при компіляції повного проекту, оскільки це може займати значний час. На маленьких чіпах, це займає 5-10 хвилин, і можна типу забити і піти в цей час покурити/попити чай/пограти в кікер, але на великих проектах це вам вийде боком.
  • потрібна робоча плата під рукою
  • у вас немає впевненості, що зміни в коді робочі і не зламають щось інше
Лікування:
  • написати тестбенч для всього проекту або його частин
  • домогтися коректної роботи в симуляції
  • зібрати проект, перевірити на платі
Якщо щось не запрацює на залозі, то:
  • пройтися по пунктах, обозначеным вище (таймінги і асинхронщина)
  • якщо проблеми в таймінгах немає, то намагатися зрозуміти при яких вхідних впливах це відбувається
  • подати ці впливи в симуляції, переконатися, що проблема відтворюється
  • виправити помилку в RTL-коді, перевірити в симуляції і на залозі
  • обов'язково: зробити висновок, чому попередній варіант симуляції не зміг уловити цю помилку


Немає правил розробки (+ код з запашком

Симптоми:
  • ви багато часу витрачаєте на читання (розбір) коду, який написали вчора.
  • ви часто пишете однотипний код (найпопулярніші клавіші на клавіатурі це Ctrl+C та Ctrl+V)
  • ви не можете розібратися в тому коді, який написав колега (якщо ви працюєте над одним модулем/IP-ядром), а він — у вашому.
Лікування:
  • ознайомитися з літературою, яка розповідає як треба писати хороший код, наприклад, Макконнелл. «Досконалий код»
  • розробити та описати правила розробки для команди. Чи використовувати готові: NetFPGA, обговорення на electronix #1, обговорення на electronix #2 або той, який я використовую.
  • віддайте свій код на рев'ю більш досвідченим розробникам. Про це можна попросити на форумі electronix'a у відповідному розділі. Зрозуміло, бажано, щось більш серйозне, ніж моргання світлодіодів, інакше вас просто не зрозуміють :).
Висновок
Сподіваюся, що в цій статті я розкрив, що треба читати і знати для входження в світ розробки під FPGA.

Впевнений, що якщо Ви:
  • зможете легко відповідати на тестові питання вище (без зазубрювання, зрозуміло)
  • вирішите правильно лабораторні роботи
  • позбудетеся від «класичних помилок»
  • оформіть 1-2 проекту проекту на гітхабі і перевірити їх на залозі. (бажано, складніше, ніж моргання светодиодиков і годинник).

то без проблем зможете претендувати на позицію джуніора в серйозній компанії.

Зрозуміло, цей шлях не можна освоїти за одні вихідні. Може знадобитися місяць і не один, але цей шлях треба пройти, якщо ви хочете перейти з студенченской FPGA-розробки в професійну.

Спасибі за увагу!
Як завжди, буду радий питань і зауважень в коментарях або в особистій пошті.

P. S.
Іноді мені в приват пишуть:
Добрий день.
Я студент 3(4, 5) курсу такого-то університету.
Мені подобається ідея писати під FPGA (паралелізм, можеш робити що хочеш, бла-бла-бла) і подобається Java (робив простенькі програми під Android). Хочу щось з цим зайнятися більш-менш серйозно. Що радите вчити?
Найчастіше я їм пропоную глянути дві ссилочку (FPGA і JAVA) і самостійно зробити висновки.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.