Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Верификация цифровых устройств. Курс лекций. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
ное тестовое окружение в общем случае должно выполнять следу­ющие шаги:
1. Генерация входных воздействий.
2. Передача воздействий на тестируемый блок (DUT).
3. Захват с DUT ответной реакции.
4. Анализ полученного ответа.
5. Корректировка тестовых воздействий на основе анализа.
Разумеется, отдельные шаги могут пропускаться в зависимости от целей и задач разрабатываемого теста. Например, корректировка тестовых воздействий может выполняться вручную для уточнения каких-либо моментов в работе устройства, а подача воздействий в DUT может быть совмещена с их генерацией.
В процессе верификации возможны два подхода к генерации входных воздействий. Первый, традиционный, подход – примене­ние направленных тестов. При данном подходе инженер­верификатор анализирует спецификацию оборудования и пишет план проверки со списком тестов, каждый из которых концентри­руется на наборе связанных функций. Далее, следуя намеченному плану, онтесты, формирующие необходимые для осуществления проверяемых функций вектора тестовых воздействия на DUT. За­тем выполняется моделирование DUT с помощью векторов и вруч­ную просматриваются полученные на выходе файлы журналов и временные диаграммы, чтобы убедиться, что проект соответствует ожиданиям. Как только тест работает правильно, он помечается в плане проверки как прошедший и инженер переходит к следующе­му.
Такой подход обеспечивает стабильный прогресс в тестирова­нии, так как функции устройства покрываются тестами последова­тельно. Более того, написание каждого отдельного вектора тесто­вых воздействий не требует наличия какой-либо тестовой инфра­структуры. Для многих проектов такого подхода вполне достаточ­но, чтобы при наличии времени и ресурсов полностью покрыть те­стовый план.
Из графика на рис. 1.1 видно, что покрытие теста линейно уве­личивается с увеличением тестов. Каждый тест направлен на те­стирование конкретной функции устройства. При наличии доста­точного количества времени и ресурсов постепенно направленное тестирование покрывает весь функционал устройства.
– 11 –
Рис. 1.1. Зависимость покрытия от времени
при направленном тестировании
Но что делать, если на выполнение направленных тестов нет до­статочно времени или ресурсов? Из рис. 1.1 видно, что на всем протяжении тестирования время и покрытия связаны линейно: если проект увеличивается в два раза, то и требуемое для его тестирова­ния время удваивается.
Одновременно с этим покрытие направленных тестов ограниче­но тестовым планом. Это означает, что проверяются только те слу­чаи и ситуации, которые верификатор сумел предусмотреть в пове­дении устройства. На рис. 1.2 приводятся весь возможный функци­онал устройства, проверяемые тестами функции и обнаруженные ошибки. Как видно из рисунка, тесты покрывают далеко не весь функционал устройства, и при этом каждый тест направлен на про­верку лишь небольшого количества функций устройства.
Рис. 1.2. Покрытие устройства направленными тестами
– 12 –
Второй подход, применяемый при построении тестов, – слу­чайное тестирование. Методология этого подхода строится на
следующих взаимосвязанных принципах:
1. Генерация случайных воздействий.
2. Функциональное покрытие.
3. Многоуровневая модель тестового окружения.
4. Общее тестовое окружение для всех тестов.
5. Разделение тестов и тестового окружения.
Направленные тесты позволяют находить ошибки, которые ин­женер ожидает найти в системе. При использовании же случайных тестовых воздействий возможно обнаружить ошибки, существова­ние которых даже не предполагалось в проекте. Использование случайных воздействия приводит к необходимости сбора функцио­нального покрытия – механизма, позволяющего оценить, какой функционал устройства уже покрыт, а какой еще нет. Кроме того, требуется механизм автоматического прогнозирования и анализа результатов, в качестве которого обычно выступает эталонная мо­дель устройства. Построение такого тестового окружения – не про­стая задача, и одним из способов ее упростить и избежать ошибок является применение многоуровневой модели тестового окруже­ния, что позволяет разбивать задачу на части.
Поскольку создание тестового окружения требует много време­ни, то логично создавать общее окружение для нескольких тестов. Такое окружение должно иметь механизмы управления, с помо­щью которых каждый тест сможет выполнить необходимые ему последовательности воздействий на DUT. Сами тесты при этом от­делены от тестового окружения.
Создание такого тестового окружения занимает больше време­ни, чем при традиционном подходе. В результате может возник­нуть значительная задержка, прежде чем можно будет запустить первый тест. На рис. 1.3 приведена зависимость покрытия от вре­мени.
Как видно, начальные временные затраты на создание тестового окружения существенны, но вскоре это окупается. Причина в том, что все тесты используют общее, разделяемое тестовое окружение. Таким образом, создание нового теста сводится к формированию необходимых ограничений на генерируемые тестовым окружением воздействия, что зачастую может поместиться в несколько строк.
– 13 –
Рис. 1.3. Зависимость покрытия от времени при случайном тестировании
Помимо общего ускорения работы по проекту, применение слу­чайного тестирования позволяет также увеличить область покры­тия тестов, поскольку входные воздействия не ограничены задан­ным набором, как при направленных тестах.
Несмотря на то, что тестирование называется случайным, на входы устройства подаются не совсем случайные значения. Одна­ко, если для направленного теста инженер ограничивает входные значения строго заданными значениями, то при случайном те­стировании ограничивается множество разрешенных значений и из этого множества выбираются случайные.
Например, для направленного теста при проверке работы памя­ти тест будет записывать данные Д по заданному адресу А. При случайном тестировании инженер ограничивает область допусти­мых адресов и данных, после чего тест записывает случайные дан­ные по случайному адресу в рамках заданных ограничений. На рис. 1.4 приведено тестовое покрытие при случайном тестиро­вании.
Из рис. 1.4 видно, что случайный тест часто охватывает более широкое пространство, чем направленный. Это дополнительное покрытие может перекрывать другие тесты или исследовать новые области, исследование которых не планировалось. И в этих новых областях могут быть найдены новые ошибки, которые были бы пропущены направленными тестами. Если новая область недопу­стима, нужно написать более строгие ограничения, чтобы предот­вратить недопустимые входные воздействия на DUT. Тем не менее,
– 14 –
возможно, все еще придется написать несколько направленных те­стов, чтобы найти случаи, не охваченные случайными тестами.
Рис. 1.4. Тестовое покрытие при случайном тестировании
Говоря про генерацию случайных тестовых воздействий, в первую очередь думаешь о случайных данных и адресе. Однако это не приведет к значительному увеличению покрытия теста. Случай­ным образом следует задавать и следующие вещи:
1. Конфигурация устройства.
2. Конфигурация окружения.
3. Входные данные.
4. Нарушения протокола и ошибки.
5. Временные параметры.
Конфигурация устройства и конфигурация окружения являются важными параметрами – если тест проверяет работу устройства только после сброса, когда все регистры приведены в заданное начальное состояние, то существует высокий шанс пропустить ошибку, которая появляется после длительной работы устройства. Если проверять устройство на работу только с одной конфигураци­ей окружения, тогда как спецификация допускает различные, то это также приведет к пропуску ошибок.
– 15 –
Про необходимость случайного задания входных данных упо­миналось ранее.
Важно также проверять работу устройства в условиях наруше­ния протокола: как поведет себя система, если пришли некоррект­ные данные или команда, возникла ошибка в транзакции на шине и т.п. Кроме того, тестовое окружение должно контролировать со­блюдение протоколов самим устройством, например, выдавая пре­дупреждения при нарушении.
Даже при функциональном моделировании следует учитывать временные параметры. Если какой-либо протокол предполагает передачу данных с переменной задержкой, надо задавать эту за­держку случайным образом. Работа на разных частотах позволит выявить некорректные переходы между частотными доменами или ошибки, когда одна часть схемы не справляется с потоком данных, поступающих на более высокой частоте.
В заключение следует отметить такой параметр как «семя». Ес­ли запускаем случайное тестирование, генерируем случайные по­следовательности данных, то должны иметь возможность этот тест повторить. С другой стороны, запуская несколько тестов одновре­менно, нужно быть уверенными, что они не будут дублировать друг друга и выполнять тест с одинаковыми входными параметра­ми. Для этого все случайные значения в тесте должны зависеть от передаваемого в тест параметра – «семя». Запуск тестов с разным значением семени позволит получить запуски с разными данными. А при необходимости повторного запуска какого-либо набора, например, для подтверждения/уточнения ошибки, знание значения семени позволит сделать это без каких-либо сложностей.
– 16 –
Лекция 2. SystemVerilog – основы языка
Введение
Вторая лекция курса посвящается изучению общей структуры тестового окружения и уровней абстракции, которые приводят к такому его разделению. Рассматриваются базовые типы данных языка SystemVerilog, в том числе и все виды массивов.
2.1. Структура тестового окружения
При выполнении моделирования тестовое окружение «оборачи­вается» вокруг тестируемого устройства, как это было бы при под­ключении тестового анализатора к реальной системе. Отличие за­ключается в уровнях абстракции, на которых работает тестовое окружение: оно должно переводить транзакции с высоких уровней абстракции в битовые последовательности и обратно.
Что должно входить в тестовое окружение? Оно состоит из не­скольких функциональных моделей шин (BFM), которые можно рассматривать как компоненты тестового окружения: для DUT они выглядят как реальные компоненты, но являются частью теста, а не дизайна RTL. Если реальное устройство подключается к шинам AMBA, USB, PCI и SPI, то необходимо встроить эквивалентные компоненты в тестовое окружение, чтобы они могли генерировать воздействия в соответствии с протоколами шин и анализировать реакции DUT. Это не детализированные, синтезируемые модели, а высокоуровневые транзакции, которые подчиняются протоколу и выполняются быстрее. Хотя возможно и использование синтезиру­емых моделей для размещения, например, на ПЛИС.
Ключевой концепцией любой современной методологии вери­фикации является многослойное тестовое окружение. Хотя разра­ботка такого окружения может показаться более сложной, но в об­щем это упрощает задачу, разделив код на более мелкие части, ко­торые можно разрабатывать отдельно. Не надо пытаться написать одну подпрограмму, которая может случайным образом генериро-
– 17 –
вать все типы стимулов, как допустимых, так и не допустимых. Та­кая система очень сложна в управлении и контроле и будет иметь много внутренних ошибок.
Многослойное тестовое окружение может включать в себя сле­дующие уровни:
1. Уровень сигналов.
2. Уровень команд.
3. Функциональный уровень.
4. Уровень сценариев.
5. Уровень теста.
Применение уровней абстракции позволяет разделить функцио­нал тестового окружения и упростить его создание и отладку, а также дает возможность повторного использования отдельных компонент. На рис. 2.1 приведена структура тестового окружения с учетом применения различных уровней.
Уровень сценария
Функциональный
уровень
Уровень команд
Уровень сигналов
Рис. 2.1. Структура уровней тестового окружения
Генератор
Агент Табло Проверка
Утверждения МониторДрайвер
DUT
Окружение
Самый нижний – уровень сигналов. К данному уровню отно­сится подключение тестируемого устройства и взаимодействие с ним на уровне отдельных сигналов.
– 18 –
Следующий, более высокий уровень – командный. Входы DUT управляются драйвером, который выполняет отдельные команды, такие как чтение или запись, и формирует необходимые сигналы. Выход DUT анализируется монитором, который принимает сигна­лы и преобразует их в команды в составе тестового окружения.
Утверждения (assertions) также находятся на уровне команд, по­скольку они смотрят на отдельные сигналы, но ищут ошибки по всей команде.
Таким образом, командный уровень – это граница между моде­лированием сигналов, которое привязано к модельному времени, и транзакциями, которые к модельному времени не привязаны.
Функциональный уровень располагается после командного. В его состав входит блок агента, который получает транзакции более высокого уровня, такие как чтение или запись DMA, и разбивает их на отдельные команды. Эти команды также отправляются на табло, которое прогнозирует результаты транзакции. Средство проверки сравнивает команды с монитора с теми, которые находятся на табло.
Функциональный уровень управляется генератором на уровне сценария. Что такое сценарий? Работа в качестве инженера­верификатора заключается в том, чтобы убедиться, что это устрой­ство выполняет поставленную задачу. Примером устройства может является MP3-плеер, который может одновременно воспроизводить музыку из своего хранилища, загружать новую музыку с хоста и реагировать на ввод от пользователя, такой как регулировка гром­кости и управление треками. Каждая из этих операций является сценарием. Загрузка музыкального файла выполняется в несколько этапов: чтение и запись управляющего регистра для настройки операции, несколько операций записи в DMA для передачи песни, а затем другая группа операций чтения и записи. Сценарий тесто­вого окружения координирует все эти шаги со случайными ограни­ченными значениями для таких параметров, как размер дорожки и место в памяти.
Все перечисленные выше компоненты составляют тестовое окружение DUT, оно обозначено пунктиром на рис. 2.1. Это тесто­вое окружение может дорабатываться при добавлении тестов, например, внесением новых сценариев, но оно остается общим для всех тестов. Оно имеет механизмы для управления, которые позво-
– 19 –
лят тестам настраивать это окружение под себя, формируя необхо­димые воздействия на DUT.
Самый верхний – уровень тестов. Его структура приведена на рис. 2.2.
Рис. 2.2. Уровень теста
Тест управляет параметрами и ограничениями тестового окру­жения, заставляя его генерировать необходимые тестовые воздей­ствия. Также к уровню теста относится сбор функционального по­крытия – эта часть меняется в зависимости от тестируемой части проекта, поэтому она находится за пределами тестового окруже­ния.
Далее не всегда требуется реализовывать все слои теста – все зависит от сложности тестируемого устройства: для простых устройств может быть достаточно и одного агента, тогда как для сложных DUT, сочетающих в себе несколько протоколов, может потребоваться создание отдельных слоев для каждого протокола. Например, для протоколов TCP, IP и Ethernet может потребоваться создание отдельного слоя для каждого из них.
– 20 –