Open Source VHDL Verification Methodology
Стандарт VHDL включает все необходимые функции для кодовой рандомизации воздействий и функционального покрытия — и то и другое очень важно при верификации больших проектов системного уровня. Проблема состоит в том, что эти функции являются РАСШИРЕНЫМИ и требуют большого опыта (умения) кодирования. Вот почему Open Source VHDL Verification Methodology (OS-VVM) так важна. Созданы несколько легко доступных VHDL пакетов, которые скрывают детали реализации от среднего пользователя, делая генерацию псевдослучайных последовательностей (воздействий) и интелектуальное (intelligent) функциональное покрытие не только простым, но и также приятной задачей.
Преимущества OS-VVM:
- Основан на стандарте VHDL-2008, но может работать с VHDL-2002
- Обеспечивает дополнительные возможности для генерации псевдослучайных значений и функционального покрытия
- Псевдослучайные значения с равномерным или взвешенным распределением
- Также поддерживаются распределения: favor_small, favor_big, Гауссово и Пуссона
- Отлично работает с моделированием на уровне транзакций (Transaction Level Modeling)
- Обеспечивает интеллектуальное рандомизацию (randomization), основанную на функциональном покрытии дырок (holes) (ящики (bins), которые не охвачены (not covered))
- Позволяет определения нормальных, запрещённых и игнорируемых ящиков для стандартного покрытия (regular coverage) и перекрёстного покрытия (cross-coverage)
- Оснащена гибкими процедурами отчета по покрытию
Содержание |
OS-VVM Сообщество
- http://osvvm.org/ — Сайт проекта
- Форум
- Blog
About OS-VVM
Open Source VHDL Verification Methodology (OS-VVM) — это методология интеллектуального тестбенча, которая позволяет смешивать интеллектуальное покрытие (Intelligent Coverage) (рандомизация управляемая покрытием) с прямым (направленным), алгоритмическим, основанным на файле, и constrained random методами тестирования. С помощью OSVVM вы можете добавить дополнительные методики верификации в ваш текущей тестбенч без необходимости изучения нового языка или отказа от уже созданных тестбенча или модели тестбенча.
OSVVM упрощает методику верификации на следующих шагах:
- написание высокоточных моделей функционального покрытия (ФП)
- Случайный выбор дырок в функциональном покрытии (так называемое "интеллектуальное покрытие")
- уточнение начальной рандомизаци (initial randomization), используя последовательного VHDL кода.
OSVVM основана на наборе пакетов с открытым исходным кодом:
-
CoveragePkg
для покрытия и интелектуального покрытия -
RandomPkg
для constrained random (CR) utilities.
Эти пакеты предоставляют аналогичные возможности и лаконичность с синтаксисом других языков верификации (таких как SystemVerilog или ‘e’). Двигаясь далее, интеллектуальное покрытие является шагом вперёд, что другие языки верификации предоставляют. Так как OSVVM основана на пакето, её проще обновить, чем синтаксис языка.
Преимущества:
- быстрое моделирование в связи с удалением избыточности при генерации CR воздействий
- быстрая разработка за счёт удаления избыточности между моделированием функционального покрытия и CR.
- меньшая стоимость. Пакет является бесплатным. Работает с базовой лицензией симулятора.
- разработчик независим и работает с любым симулятором, поддерживающим стандарт VHDL-2008 (VHDL-2002 с некоторыми изменениями).
Пакет CoveragePkg поддерживает генерацию ящиков для одномерных и cross-coverage, сбор данных о покрытии и отчетность. Эти функции сами по себе являются весьма привлекательными, но самым большим преимуществом этого пакета является возможность управления псевдослучайными воздействиями основанное на результатах покрытия. Благодаря этой функции пользователи могут создавать интеллектуальные тестовые окружения, которые достигают полного покрытия быстрей, чем с помощью других языков.
Пакет RandomPkg поддерживает генерациию случайных чисел в различных форматах (real, integer, знаковые или без знаковые векторы) с различным распределением (Uniform, Normal, Poisson и др.) и с различными ограниченияи (диапазоны, исключения, вес и др.).
Руководство пользователя
Существует два типа метрик покрытия:
- такие, которые могут быть автоматически получены из hdl-описания, известные как покрытие кода (code coverage)
- и такие, которое задаются пользователем чтобы связать среду верификации с функциями устройства.
Последняя получила название функционального покрытия (functional coverage — ФП).
ФП является метрикой, задаваемой пользователем, которая измеряет на сколько ТЗ (design specification), как набор функций в тестовом плане, выполнено. Оно может быть использовано для измерения интересуемых сценариев, "угловых" (придельных) режимов (corner cases), инвариантов спецификации, или других возможных технических условий — собранных как особенности тестового плана — которые были обнаружены, проверены и протестированы.
Основные аспекты ФП следующие:
- ФП задаётся пользователем и не может быть получено автоматически из проекта
- ФП основано на ТЗ и, таким образом, не зависит от hdl-кода или от его структуры.
Так как ФП полностью определяется пользователем, то оно требует больше предварительных усилий (кто-то должен описать покрытие модели). Функциональное покрытие также требует более структурированного подхода к верификации. Хотя функциональное покрытие может привести к сокращению общих усилий по верификации и даёт более высокое качество проекта, недостатки которого могут помешать его применению.
Расширение языка SystemVerilog для ФП направлено на эти недостатки, обеспечивая языковые конструкции для простого определения моделей функционального покрытия. Эти определения эффективно выполняются ядром симулятора SystemVerilog, что позволило проводить обработку данных о покрытии и инструменты анализа, которые увеличивают скорость разработки высококачественных тестов. Улучшенный набор тестов может выполнять больше угловых состояний и требуемых сценариев, без лишних затрат.
Конструкции ФП SystemVerilog включают:
- покрытие переменных и выражений, а так же перекрёстное покрытие между ними
- как автоматически, так и задаваемые пользователем корзины покрытия
- Связанные корзины с наборами значений, переходами или перекрёстными произведениями
- Фильтрация условий на различных уровнях
- события и последовательности для автоматического запуска выборки покрытия
- процедурная активация и запрос покрытия
- дополнительные директивы для управления и регулирования покрытия.
- Coverage point (or item) — одномерное выражение (или просто переменная) sampled during coverage data collection.
- Bin - корзина — это поддиапазон значений точки покрытия;
- Coverage cross
Jim Lewis, член рабочей группы IEEE 1076, отвечающей за стандарт VHDL, написал очень полезный пакет, который значительно упрощает эту задачу. Он может быть скачан по следующим ссылкам:
Оба пакета используют концепцию protected types и shared variables, и они требуют поддержки стандарта VHDL 2002 или 2008 в симуляторе.
Защищённые типы (Protected Types)
Все пакеты и другие фрагменты кода представленные в этом документе основаны на защищённых типах (тип protected) — это концепция языка VHDL, похожая на классы, известные из других языков программирования.
Тип Protected упрощает инкапсуляцию в VHDL коде:
- объединение элементов данных (свойства) и операций, которые могут выполняться над ними (методы) в один объект,
- сокрытие деталей реализации данных от конечных пользователей.
Пользователи, которые никогда не работали с защищёнными типами могут легко представить их, как специальную версию типа запись (record), которая позволяет включать процедуры и функции в дополнения к обычным полям данных.
Далее приведён пример объявления и тела защищённого типа:
type FlagsPT is protected -- Объявление (declaration) procedure set; -- процедура - метод (procedure method) procedure reset; ; -- процедура - метод (procedure method) impure function is_set return BOOLEAN; ; -- функция - метод (function method) end protected FlagsPT; type FlagsPT is protected body -- body variable flag : BOOLEAN := False; -- закрытое (приватное) свойство (private property) procedure set is begin flag := True; end; procedure reset is begin flag := False; end; impure function is_set return BOOLEAN is begin return flag; end; end protected body FlagsPT;
Открытая часть защищённого типа описана в секции декларации protected..end protected; только элементы, видимые здесь, имеют прямой доступ к переменным защищённого типа.
Тело защищённого типа (секция protected body..end protected body) является реализацией этого типа. Оно содержит полное описание всех методов указанных в декларативной части и закрытые (собственные) поля данных и подпрограмм доступные только через открытые методы.
Защищённые типы могут использоваться только с переменными: либо локальные в процессах или подпрограмм, либо общие (shared) переменные, объявленные в архитектуре. Открытые элементы из декларации типа могут быть вызваны используя формат variable_name.method_name.
test : process variable myflag : FlagsPT; begin report "!!! Setting 'myflag'!!!"; myflag.set; if myflag.is_set then report "'myflag' is set."; end if; report "!!! Resetting 'myflag'!!!"; myflag.reset; if not myflag.is_set then report "'myflag' is set now."; end if; wait; end process;
Можно отметить, что пользователь типа FlagsPT защищён от внутреннего представления значения флага. Мы можем изменить его с типа Boolean на Integer или Bit (с соответствующим изменением методов), а процесс использования переменной myflag будет выглядеть и работать также.
Защищённые типы в OS_VVM защищают пользователя от довольно сложных структур и подпрограмм, поддерживающих рандомизацию и функциональное покрытие.
Использование пакета RandomPkg
Использование пакета CoveragePkg
Пакет позволяет создавать структуры данных, необходимые для сбора информации по функциональному покрытию и обеспечивает подпрограммами, которые манипулируют данными в ходе подготовки, сбора и представления данных. Начинающие пользователи могут быстро создавать модели покрытия, следуя простому алгоритму
- Объявить покрываемый объект (Declare coverage object)
- Сгенерировать ящики (bins) и добавить их в точки покрытия (cover point) или cross структуры в объекте (Generate bins and add them to a cover point or cross structure in the object)
- Собрать данные о покрытии (в любой подходящий момент). (Collect coverage data (at any convenient sampling event)).
- Использовать данные о покрытии для управления псевдослучайностью воздействий (Use coverage data to control stimulus randomization).
- Проверить было ли достигнуто покрытие. Повторить шаги 3 и 4, если необходимо. (Check if coverage achieved. Repeat steps 3 & 4 if needed)
- Записать отчёт.
Подготовленные VHDL программисты могут без труда добавить новые функции, такие как traversing coverage data structures и создание расширенных отчетов / процедур пост-обработки.
Ссылки
- Вебинары
- /home/kola/docs/osvvm.org
- http://osvvm.org/about-os-vvm
- http://www.synthworks.com/downloads/
- http://www.eda.org/twiki/bin/view.cgi/P1076/CoverageRandomization
- http://www.testbench.in/CO_07_COVERAGE_BINS.html - про функциональное покрытие в SystemVerilog