«…лишь недалекие люди боятся конкуренции, а люди подлинного творчества ценят общение с каждым талантом…» А. Бек, Талант.

Проектирование цифровых систем на языках описания аппаратуры/Лекция 10

Материал из Wiki
Перейти к: навигация, поиск
Лекции ПЦСЯОА

Лекции

Практические

Доп. материалы

Заголовок
Верификация VHDL описаний цифровых систем. Покрытие кода (code coverage)
Автор
Ланкевич Ю.Ю.
Нижний колонтитул
Проектирование цифровых систем на языках описания аппаратуры/Лекция 10
Дополнительный нижний колонтитул
Ланкевич Ю.Ю., 00:29, 19 октября 2020


Содержание

Слайд:Актуальные проблемы верификации

Объект верификации (ОВ) часто называют DUT (Design Under Test).

Актуальные проблемы верификации:

  • размер объекта верификации постоянно растет. Большие ИМС — это комплексы, в которых может насчитываться до десятков миллиардов транзисторов, схема управления электропитанием по сложности может превосходить некоторые процессоры;
  • высокая цена ошибки (от десятков тысяч долларов до десятков миллионов долларов);
  • невозможно составить спецификацию на ИМС в начале проекта и в дальнейшем только следовать ей, она постоянно изменяется на протяжении всего процесса разработки (заказчик изменяет требования, технические проблемы или обнаружение более оптимальных решений вынуждают пересматривать подходы и т.д.). Исходя из этого, все процессы должны в динамике воспринимать изменения спецификации и модифицироваться в соответствии с требованиями;
  • количества отдельных тестов и их типов достигает огромного числа, результаты их надо собирать и анализировать;
  • моделирование цифровых систем требует много машинного времени и вычислительных ресурсов;
  • полнота установленных для проекта целевых показатели готовности во многом зависит от компетентности и интуиции специалистов по верификации;
  • несмотря на существование показателей охвата проекта тестами (метрик), единственный способ закончить верификацию — это принять решение о ее приостановке, основываясь в основном на следующих заключениях: деньги или время на этап проекта потрачены, необходимо запускать в производство, вроде как достигли покрытия кода в 100%, тестируем уже неделю и ошибок не обнаружили и т.п.

Слайд:Типы верификации

  • Функциональная верификация (Functional Verification) – проверка всех функциональных параметров и характеристик СБИС на логическом уровне. Если моделирование не дает корректных результатов, то этап логического проектирования (исправление ошибок проектирования) повторяется до достижения успеха. Функциональная верификация в объеме всех работ наиболее значительна и требует непосредственного участия человека.
  • Формальная верификация (Formal Verification) - устанавливается эквивалентность представлений системы на разных стадиях маршрута проектирования или выполнение утверждений, помещенных в исходный код; инструменты формальной верификации часто тоже весьма самостоятельны, требует только внимательного анализа отчетов, которые они генерируют.
  • Cтатический анализ кода (static code analysis) — проверка исходного кода по формальным критериям на соблюдения правил использования языка и его конструкций. Программы для такой проверки обычно обозначаются как lint или linter; требуют только первоначальной настройки инструментов, которая соответствует внутренним правилам проектирования, принятым в компании, дальше данный инструмент можно использовать без дополнительных трудозатрат.
  • Прототипирование — использование FPGA для функциональной проверки.
  • Физическая верификация — в основном подразумевается DRC, LVS, PERC и пр. проверки, физическое представление системы проверяется на соблюдение технологических норм и соответствия физического и логического представлений и т.д. Состав проверок сильно зависит от технологии. Обычно физическая верификация проводится инженером или командой топологического проектирования

Слайд:Методы функциональной верификации

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) или специальные проверки (checkers) во всех важных точках исходного кода DUT и тестового окружения;
  • разработать генераторы случайных воздействий и сценарии их работы, т.е. воздействия случайны, но имеют ограничения диапазона (все перебрать не успеем), порядок подачи и т.п..

Assertion Based Verification (ABV)
Верификация с помощью утверждений. Наверное, это даже не самостоятельный метод, а некоторый компонент или базовая составляющая вышеупомянутых. Важным вопросом при ABV является как распределить assertions, какие из них лучше поместить в исходные код DUT, какие нужно иметь в тестовом окружении.

Слайд:Типы метрик функциональной верификации

Метрики — это показатели охвата проекта тестами. Они нужны для того, чтобы понять какие еще тесты необходимо разработать для проверки возможных ситуаций и сколько предположительно времени может занять верификация. К сожалению, только один тип метрик оценивается на основании исходного кода проекта, определение критериев для остальных типов — это результат интеллектуального труда. К тому же, необходимо помнить, что достижение желаемых показателей одним типом метрик никак не говорит о работоспособности в целом, всегда необходимо оценивать комплекс.

Типы метрик:

  • функциональное покрытие. Показывает на сколько полно проверены функции устройства. Критерии данного покрытия могут определяться планом тестирования и внедрением специальных конструкций (covergroup) в тестовое окружение и/или в объект верификации, отслеживающих выполнялась или нет та или иная функция/действие, изменялись ли определенным образом данные и т.п. Информация от конструкций, внедренных в исходный код, может быть автоматически собрана средствами САПР.
  • покрытие кода — изменение состояния конструкций исходного кода в ходе тестов. Собирается автоматически средствами САПР, не требует внесения каких-либо конструкций в исходный код. Например:
    • переключение регистров/сигналов (Toggle Coverage);
    • активность каждой строки кода (Line Coverage);
    • активность выражений (Statement Coverage), по сути — это Line Coverage, но может отслеживать выражения которые больше, чем одна строка в редакторе;
    • активность участка кода внутри условного оператора или процедуры (Block Coverage), разновидность Statement Coverage;
    • активность всех веток условных операторов таких как if, case, while, repeat, forever, for, loop (Branch Coverage);
    • изменение всех состояний(true, false) составляющих логических выражений (Expression Coverage);
    • состояния конечного автомата (Finite-State Machine (FSM) Coverage).
  • покрытие утверждений (assertions). Утверждения — это специальные языковые конструкции, которые отслеживают различные события и последовательности, и по заданным критериям определяют правомерность их возникновения.

Слайд:Режим покрытия VHDL-кода в ModleSim

В системе ModelSim при моделировании можно задать следующие опции покрытия кода.

  • Enable Statement coverage – покрытие операторов.
  • Enable Branch coverage – подсчитывается число выполнений условий типа «if/then/else» и «case».
  • Enable Condition coverage – анализируется выборы, сделанные в условиях "if" и "case"; данная опция является расширением Branch coverage.
  • Enable Expression coverage – покрытие выражений в правой части оператора назначения сигнала.
  • Enable 0/1 Toggle coverage – покрытие переходов логического сигнала из одного состояния в другое; учитываются только переходы из 0 в 1 и обратно.
  • Enable State Machine coverage – в VHDL-коде выделяется описание конечного автомата, подсчитываются покрытые переходы между внутренними состояниями, в которые попадает автомат.

Слайд:Режим покрытия кода в ModelSim

Опиции покрытия кода в ModelSim

Установка опций компиляции для покрытия кода: по правой клавиши мыши открыть окно Compile Properties и установить флаги для выбранных видов покрытия

Слайд:Установка опций покрытия кода перед моделированием и выполнение моделирования в ModelSim

Start of gathering coverage in Modelsim.png

В закладке Simulation выбираем раздел Start Simulation, затем в закладке Others устанавливаем флаг Enable Code Coverage.

Слайд:Анализ покрытия кода в ModelSim

Чтобы увидеть, какие строки кода конкретного модуля отмечены как покрытые (непокрытые), требуется открыть текст этого модуля.
Отчет о покрытии строки можно получить, выполнив View -->Coverage --> Details.
Результирующие отметки о покрытии кода

Знак Cмысл
Все операторы, ветви, условия или выражения на строке кода были выполнены
X Различные виды покрытия на строке кода не были выполнены
XT Ветви по значению истина (True) не были выполнены (пройдены)
XF Ветви по значению ложь (False) не были пройдены
XC Условия (Condition)не были выполнены
XE Выражения (Expression) не были выполнены
XB Ветвь (Branch) не была пройдена
XS Оператор (Statement) не был выполнен
E Строки, которые исключаются при покрытии кода

Слайд:Анализ покрытия кода/ Покрытие выражений (expression coverage)

Рассмотрим покрытие выражений на примере оператора назначения сигнала

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.

Слайд:Анализ покрытия кода/ Покрытие выражений (expression coverage)

# c N '_0' not hit Hit '_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.

Слайд:Анализ покрытия кода/ Покрытие ветвей (branch coverage)

Условные переходы в 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 может не обеспечить полное покрытие ветвей при тех же тестирующих наборах.

Слайд:Анализ покрытия кода/ Покрытие ветвей (branch coverage)

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;

Слайд:Анализ покрытия кода/ Покрытие ветвей (branch coverage)

После проведения моделирования 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 нельзя добиться покрытия всех ветвей.