Опыт разработки через тестирование (TDD) для проектирования логических схем (микросхем) в Verilog или VHDL

Я поискал в Интернете, и кажется, что обсуждения / примеры относятся к традиционной разработке программного обеспечения. Поскольку Verilog и VHDL (используемые для проектирования микросхем, например, FPGA и ASIC) похожи на разработку программного обеспечения на C и C ++, это кажется логичным. Однако у них есть некоторые отличия, заключающиеся в том, что они фундаментально параллельны и требуют аппаратного обеспечения для полного тестирования.

Какой опыт, хороший и плохой, у вас был? Какие ссылки вы можете предложить по этому конкретному приложению?

Правки / уточнения: 28.10.09: Я особенно спрашиваю о TDD. Я знаю, как делать испытательные стенды, в том числе самопроверяющиеся. Я также знаю, что SystemVerilog имеет некоторые особенности для тестовых стендов.

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

29.11.09: Эмпирические исследования показывают, что разработка, основанная на тестировании, улучшает качество они сообщают для (программного обеспечения) TDD «Плотность дефектов до выпуска четырех продуктов, измеренная как количество дефектов на тысячу строк кода, снизилась на 40-90% по сравнению с проектами, в которых TDD не использовался. Команды» руководство субъективно сообщило об увеличении времени начальной разработки для команд, использующих TDD, на 15–35%, хотя команды согласились, что это компенсируется снижением затрат на обслуживание ». Уменьшение количества ошибок снижает риск потери ленты за счет умеренного воздействия на график. Здесь также есть некоторые данные.

29.11.09: Я в основном занимаюсь управляющим кодом и кодом канала данных, а не кодом DSP. Для DSP типичное решение включает симуляцию Matlab с точностью до бита.

02.03.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 все еще мой предпочтительный подход. Мне нравится иметь полный набор тестов для всего функционального кода, который я пишу, и я стараюсь (не всегда успешно) сначала написать тестовый код. Когда вы отлаживаете, всегда происходит пристальное внимание к формам сигналов, но это не лучший способ проверки вашего кода (ИМХО).

Учитывая сложность выполнения надлежащих тестов на реальном оборудовании (особенно сложно стимулировать угловые случаи) и тот факт, что компиляция 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-симулятора для тестирования - я повторяю, пока не получу здесь побитовые результаты. - 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 Standard включают в себя множество конструкций, которые облегчают создание тщательных наборов тестов для проверки сложных схем цифровой логики. 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. Идея в чем-то похожа на то, что Яник Бержерон представляет в своих книгах, но вместо SystemVerilog для (1) генерировать код VHDL из тестовых сценариев, написанных на Python, и (2) проверять результаты, записанные контролирующими транзакторами, которые принимают формы сигналов от проекта во время моделирования.

Об этой технике еще предстоит написать, но я не уверен, на чем вы хотите сосредоточиться.

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