Объект верификации (ОВ) часто называют DUT (Design Under Test).
Актуальные проблемы верификации:
Directed Tests Method (DTM)
Прямые, осмысленные тесты. План верификации составляется из тестов направленных на проверку поведения устройства в конкретных интересующих точках (состояниях). Проверить все возможные ситуации, особенно в сложных проектах, почти не возможно.
При этом проблемы, которые могут возникнуть в ситуациях не покрытых тестами не обнаруживаются до того, как устройство начинают использовать в реальных условиях. Обычно в этих тестах используются метрики функционального покрытия.
Coverage-Driven Verification, Metric-Driven Verification (CDV, MDV)
Концепция создания тестов, направленная на достижение определенного «тестового покрытия» DUT. Опираются на метрики, чтобы понять какие тесты необходимо добавить в план верификации, чтобы достигнуть целевых показателей готовности проекта.
Необходимо использовать инструменты анализа покрытия, чтобы посмотреть, что еще добавить в план верификации. По-сути, если начать корректировать план верификации в DTM, опираясь хотя бы на “покрытие кода”, то уже можно считать, что от DTM плавно перешли к CDV.
Constrained Random Verification (CRV)
Верификация подачей случайных воздействий. Это действительно автоматические тесты с генерацией случайных воздействий на DUT.
Метод очень затратный вначале, т.к. требуется длительное время на подготовку инструментов. После того как начальный этап подготовки пройден, то тестирование может запускаться автоматически, многократно с разными исходными данными. При выявлении несоответствия проверок или утверждений (checkers or assertions), команда разработчиков и верификаторов приступает к анализу выявленной ошибки.
Этим методом можно собрать покрытие кода и покрытие утверждений, а они могут ничего не говорить о правильности работы DUT, т.е. соответствии спецификации. Его необходимо дополнять функциональными тестами.
Для реализации данной методологии требуется:
Assertion Based Verification (ABV)
Верификация с помощью утверждений. Наверное, это даже не самостоятельный метод, а некоторый компонент или базовая составляющая вышеупомянутых.
Важным вопросом при ABV является как распределить assertions, какие из них лучше поместить в исходные код DUT, какие нужно иметь в тестовом окружении.
Метрики — это показатели охвата проекта тестами. Они нужны для того, чтобы понять какие еще тесты необходимо разработать для проверки возможных ситуаций и сколько предположительно времени может занять верификация. К сожалению, только один тип метрик оценивается на основании исходного кода проекта, определение критериев для остальных типов — это результат интеллектуального труда. К тому же, необходимо помнить, что достижение желаемых показателей одним типом метрик никак не говорит о работоспособности в целом, всегда необходимо оценивать комплекс.
Типы метрик:
В системе ModelSim при моделировании можно задать следующие опции покрытия кода.
Чтобы увидеть, какие строки кода конкретного модуля отмечены как покрытые (непокрытые), требуется открыть текст этого модуля.
Отчет о покрытии строки можно получить, выполнив View -->Coverage --> Details.
Результирующие отметки о покрытии кода
Знак | Cмысл |
---|---|
✔ | Все операторы, ветви, условия или выражения на строке кода были выполнены |
X | Различные виды покрытия на строке кода не были выполнены |
XT | Ветви по значению истина (True) не были выполнены (пройдены) |
XF | Ветви по значению ложь (False) не были пройдены |
XC | Условия (Condition)не были выполнены |
XE | Выражения (Expression) не были выполнены |
XB | Ветвь (Branch) не была пройдена |
XS | Оператор (Statement) не был выполнен |
E | Строки, которые исключаются при покрытии кода |
Рассмотрим покрытие выражений на примере оператора назначения сигнала
Y <= a and b and c;
при моделировании на наборе тестов {101, 011, 111}, сигналы a, b, c имеют тип std_logic и являются входными сигналами данного выражения.
Первый набор 101 соответствует значениям a=1, b=0, c=1; для набора 011: a=0, b=1, c=1; для набора 111: a=1, b=0, c=1.
Предполагается, что при моделировании установлен флаг (опция покрытия) Enable Expression coverage.
Полное покрытие выражения
a and b and c
означает, что в процессе моделирования каждый из сигналов a, b, c изменил свое значение из нуля в единицу и из единицы в нуль. Однако на рассматриваемом тесте сигнал c остается неизменным и равным 1. В отчете ниже (так называемой FEC-таблице, FEC – Focused Expression Coverage) выборочно для каждого входного сигнала выражения записываются входные наборы, обеспечивающие переключения данного сигнала в нуль либо в единицу:
# Input Term Covered Reason for no coverage Hint # ----------- -------- ----------------------- ------- # a Y # b Y # c N '_0' not hit Hit '_0' # Rows: Hits FEC Target Matching input patterns # --------- --------- -------------------- ----------- # Row 1: 1 a_0 { 011 } # Row 2: 1 a_1 { 111 } # Row 3: 1 b_0 { 101 } # Row 4: 1 b_1 { 111 } # Row 5: ***0*** c_0 { 110 } # Row 6: 1 c_1 { 111 } # # NOTE: # * Order of matching input pattern values: {a,b,c}
указано, что для сигнала c нет установки в значение 0.
Символ Y (Yes) свидетельствует о покрытии, символ N (No) - о том, что сигнал не покрыт.
Символы '_0' сообщают в этой строке о том, что нет установки (hit) в значение 0.
Заметим, что установка сигнала в единицу соответствует '_1'.
Далее в отчете строки
# Row 1: 1 a_0 { 011 } # Row 2: 1 a_1 { 111 }
сообщают о том, что имеются тестовые векторы для установки сигнала a в нуль и единицу, соответственно. Далее две строки
# Row 3: 1 b_0 { 101 } # Row 4: 1 b_1 { 111 }
указывают такие векторы 101, 111 имеются при моделировании для сигнала b. Следующая строка
# Row 5: ***0*** c_0 { 110 }
показывает, что тестовым вектором для установки сигнала с в нуль мог бы быть вектор 110. Однако такого вектора нет – моделирование осуществляется только для тестовых наборов из множества {101, 011, 111}. Строка
# Row 6: 1 c_1 { 111 }
показывает вектор 111, позволяющий установить сигнал c в единицу.
Покрытие выражения сводится к покрытию всех значений каждого сигнала по отдельности.
Однако при таком покрытии не перебираются все восемь возможных комбинаций значений трех логических сигналов a, b, c.
Условные переходы в VHDL программах осуществляются с помощью операторов if, case. Рассмотрим покрытие ветвей на примерах различных вариантов записи оператора if. Так как оператор if может проверять много условий, то к организации тестирования таких операторов с целью покрытия всех ветвей следует относиться внимательно.
if C1 then Oper1; elsif C2 then Oper2; elsif C3 then Oper3; elsif CN then Oper4; else Oper5; end if;
Приведем пример, показывающий различие покрытия ветвей для оператора if с частью else и частью elsif. Целью является демонстрация того факта, что оператор if с частью else обеспечивает полное покрытие ветвей (branch), а оператор if с частью elsif может не обеспечить полное покрытие ветвей при тех же тестирующих наборах.
1 entity TB_branch_if is 2 end; 3 architecture beh of TB_branch_if is 4 signal x, y : bit; 5 signal A : boolean; 6 begin 7 p0 : process (A) 8 begin 9 if A then -- первый оператор if 10 x <= '1'; 11 else 12 x <= '0'; 13 end if; 14 if A then -- второй оператор if 15 y <= '1'; 16 elsif (not A) then 17 y <= '0'; 18 end if; 19 end process; 20 A <= true , false after 20 ns; 21 end beh;
После проведения моделирования VHDL-кода получаем следующий отчет
By file File: B:/projects/VHDL/Cov_Ex/top.vhd Line: 14 Branch Coverage for: if A Active: 3, True Hits: 1, AllFalse: 0
из которого следует, что для строки 14 ни разу не была пройдена ветвь, когда A равно false. Однако сигналу A в тестирующей программе было присвоено это значение, но ветвь по такому значению сигнала ни разу не была пройдена. Всё потому, что во втором операторе if отсутствует фраза else. Нет фразы else - нет и ветви для альтернативного значения условия (А=false). Этот пример иллюстрирует факт того, что при записи операторов if без частей else нельзя добиться покрытия всех ветвей.