Опит с разработка, управлявана от тестове (TDD) за проектиране на логика (чип) във Verilog или VHDL

Погледнах в мрежата и изглежда, че дискусиите/примерите са за традиционна разработка на софтуер. Тъй като Verilog и VHDL (използвани за проектиране на чипове, напр. FPGA и ASIC) са подобни на разработката на софтуер C и C++, изглежда, че има смисъл. Те обаче имат някои разлики, тъй като са фундаментално паралелни и изискват хардуер за пълно тестване.

Какви преживявания, добри и лоши, сте имали? Някакви връзки, които можете да предложите за това конкретно приложение?

Редакции/разяснения: 28.10.09: Питам специално за TDD. Запознат съм с правенето на тестови стендове, включително такива за самопроверка. Също така знам, че SystemVerilog има някои специфични функции за тестови стендове.

28.10.09 г.: Подразбиращите се въпроси включват 1) писане на тест за каквато и да е функционалност, без никога използване на вълнови форми за симулация и 2) първо писане на тестове/тестове.

11/29/09: В Емпирични проучвания показват, че разработката, насочена към тестове, подобрява качеството те докладват за (софтуер) TDD „Плътността на дефектите преди пускането на четирите продукта, измерена като дефекти на хиляда реда код, намалява между 40% и 90% спрямо проектите, които не използват TDD. ръководството докладва субективно 15–35% увеличение на първоначалното време за разработка за екипите, използващи TDD, въпреки че екипите се съгласиха, че това се компенсира от намалените разходи за поддръжка. Намалените бъгове намаляват риска от прекъсване на лентата, за сметка на умереното въздействие върху графика. Това също има някои данни.

29.11.09: Правя основно код за управление и път на данни, а не DSP код. За DSP типичното решение включва симулация с битова точност на Matlab.

03/02/10: Предимството на TDD е, че първо се уверявате, че тестът е неуспешен. Предполагам, че това може да се направи и с твърдения.


person Brian Carlton    schedule 27.10.2009    source източник
comment
Мога да си представя колко добре би се отразило предложението тестовете да се пишат преди RTL :-) Един чип мениджър би възприел това като изтласкване на датата на записване.   -  person DMC    schedule 02.11.2009
comment
Предполагам, че тълпата от TDD има дискусии по този въпрос. Трябва да разгледам това.   -  person Brian Carlton    schedule 02.11.2009
comment
RTL = Ниво на прехвърляне на регистър. Мислете за това като за код от ниско ниво, който дефинира веригата в модула.   -  person Brian Carlton    schedule 17.12.2009
comment
Има ли нещо ново във вашия опит с TDD и HDL код?   -  person ferdepe    schedule 17.02.2017


Отговори (8)


Пиша код за FPGA, не за ASICS... но TDD все още е моят предпочитан подход. Харесва ми да имам пълен набор от тестове за целия функционален код, който пиша, и се опитвам (не винаги успешно) първо да напиша тестов код. Взирането в вълновите форми винаги се случва в даден момент, когато отстранявате грешки, но това не е добър начин за валидиране на вашия код (IMHO).

Като се има предвид трудността при извършване на правилни тестове в реалния хардуер (стимулирането на ъглови случаи е особено трудно) и факта, че VHDL-компилирането отнема секунди (срещу компилирането „към хардуер“, което отнема много минути (или дори часове)), не Не виждам как някой може да работи по друг начин!

Също така вграждам твърдения в RTL, докато го пиша, за да уловя неща, които знам, че никога не трябва да се случват. Очевидно това се възприема като малко „странно“, тъй като има схващане, че инженерите по проверка пишат твърдения, а RTL дизайнерите не. Но най-вече аз съм собственият си инженер по проверка, така че може би това е причината!

person Martin Thompson    schedule 30.10.2009
comment
Здравей Мартин, ако случайно имаш документ или някаква статия, в която даваш някои примери и споделяш опита си, ще ми бъде много интересно. Какъв вид RTL модули пишете, т.е. повече ли е JPEG процесорът, шинната система, ... - person danielpoe; 04.11.2009
comment
Здравей Даниел, страхувам се, че нямам нищо, към което мога да те насоча относно примери (може би трябва да напиша нещо :). Въпросните модули са за система за обработка на изображения (можете да прочетете повече за системата тук, ако искате conekt.net/fpgas-for-ldw.html). Склонен съм да създавам малки тестови стендове, работещи върху малки (често рисувани на ръка) изображения, за които мога да изчисля правилните отговори на ръка. След това имам Matlab симулация на алгоритмите (която се използва за алг. разработка), която генерира отговори за HDL sim, срещу които да се тества - повтарям, докато получа резултати с битова точност тук. - person Martin Thompson; 06.11.2009

Използвам VUnit за тестова разработка с VHDL.

VUnit е библиотека на Python, която извиква VHDL компилатора и симулатора и чете резултатите от симулацията. Освен това предоставя няколко хубави VHDL библиотеки, които улесняват много писането на по-добри тестови тестове, като например комуникация библиотека, библиотека за регистриране и проверка на библиотека.

Има много възможности, тъй като се извиква от Python. Възможно е както генериране на тестови данни, така и проверка на изходните данни от теста в Python. Онзи ден видях този пример, където използваха Octave - копие на Matlab - за изобразяване на резултатите от теста.

VUnit изглежда много активен и няколко пъти успях да задам въпроси директно на разработчиците и получих помощ доста бързо.

Недостатъкът е, че е по-трудно да се отстраняват грешки при компилиране, тъй като има толкова много вариации на функция/процедура с едно и също име в библиотеките. Освен това някои неща се правят зад сцената чрез предварителна обработка на кода, което означава, че някои грешки може да се появят на неочаквани места.

person Erasmus Cedernaes    schedule 11.03.2018
comment
Хубаво е да имате някои актуални отговори, тъй като този въпрос е един от най-гласуваните в подкрепа под VHDL маркера. - person Erasmus Cedernaes; 13.03.2018
comment
Съжалявам, но не съм съгласен. Stackoverflow не е сайт за документация (те опитаха, но не успяха). Ако беше необходимо да се актуализират стари въпроси и отговори, тогава никой нямаше да има време за нови. Междувременно вече бяха зададени много въпроси относно работата с VUnit и има таг VUnit. Изглежда по-добре да положите усилия там. - person JHBonarius; 13.03.2018

Не знам много за дизайна на хардуера/чипа, но съм дълбоко в TDD, така че мога поне да обсъдя пригодността на процеса с вас.

Въпросът, който бих нарекъл най-уместен, е: Колко бързо вашите тестове могат да ви дадат обратна връзка за дизайн? Свързано с това: Колко бързо можете да добавите нови тестове? И колко добре вашите инструменти поддържат рефакторинг (промяна на структурата без промяна на поведението) на вашия дизайн?

Процесът на TDD зависи до голяма степен от „мекотата“ на софтуера – добрите автоматизирани тестове на единици се изпълняват за секунди (минути отвън) и насочват кратки изблици на фокусирано изграждане и рефакторинг. Вашите инструменти поддържат ли този вид работен процес - бързо циклично преминаване между писане и изпълнение на тестове и изграждане на тестваната система в кратки итерации?

person bradheintz    schedule 03.11.2009
comment
Моят опит показва, че изпълнението на пълния пакет може да отнеме много минути... Но мога да изпълня итерация на компилация/тест на определен тест за едноцифрени секунди (обикновено). Пълният пакет за повечето от моите подмодули е дейност за ~10 секунди. Времето, в което пада, е ако трябва да итерирате с реален хардуер или да изпълнявате синтез - обикновено защото преследвате проблеми с производителността, а не функционални. Това често може да отнеме десетки минути. - person Martin Thompson; 05.11.2009
comment
Предполагам, че под изпълнение на синтез имате предвид нещо подобно на това, което бихме нарекли тест за интеграция или тест за приемане в софтуера - не толкова полезно за стимулиране на развитието, но важно, след като сте поставили частите на място. 10 секунди не са лоши - това е някъде около границата между продуктивни/непродуктивни единични тестове (т.е. точката, в която хората или ще спрат да ги изпълняват при всяка итерация, или ще преминат към четене на Metafilter, докато те работят). Има ли някакви средства за подиграване/забиване на подмодули? - person bradheintz; 05.11.2009
comment
Единичният тест е грубо тестов стенд във Verilog и VHDL. Те стимулират дизайна. - person Brian Carlton; 06.11.2009
comment
Синтезът преобразува дизайна във форма, която може да се изпълнява на чипа. Сякаш симулацията е като стартиране на C и компилирането на кода е синтез. - person Brian Carlton; 06.11.2009
comment
bradheintz: изпълнението на синтез е нещо повече от още един тест, това е, което правите, за да стигнете до истинския хардуер. Той ще маркира проблеми с производителността и ще позволи тестване на пълна скорост. Но, да, това е по-скоро част от дейността. Има (няколко) пъти, когато повтаряте тази част, което е наистина болезнено! Подигравка/набиване, да. Можете да изградите множество архитектури на дадени подмодули, които могат да бъдат толкова функционални (или не), колкото искате. Те също могат да бъдат несинтезируеми на този сим етап, което означава, че повече от езика е достъпен за вас. - person Martin Thompson; 06.11.2009

Разширенията SystemVerilog към стандарта IEEE Verilog включват разнообразие от конструкции, които улесняват създаването на задълбочени тестови пакети за проверка на сложни цифрови логически дизайни. SystemVerilog е един от езиците за проверка на хардуера (HVL), който се използва за проверка на дизайна на ASIC чипове чрез симулация (за разлика от емулация или използване на FPGA).

Значителни предимства пред традиционния език за проектиране на хардуер (Verilog) са:

  • ограничена рандомизация
  • твърдения
  • автоматично събиране на функционални данни и данни за покритие на твърдения

Ключът е да имате достъп до софтуер за симулация, който поддържа този скорошен (2005) стандарт. Не всички симулатори поддържат напълно по-разширените функции.

В допълнение към стандарта IEEE има библиотека с отворен код SystemVerilog от компоненти за проверка, достъпна от VMM Central (http://www.vmmcentral.com). Той осигурява разумна рамка за създаване на тестова среда.

SystemVerilog не е единствената HVL и VMM не е единствената библиотека. Но бих препоръчал и двете, ако имате достъп до подходящите инструменти. Открих, че това е ефективна методология за намиране на грешки в дизайна преди да стане силикон.

person toolic    schedule 28.10.2009
comment
Това е възможно, защото проверката в симулационна среда се извършва от много време в света на ASIC, просто не се нарича TDD. Имайте предвид, че често не се прави и като ръководена разработка (както при писане на тестове преди функционален код)! - person Martin Thompson; 24.11.2009

По отношение на инструментите за рефакторинг за хардуерни езици бих искал да ви насоча към нашия инструмент Sigasi HDT. Sigasi предоставя IDE с вграден VHDL анализатор и VHDL преработки.

Филип Фаес, Сигаси

person Philippe Faes    schedule 11.11.2009

ANVIL – Друг слой за взаимодействие на Verilog говори за това. Не съм пробвала.

person Brian Carlton    schedule 11.11.2009

Никога не съм опитвал активно TDD на RTL дизайн, но имах своите мисли по този въпрос.

Това, което мисля, че би било интересно, е да се изпробва този подход във връзка с твърдения. По принцип първо бихте записали под формата на твърдения какво предполагате/очаквате от вашия модул, напишете вашия RTL и по-късно можете да проверите тези твърдения с помощта на официални инструменти и/или симулация. За разлика от „нормалните“ тестови случаи (където вероятно ще трябва да напишете насочени такива) трябва да имате много по-добро покритие и твърденията/предположенията могат да бъдат полезни и по-късно (напр. на системно ниво).

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

Може би можете да изразите мислите си и по този въпрос, тъй като го питате, предполагам, че носите някои идеи в главата си?

person danielpoe    schedule 28.10.2009

Какво е TDD за вас? Имате предвид, че целият ви код се упражнява от автоматични тестове по всяко време, или отивате по-далеч, като означавате, че тестовете се пишат преди кода и не се пише нов код, освен ако тестовете не успеят?

Който и подход да предпочитате, тестването на HDL код не се различава много от тестването на софтуера. Той има своите плюсове (много по-добро покритие и дълбочина на тестване) и минуси (труден за настройка и тромав спрямо софтуера).

Имам много добър опит с използването на Python и генерични HDL транзактори за прилагане на изчерпателни и автоматични тестове за синтезируеми HDL модули. Идеята е донякъде подобна на това, което Janick Bergeron представя в своите книги, но вместо SystemVerilog, Python се използва за (1) генерира VHDL код от тестови сценарии, написани на Python и (2) проверка на резултатите, написани от трансакторите за мониторинг, които приемат вълнови форми от дизайна по време на симулация.

Има много повече да се пише за тази техника, но не съм сигурен върху какво искате да се съсредоточите.

person Eli Bendersky    schedule 10.11.2009
comment
TDD = и двата 1. регресионни теста, в идеалния случай се изпълняват преди всяка проверка (или поне всяка вечер) 2. Напишете тест преди код. Поне това търся. - person Brian Carlton; 10.11.2009