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

Спец курс (Избранные главы VHDL)/Верификация описания — различия между версиями

Материал из Wiki
Перейти к: навигация, поиск
(Слайд:Модель параллельной обработки)
 
(не показаны 57 промежуточных версий 6 участников)
Строка 1: Строка 1:
 +
{{ИГСАПР_TOC}}
 
<slideshow style="custis" headingmark="Слайд:" incmark=":step" scaled="true" >
 
<slideshow style="custis" headingmark="Слайд:" incmark=":step" scaled="true" >
 
;title: '''Верификация описания.'''
 
;title: '''Верификация описания.'''
Строка 4: Строка 5:
 
</slideshow>
 
</slideshow>
  
[[Файл:SystemC_From_the_ground_up.mm]]
+
{| align=center width=800px
 +
![[Файл:Функциональная_верификация.mm]]
 +
|}
 +
 
 +
 
 +
==Слайд:Методы верификации проекта==
 +
* {{Сн|'''<big>Имитационная верификация</big>'''}} - верификация с использованием моделирования
 +
* {{Сн|'''<big>Формальная верификация</big>'''}} -проверка модели с целью доказательства ее корректности и эквивалентности спецификации
 +
(Пример: пакет FormulPro ф. MentorGraphics, пакеты фирмы Verplex, www.verplex.com)
 +
 
  
 
==Слайд:Верификация описания==
 
==Слайд:Верификация описания==
Строка 10: Строка 20:
  
 
==Слайд:Верификация описания:step==
 
==Слайд:Верификация описания:step==
*{{Гол|''' <big>Среда моделирования</big>'''}}
+
* {{Гол|''' <big>Среда моделирования</big>'''}}
 
** Active-HDL™
 
** Active-HDL™
 
** Riviera-PRO™
 
** Riviera-PRO™
Строка 24: Строка 34:
 
** Отчеты и базы по результатам моделирования
 
** Отчеты и базы по результатам моделирования
  
==Слайд:Эталонная модель на языке ''{{Зел| <big>SystemC</big>}}''==
 
 
# Высокий уровень абстракции
 
# Скорость моделирования
 
# Возможности языка C++
 
# Инструменты для автоматизации
 
# Совместное моделирование с другими HDL-языками
 
 
== Основы языка SystemC ==
 
 
===Слайд:Типы данных (Форматы и способ представления данных) ===
 
[[Файл:Типы_данных.png]]
 
 
===Слайд:Типы данных (native)===
 
<source lang="cpp">                // Пример типа данных C++
 
int spark_offset;
 
unsigned repairs = 0 ;            // Count repair
 
unsigned long mileage;            // Miles driven
 
short int speedometer;            // -20.. 0.. 100 MPH
 
float temperature;                // Engine temp in C
 
double time_of_last_request;      //Time of bus
 
std:: string license_plate;      // Text for license
 
const bool WARNING_LIGHT = true;  // Status
 
enum compass {SW,W,NW,N,NE,E, SE, S} ;
 
</source>
 
 
===Слайд:Типы данных (Arithmetic)===
 
<source lang="cpp">                // Пример целочисленных типов данных C++
 
sc_int<LENGTH> NAME...;
 
sc_uint<LENGTH> NAME...;
 
sc_bigint<BITWIDTH> NAME...;
 
sc_biguint<BITWIDTH> NAME...;
 
// SystemC integer data types
 
sc_int<5> seat_position=3; //5 bits: 4 plus sign
 
sc_uint<13> days_SLOC(4000); //13 bits: no sign
 
sc_biguint<80> revs_SLOC; // 80 bits: no sign
 
</source>
 
 
===Слайд:Типы данных (Boolean)===
 
<source lang="cpp">                // Пример типа данных SystemC
 
sc_bit NAME...;
 
sc_bv<BITWIDTH> NAME...;
 
</source>
 
 
* sc_bit и sc_bv могут принимать значения: '''SC_LOGIC_1''' и '''SC_LOGIC_0.'''
 
* Для сокращения типов, можно использовать '''Log_1 и Log_0''' или '''‘1’ и ‘0’.'''
 
* Над этим типом данных возможно выполнение битовых операций '''and, or, xor (&,|, ^).'''
 
* Для обращения к отдельным битам и массивам '''[], range()'''.
 
 
<source lang="cpp">
 
sc_bit flag(SC_LOGIC_1); // more efficient to use bool
 
sc_bv<5> positions = "01101";
 
sc_bv<6> mask = "100111";
 
sc_bv<5> active = positions & mask;// 00101
 
sc_bv<1> all = active. and_reduce (); // SC_LOGIC_0
 
positions. range (3,2) = "00"; // 00001
 
positions [2] = active[0] ^ flag;
 
</source>
 
 
===Слайд:Типы данных (Несколько значений )===
 
<source lang="cpp">                // Пример типа данных SystemC
 
sc_logic NAME[,NAME]...;
 
sc_lv<BITNIDTH> NAME[,NAME ]...;
 
sc_logic buf(sc_dt::Log_Z);
 
sc_lv<8> data_drive ("zz01XZ1Z");
 
data_drive.range (5,4) = "ZZ";// ZZZZXZ1Z
 
buf = '1';
 
 
</source>
 
  
===Слайд:Операторы SystemC ===
+
== Слайд:Средства верификации ==
[[Файл:Операции.png]]
+
  
===Слайд:Главный модуль MAIN===
+
* {{Сн|'''Прямые тесты'''}} (Directed tests)
{{Гол|'''<big>Описание на языке C++</big>'''}}
+
* {{Сн|'''Псевдослучайные тесты'''}} (Random tests)
<source lang="cpp">
+
* {{Сн|'''Управляемые псевдослучайные тесты'''}} (Constrained Random tests)
int main(int argc, char* argv[]) {
+
* {{Сн|'''Верификация управляемая покрытием'''}} (на основе покрытия) (Coverage driven verification)
BODY_OF_PROGRAM
+
** {{Гол|'''''Покрытие кода'''''}} (Code coverage)
return EXIT_CODE; //
+
** {{Гол|'''''Функциональное покрытие'''''}} (Functional coverage )
}
+
* {{Сн|'''Верификация на основе утверждений'''}} (Assertion based verification)
</source>
+
* {{Сн|'''Эмуляция'''}} (Emulation)
 +
* {{Сн|'''Формальная верификация'''}} (Formal verification)
  
{{Гол|'''<big>Описание на языке SystemC</big>'''}}
+
==Слайд: Типы тестов ФК==
<source lang="cpp">
+
На что проверяем:
int sc_main(int argc, char* argv[]) {
+
* {{Гол|'''<big>Детерминистский</big>'''}} - Проверяет обычные режимы работы системы, а также функционирование в граничных условиях на основе фиксированного набора тестов
//ELABORATION
+
* {{Гол|'''<big>Случайный</big>'''}} - Предполагает наличие генератора случайных входных воздействий
sc_start(); // <-- Simulation begins & ends
+
* {{Гол|'''<big>Транзакционный</big>'''}} - Фиксирует внимание на проверке интерфейсов и прохождению пакетов данных через них
            // in this function!
+
//[POST-PROCESSING]
+
return EXIT_CODE; //
+
}
+
</source>
+
  
===Слайд: Модуль ===
+
Способ проведения проверки:
<source lang="cpp">
+
* {{Сн|'''<big>"Черный ящик"</big>'''}}   
#include <systemc.h>
+
* {{Сн|'''<big>"Серый ящик"</big>'''}}
SC_MODULE(module_name) {
+
* {{Сн|'''<big>"Прозрачный ящик"</big>'''}}
MODULE_BODY
+
};</source>
+
Содержит:
+
* '''{{Фио|<big>Порты</big>}}'''
+
* '''{{Фио|<big>Каналы связи</big>}}'''
+
* '''{{Фио|<big>Объявления переменных для хранения данных</big>}}'''
+
* '''{{Фио|<big>Другие модули с большей вложенностью</big>}}'''
+
* '''{{Фио|<big>Конструктор</big>}}'''
+
* '''{{Фио|<big>Деструктор</big>}}'''
+
* '''{{Фио|<big>Функции -процессы</big>}}'''
+
* '''{{Фио|<big>Вспомогательные функции</big>}}'''
+
  
===Слайд: Конструктор (SC_CTOR)===
+
== Слайд:Что такое покрытие (Coverage)? ==
<source lang="cpp">SC_CTOR(module_name)
+
: Initialization // OPTIONAL
+
{
+
Subdesign_Allocation
+
Subdesign_Connectivity
+
Process_Registration
+
Miscellaneous_Setup
+
}</source>
+
  
* '''{{Фио|<big>Объявление под модулей</big>}}'''
+
* {{Зел|'''Покрытие'''}} является крайне {{Кр|'''неоднозначным термином'''}}, когда используется сам по себе.
* '''{{Фио|<big>Подключение и соединение с подмодулями</big>}}'''
+
* '''{{Фио|<big>Регистрация процессов на SystemC</big>}}'''
+
* '''{{Фио|<big>Обеспечение постоянной чувствительности</big>}}'''
+
* '''{{Фио|<big>Разнообразные пользовательские объявления</big>}}''
+
  
===Слайд: Конструктор (SC_HAS_PROCESS)===
+
{{Info |'''Покрытие  в электронике''' ('''''Coverage''''') является одной из разновидностей метрик проекта, которая сообщает, если определённые аспекты проекта были правильно выполнены во время процедуры тестирования.}}
<source lang="cpp">
+
//FILE: module_name.h
+
SC_MODULE(module_name) {
+
SC_HAS_PROCESS(module_name);
+
module_name(sc_module_name instname[, other_args…])
+
: sc_module(instname)
+
[, other_initializers]
+
{
+
CONSTRUCTOR_BODY
+
}
+
};</source>
+
  
* '''{{Фио|<big>Все возможности конструктора SC_CTOR</big>}}'''
+
* Обычно уточняют термин покрытия, говоря какой аспект был протестирован:
* '''{{Фио|<big>Альтернативный метод создания модуля</big>}}'''
+
** '''Тестирование качества кода''' — покрытие кода (code coverage)
* '''{{Фио|<big>Позволяет создавать конструктор с аргументами(+ к имени модуля)</big>}}'''
+
** '''Проверка свойств/утверждений''' — покрытие свойств/утверждений (property coverage)
* '''{{Фио|<big>Используется, если желаете расположить конструктор в файле описания .cpp (не в файле .h)</big>}}'''
+
** '''Сбор значений переменных проекта''' — функциональное покрытие (functional coverage).
  
===Слайд: Процесс SC_THREAD ===
+
== Слайд:Покрытие кода vs. функциональное покрытие==
  
<source lang="cpp">
+
[[Файл:Code quality-vs-functionality.png|center|400px]]
SC_MODULE(simple_process_ex) {
+
  SC_CTOR(simple_process_ex) {
+
      SC_THREAD(my_thread_process);
+
  }
+
  void my_thread_process(void);
+
};</source>
+
  
{{Зел|'''SC_THREAD'''}} в '''SystemC''':
+
==Слайд: Полнота покрытия ==
# аналог {{Зел|'''initial block'''}} в '''Verilog'''
+
# {{Зел|'''process'''}} без списка чувствительности с оператором '''wait()''' в '''VHDL'''.
+
  
===Слайд:Введение времени===
+
* {{X|24px}}В реальных условия обычно полный перебор {{Кр|'''<big>невозможен</big>'''}}
 +
* {{V|24px}}Поэтому поступают следующим образом. Например для сумматора:
 +
# Тестируют как {{Фио|'''"Серый ящик"'''}} и проверяют простейшие случаи 0+0, 0+1, FFFF+FFFF, 0+FFFF
 +
# Затем целенаправленно проверяют граничные условия - переполнение, перенос
 +
# Затем тестирую как {{Фио|'''"Черный ящик"'''}} на случайном наборе тестов
 +
# Оценивают полноту проверки модели
  
{{Ор|<big>'''Единицы измерения времени'''</big>}}
+
==Слайд: Метрики оценки полноты тестов==
 +
{{ЖЛампа|24px}}'''Необходимое условие''' : Управляемость (выполняется строка или переход)
  
<source lang="cpp">
+
{{ЖЛампа|24px}}'''Достаточное условие''' : Наблюдаемость (результат исполнения влияет на выход сравниваемый с эталоном)
SC_SEC // seconds
+
SC_MS  // milliseconds
+
SC_US  // microseconds
+
SC_NS  // nanoseconds
+
SC_PS  // picoseconds
+
SC_FS  // femtoseconds
+
</source>
+
{{Ор|<big>'''Объявление переменной типа '''</big>}}{{Зел|<big>'''sc_time'''</big>}}
+
<source lang="cpp">
+
sc_time t_PERIOD(5, SC_NS) ;
+
sc_time t_TIMEOUT (100, SC_MS) ;
+
sc_time t_MEASURE, t_CURRENT, t_LAST_CLOCK;
+
t_MEASURE = (t_CURRENT-t_LAST_CLOCK) ;
+
if (t_MEASURE > t_HOLD) { error ("Setup violated") }
+
</source>
+
  
 +
* {{Сн|'''<big>Эвристические метрики </big>'''}} - основанные на статистике появления ошибок
 +
* {{Сн|'''<big>Программные метрики </big>'''}}
 +
* {{Сн|'''<big>Автоматно-метрический подход </big>'''}}(лучший вариант использовать формальную верификацию для автоматов)
 +
* {{Сн|'''<big>Моделирование неисправностей </big>'''}}(в модель вносится неисправность)
 +
* {{Сн|'''<big>Мониторинг событий</big>'''}}
  
===Слайд:Запуск выполнения '''sc_start()'''===
+
==Слайд: Эвристические метрики ==
  
{{Ор|<big>'''Функция запускающая выполнения главного процесса '''</big>}}
+
* Календарное время между моментами обнаружения ошибок проекта (к концу процесса верификации оно увеличивается);
 +
* Общее количество промоделированных тактов работы проектируемого устройства;
 +
* Общее число обнаруженных ошибок в проекте и т.д.
 +
* Число обнаруженных ошибок в день, неделю, месяц
  
{{Сн|'''Пример запуска моделирования на 60 секунд модельного времени'''}}
+
==Слайд: Программные метрики ==
 +
* '''Полнота покрытия тестом строк кода модели'''
 +
* '''Полнота покрытия переходов''' (число пополнений ветвей оператора if и case )
 +
* '''Полнота покрытия путей ''(Branch coverage)''''' (все пути в графе программы)
 +
* '''Полнота покрытия выражений ''(Expression coverage)''''' (оценка числа вычислений выражения по различных наборах)
 +
* '''Полнота переключений из 0 в 1 и из 1 в 0 каждого бита ''(Toggle coverage)'''''
  
<source lang="cpp">
+
== Слайд: Метрики в ModelSim ==
int sc_main(int argc, char* argv[]) { // args unused
+
simple_process_ex my_instance ("my_instance");
+
sc_start(60.0,SC_SEC); // Limit sim to one minute
+
return 0 ;
+
}</source>
+
  
===Слайд:Контроль текущего времени моделирования '''sc_time_stamp ()'''===
+
<slides split="-----" width="600" >
 +
{{V|24px}} В '''ModelSim''' для учета метрик покрытия при компиляции проекта нужно задать в меню '''Compile->Compiler option''' опции покрытия
 +
[[Файл:Опции компиляции покрытия.jpg|center]]
  
<source lang="cpp">
+
</slides>
std::cout << " The time is now "
+
<< sc_time_stamp()
+
<< "!" << std::endl;</source>
+
  
После запуска моделирования в консоли получим
+
== Слайд: Виды покрытия кода в ModelSim ==
The time is now 0 ns! 
+
  
 +
* {{Сн|'''Statement coverage'''}} — покрытие состояний
  
===Слайд: Остановка выполнения моделирования wait(sc_time)===
+
* {{Сн|'''Branch coverage'''}} — покрытие ветвлений
  
 +
* {{Сн|'''Condition coverage'''}} — покрытие условий
  
{{Ор|<big>'''Функция останавливающая выполнение процесса до заданного времени или до прихода события'''</big>}}
+
* {{Сн|'''Expression coverage'''}} — покрытие выражений
  
<source lang="cpp">
+
* {{Сн|'''Toggle coverage'''}} — покрытие принимаемых значений
void simple_process_ex::my_thread_process (void) {
+
wait (10,SC_NS);
+
std::cout<< "Now at "<< sc_time_stamp() << std::endl;
+
sc_time t_DELAY(2,SC_MS); // keyboard debounce time
+
t_DELAY *= 2;
+
std::cout<< "Delaying "<< t_DELAY<< std::endl;
+
wait(t_DELAY);
+
std::cout << "Now at " << sc_time_stamp()
+
<< std::endl;
+
}</source>
+
  
% . /run_example
+
* {{Сн|'''FSM coverage'''}} — покрытие состояний автомата
Now at 10 ns
+
Delaying 4 ms
+
Now at 4000010 ns
+
  
===Слайд:События '''sc_event'''===
+
== Слайд: Мониторинг покрытия кода в ModelSim ==
  
[[Файл:Процес_моделирования_по_событиям.png]]
+
<slides split="-----" width="400" >
 +
[[Файл:Отметки_о_покрытие_строк_кода.jpg]]
 +
-----
 +
[[Файл:Отчет_по_покрытию.jpg]]
 +
-----
 +
[[Файл:Отчет_по_покрытию_2.jpg]]
 +
-----
 +
[[Файл:Детали_по_оттчеты_по_покрытию_кода.jpg]]
 +
</slides>
  
===Слайд:События '''SC_THREAD::wait()'''===
+
==Слайд: Команды ModelSim для работы с покрытием ==
Процесс '''SC_THREAD''' процес выполняющийся {{Кр|'''<big>один раз!!</big>'''}}, для управления работой такого процесса используют функцию задержки выполнения wait
+
  
<source lang="cpp">wait(time);
+
{{Сн|<big>'''Команда для компиляции'''</big>}}
wait(event);
+
wait(event1 | event2) // до прихода любого из событий
+
wait(event1 & event2) // до прихода всех событий вместе
+
wait(timeout, event); // до прихода события ожидает в течении времени
+
wait ( timeout, event1 | event2 )
+
wait ( timeout, event1 & event2 )
+
wait(); // ожидание дельта цикла выполнения, статическая задержка
+
</source>
+
===Слайд:Запуск события (установка,назначение)===
+
  
Для запуска события используется атрибут {{Зел|<big>'''.notify()'''</big>}}
+
vcom +{{Зел|'''cover'''}}={{Гол|'''bcsxf'''}} -work $wlibname $name
  
Он выполняет запуск событий,  отсчет времени идет от запуска моделирования. Для сброса точки отсчета используют {{Зел|<big>'''.cancel()'''</big>}}
+
Ключевое слово {{Зел|'''+cover'''}} и после него строка из букв каждая из которых значит следующее:
  
<source lang="cpp">sc_event action;
+
# '''b''' - покрытие ветвлений
sc_time now(sc_time_stamp()); //вытягиваем текущее время моделирования
+
# '''c''' - покрытие условий
//стартуем событие немедленно
+
# '''s''' - покрытие состояний
action.notify();
+
# '''x''' - покрытие принимаемых битами значений ( 0\1\Z )
//следующее событие через 20 ms от текущего момента
+
# '''t''' - покрытие принимаемых битами значений ( 0\1 )
action.notify(20, SC_MS);
+
# '''f''' - покрытие состояний конечного автомата
//переопределим событие на время 1.5 ns от текущего момента
+
action.notify(1.5,SC_NS);
+
//продублируем событие (не имеет эффекта)
+
action.notify(1.5, SC_NS);
+
//зададим событие от предыдущего на 1.5 ns
+
action.notify(3.0,SC_NS);
+
//запустим дельта цикл (не имеет эффекта)
+
action.notify(SC_ZERO_TIME);
+
//сбросим время задания события
+
action.cancel();
+
//зададим событие на 20 fs после сброса
+
action.notify(20,SC_FS);</source>
+
  
===Слайд:Процесс со списком чувствительности SC_METHOD ===
+
==Слайд: Команды ModelSim для работы с покрытием ==
{{ЖЛампа|24px}}Аналог '''process''' в '''VHDL'''
+
<slides split="-----" width="600" >
 +
[[Файл:Запуск_моделирования.jpg]]
 +
</slides>
  
<source lang="cpp">SC_METHOD(process_name);</source>
+
==Слайд: Команды ModelSim для работы с покрытием ==
  
{{ЖЛампа|24px}}Список чуствительности задаеться после ключевого слова {{Зел|'''sensitive'''}}
+
{{ЖЛампа|24px}}{{Сн|<big>'''Для запуска моделирования с покрытием нужно включить следующие опции:'''</big>}}  
  
<source lang="cpp"> sensitive << event [<< event] ;// поточный стил
+
  '''Simulate->Start Simulation''' на закладке other поставить птичку '''enable code coverage'''
  sensitive (event [, event] ); // стиль с использованием функции</source>
+
  
 +
{{Сн|<big>'''Команда для запуска'''</big>}}
  
===Слайд:dont_initialize() ===
+
'''vsim -coverage'''
{{ЖЛампа|24px}} Отменяет начальную установку значений
+
* После запуска моделирования конструктор создает модуль и инициализирует все процессы и переменные.
+
  
* Это заставляет выполниться всем методам работающим по событию по одному разу во время запуска если событие устанавливалось в значение.
+
{{ЖЛампа|24px}}{{Сн|<big>'''Для того чтобы база данных с информацие по покрытию сохранялась в файл после завершения моделирования, нужно выполнить след команду:'''</big>}}
  
* Для исключения начального выполнения используется функция '''dont_initialize()'''
+
'''coverage save -onexit'''
  
===Слайд: Стек событий '''sc_event_queue'''===
+
==Слайд: Верификация на основе утверждений ==
 +
<big>'''Позволяет контролировать'''</big>:
  
{{ЖЛампа|24px}}  Событие можно задать не только от начального момента времени, а и от текущего.
+
* {{Сн|'''Булева логика'''}} (Boolean logic) - тестирует основные утверждения (statements) о проекте.
 +
* {{Сн|'''Временная логика'''}} (Temporal logic) - добавляет временное измерение (dimension) в булеву логику (Boolean logic) и тестирует отсутствие (absence), наличие (presence), неизменность/повторяемость (persistence), последовательность (sequence), и прочее определённых событий.
 +
* {{Сн|'''Свойства/утверждения'''}} (Property) - это формальное описание поведения проекта, взятое из спецификации проекта и выраженное в терминах временной логики (temporal logic).
 +
Могут быть выражены с помощью PSL (Property Specification Language – теперь включен в VHDL) или с помощью SVA (подмножество SystemVerilog Assertions – работает с VHDL через модули проверок (checker modules)).
 +
* {{Сн|'''Последовательности'''}} (Sequences) являются простейшей формой свойств/утверждений, представляющие последовательность событий/состояний.\
  
Для этого используется функция '''sc_event_queue()'''
+
{{ЖЛампа|24px}} Assertions – работает с VHDL через модули проверок (checker modules)).
  
<source lang="cpp">
+
==Слайд:  Пример верификации на основе утверждений ==
sc_event_queue action;
+
* Можно вставлять PSL код в '''специальные комментарии''' в VHDL; таким образом, этот код не будет оказывать влияния на синтез и похожие программы.  
sc_time now(sc_time_stamp());
+
* Можно задать  '''последовательности (sequences)''' для представления разных фаз задаваемого свойства.  
action.notify(20, SC_MS);
+
* Конечное описания '''свойства (property)''' объединяет эти последовательности.  
action.notify(1.5,SC_NS);
+
* Помеченная меткой '''директива cover''' показывает симулятору, как проверять это свойство.  
action.notify(1.5,SC_NS);
+
action.notify(3.0,SC_NS);
+
action.notify(SC_ZERO_TIME);
+
action.notify(1,SC_SEC);
+
action.cancel_all();
+
</source>
+
  
===Слайд:Совместное использование ресурсов===
+
--@clk  rising_edge(CLK);
 +
--@psl  sequence ack35_s is { rose(ACK) : (ACK='1')[*3 to 5] } ;
 +
--@psl  sequence dvalid24_s is { rose(DVALID) : (DVALID='1')[*2 to 4] } ;
 +
--@psl  sequence dvalid2inf_s is { fell(ACK) : (DVALID='1')[*2 to inf] } ;
 +
--@psl  property ackdvalid_p is { ack35_s ; dvalid24_s ; dvalid2inf_s } ;
 +
--@psl  ackdvalid_c: cover(ackdvalid_p) report "Sequence ACK/DVALID covered!";
  
* При совместном использовании ресурсов, шин, памяти нужно разграничить область полномочий каждого процесса.
+
==Слайд: Запуск моделирования в ModelSim с верификацией на основе утверждений ==
* Иначе при одновременной, к примеру записи будет происходить сбой или некорректная запись.
+
Если управлением доступом к одному ресурсу
+
<source lang="cpp">sc_mutex NAME;
+
// блокируем mutex NAME (ждем пока разблокируется)
+
NAME.lock();
+
// Возвращает статус состояния блокировки
+
NAME.try lock()
+
// Снимает блокировку
+
NAME.unlock();</source>
+
  
Если управлением доступом к нескольким ресурсам
+
{{Сн|'''Для компиляции проекта содержащего файл верификации утверждений выполняем команду:'''}}
  
<source lang="cpp">sc_semaphore NAME(COUNT);
+
'''vcom''' -93 DIGITAL_BLOCK.vhd '''-pslfile''' DIGITAL_PSL.psl
// блокируем mutex NAME (ждем пока разблокируеться)
+
NAME.wait();
+
// Возвращает статус состояния блокировки
+
NAME.trywait()
+
//Возвращает число свободных ресурсов
+
NAME.get_value()
+
// Снимает блокировку
+
NAME.post();</source>
+
  
 +
После параметра '''-pslfile'''e указываем имя или путь к файлу
  
===Слайд:Иерархия и структура проекта===
+
{{Сн|'''Для запуска моделирования проекта содержащего файл верификации утверждений выполняем команду:'''}}
[[Файл:Иерархия.png]]
+
 +
'''vsim''' '''''имя_проекта'''''
  
===Слайд:Иерархия и структура проекта===
+
Для отключения выполнения проверок используем параметр '''-nopsl'''
  
{{ЖЛампа|24px}}Подключение и создание {{Зел|<big>'''модуля'''</big>}} внутри '''главного''' модуля аналогично созданию {{Зел|<big>'''объекта'''</big>}} заданного{{Зел| <big>'''класса'''</big>}}
+
'''vsim''' '''''имя проекта''''' '''-nopsl'''  
  
* Статический метод
 
<source lang="cpp">//FILE: main.cpp
 
#include "Wheel.h"
 
int sc_main(int argc, char* argv[]) {
 
Wheel wheel_FL("wheel_FL");
 
Wheel wheel_FR("wheel_FR");
 
sc_start();
 
}</source>
 
  
* Динамический метод
+
==Слайд: Быстродействие и расход памяти ==
<source lang="cpp">//FILE: main.cpp
+
#include "Wheel.h"
+
int sc_main(int argc, char* argv[]) {
+
Wheel* wheel_FL; // pointer to FL wheel
+
Wheel* wheel_FR; // pointer to FR wheel
+
wheel_FL = new Wheel ("wheel_FL"); // create FL
+
wheel_FR = new Wheel ("wheel_FR"); // create FR
+
sc_start();
+
delete wheel_FL;
+
delete wheel_FR;
+
}</source>
+
  
 +
Кроме полноты тестирования, одной из важных характеристик тестирующей программы являются:
  
===Слайд:Иерархия и структура проекта===
+
* {{Зел|<big>'''Требуемая память'''</big>}}
 +
* {{Зел|<big>'''Расход машинного времени'''</big>}}
  
{{ЖЛампа|24px}}Подключение и создание {{Зел|<big>'''модуля'''</big>}} внутри другого модуля аналогично созданию {{Зел|<big>'''объекта'''</big>}} заданного{{Зел| <big>'''класса'''</big>}}, внутри другого класса. Поэтому объявления производиться в конструкторе верхнего модуля
+
==Слайд: Требуемая память==
  
* Статический метод
+
* Зависит от числа данных в программе
<source lang="cpp">//FILE:Body.h
+
* Их размера (размерности)
#include "Wheel.h"
+
* От количества и сложности операторов
SC_MODULE(Body) {
+
Wheel wheel_FL;
+
Wheel wheel_FR;
+
SC_CTOR(Body)
+
: wheel_FL("wheel_FL"), //initialization
+
wheel_FR("wheel_FR") //initialization
+
{
+
// other initialization
+
}
+
};
+
}</source>
+
  
* Динамический метод
+
Пример:  
<source lang="cpp">//FILE:Body.h
+
#include "Wheel.h"
+
SC_MODULE(Body) {
+
Wheel* wheel_FL;
+
Wheel* wheel_FR;
+
SC_CTOR(Body) {
+
wheel_FL = new Wheel("wheel_FL");
+
wheel_FR = new Wheel("wheel_FR");
+
// other initialization
+
}
+
};
+
}</source>
+
  
 +
{{ЖЛампа|24px}}Данные типа {{Кр|'''signal'''}} в VHDL занимают {{Кр|'''на порядок!! больше'''}} места, чем {{Зел|'''variable'''}}, поэтому массивы данных большого объема в тестирующих модулях лучше объявлять с использованием '''variable'''.
  
===Слайд:Порты - точки подачи и снятия внешних воздействий===
+
{{ЖЛампа|24px}}Verilog расходует {{Кр|'''обычно'''}} в 4 раза меньше памяти на хранение одного бита данных, чем VHDL.
[[Файл:Порты_соединение_модулей.png]]
+
  
===Слайд:Порты - точки подачи и снятия внешних воздействий===
+
==Слайд: Сокращение расхода машинного времени==
  
* {{Сн|'''sc_port'''}}
+
# '''Профилирование''' - эффективня организация тестирующей программы
* {{Сн|'''sc_in'''}}
+
# Использование '''систем и языков''' предназначенных для '''верификации'''
* {{Сн|'''sc_out'''}}
+
# Выбор более быстрой системы моделирования (вместо интерпретатора '''компилятор''')
* {{Сн|'''sc_export'''}}
+
# Использование более '''мощной ЭВМ'''
 +
# '''Ограничение''' множества '''входных''' наборов '''тестов''' ({{Зел|'''''нет ничего мощнее здравого смысла'''''}})
 +
# Использование '''аппаратных ускорителей''' моделирования (10-100раз)
 +
# Использование '''прототипов''' схем '''для прогонов тестов''' (на этапе отладки тестов)
  
===Слайд:Порты - точки подачи и снятия внешних воздействий===
+
{{ЖЛампа|24px}}{{Зел|'''<big>Пример: </big>'''}}
[[Файл:Порты_соединение_модулей_экспорт.png]]
+
[[Файл:Порты_соединение_модулей_экспорт2.png]]
+
  
===Слайд:Добавление модулей и способы их соединения между собой===
+
{{Зел|'''<big>1. Три отдельных процесса требуют больше времени, чем те же операции объединенные в один процесс.</big>'''}}
===Слайд:Управление процессом и контроль статуса моделирования===
+
  
== Слайд: VHDL и SystemC конструкции ==
+
{{Зел|'''<big>2. Использование языков C,C++,SystemC позволяет не несколько раз снизить расход памяти</big>'''}}
===Слайд: Entity ===
+
===Слайд: Architecture ===
+
===Слайд: Generic ===
+
===Слайд: Process без списка чувствительности ===
+
===Слайд: Process со списком чувствительности ===
+
===Слайд: Работа с файлами ===
+
===Слайд: Работа с переменными ===
+
===Слайд: Работа с сигналами ===
+
===Слайд: Арифметические, логические, операции присваивания ===
+
===Слайд: Конструкции С++ ===
+
===Слайд: Создание модуля ===
+
===Слайд: Коммуникации между модулями ===
+
===Слайд: Управление процессом моделирования (сообщения, запуск останов моделирования)===
+
== Слайд: Компиляция описания ==
+
== Слайд: Запуск моделирования только SystemC описания ==
+
== Слайд: Запуск моделирования SystemC описания и VHDL ==
+

Текущая версия на 13:16, 2 декабря 2013

Лекции ИГСАПР

Лекции

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

Лабораторные

Табель

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

Заголовок
Верификация описания.
Автор
Зайцев В.С.
Нижний колонтитул
Спец курс (Избранные главы VHDL)/Верификация описания
Дополнительный нижний колонтитул
Зайцев В.С., 13:16, 2 декабря 2013



Содержание

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

  • Имитационная верификация - верификация с использованием моделирования
  • Формальная верификация -проверка модели с целью доказательства ее корректности и эквивалентности спецификации
(Пример: пакет FormulPro ф. MentorGraphics, пакеты фирмы Verplex, www.verplex.com)


Слайд:Верификация описания

Процевв верификации.png

Слайд:Верификация описания:step

  • Среда моделирования
    • Active-HDL™
    • Riviera-PRO™
    • NC-Sim®
    • ModelSim®
    • QuestaSim®
    • VCS-MX®
  • Структура проекта
    • Тестовое окружение
    • RTL-модель (Verilog,VHDL)
    • Эталонная модель (SystemC)
    • Assert'ы (psl, OVVM, UVM)
    • Отчеты и базы по результатам моделирования


Слайд:Средства верификации

  • Прямые тесты (Directed tests)
  • Псевдослучайные тесты (Random tests)
  • Управляемые псевдослучайные тесты (Constrained Random tests)
  • Верификация управляемая покрытием (на основе покрытия) (Coverage driven verification)
    • Покрытие кода (Code coverage)
    • Функциональное покрытие (Functional coverage )
  • Верификация на основе утверждений (Assertion based verification)
  • Эмуляция (Emulation)
  • Формальная верификация (Formal verification)

Слайд: Типы тестов ФК

На что проверяем:
  • Детерминистский - Проверяет обычные режимы работы системы, а также функционирование в граничных условиях на основе фиксированного набора тестов
  • Случайный - Предполагает наличие генератора случайных входных воздействий
  • Транзакционный - Фиксирует внимание на проверке интерфейсов и прохождению пакетов данных через них
Способ проведения проверки:
  • "Черный ящик"
  • "Серый ящик"
  • "Прозрачный ящик"

Слайд:Что такое покрытие (Coverage)?

  • Покрытие является крайне неоднозначным термином, когда используется сам по себе.
Информация

Покрытие в электронике (Coverage) является одной из разновидностей метрик проекта, которая сообщает, если определённые аспекты проекта были правильно выполнены во время процедуры тестирования.

  • Обычно уточняют термин покрытия, говоря какой аспект был протестирован:
    • Тестирование качества кода — покрытие кода (code coverage)
    • Проверка свойств/утверждений — покрытие свойств/утверждений (property coverage)
    • Сбор значений переменных проекта — функциональное покрытие (functional coverage).

Слайд:Покрытие кода vs. функциональное покрытие

Code quality-vs-functionality.png

Слайд: Полнота покрытия

  • Nuvola apps error.pngВ реальных условия обычно полный перебор невозможен
  • 200px-Yes check.pngПоэтому поступают следующим образом. Например для сумматора:
  1. Тестируют как "Серый ящик" и проверяют простейшие случаи 0+0, 0+1, FFFF+FFFF, 0+FFFF
  2. Затем целенаправленно проверяют граничные условия - переполнение, перенос
  3. Затем тестирую как "Черный ящик" на случайном наборе тестов
  4. Оценивают полноту проверки модели

Слайд: Метрики оценки полноты тестов

Bombilla amarilla - yellow Edison lamp.pngНеобходимое условие : Управляемость (выполняется строка или переход)

Bombilla amarilla - yellow Edison lamp.pngДостаточное условие : Наблюдаемость (результат исполнения влияет на выход сравниваемый с эталоном)

  • Эвристические метрики - основанные на статистике появления ошибок
  • Программные метрики
  • Автоматно-метрический подход (лучший вариант использовать формальную верификацию для автоматов)
  • Моделирование неисправностей (в модель вносится неисправность)
  • Мониторинг событий

Слайд: Эвристические метрики

  • Календарное время между моментами обнаружения ошибок проекта (к концу процесса верификации оно увеличивается);
  • Общее количество промоделированных тактов работы проектируемого устройства;
  • Общее число обнаруженных ошибок в проекте и т.д.
  • Число обнаруженных ошибок в день, неделю, месяц

Слайд: Программные метрики

  • Полнота покрытия тестом строк кода модели
  • Полнота покрытия переходов (число пополнений ветвей оператора if и case )
  • Полнота покрытия путей (Branch coverage) (все пути в графе программы)
  • Полнота покрытия выражений (Expression coverage) (оценка числа вычислений выражения по различных наборах)
  • Полнота переключений из 0 в 1 и из 1 в 0 каждого бита (Toggle coverage)

Слайд: Метрики в ModelSim

200px-Yes check.png В ModelSim для учета метрик покрытия при компиляции проекта нужно задать в меню Compile->Compiler option опции покрытия
Опции компиляции покрытия.jpg

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

  • Statement coverage — покрытие состояний
  • Branch coverage — покрытие ветвлений
  • Condition coverage — покрытие условий
  • Expression coverage — покрытие выражений
  • Toggle coverage — покрытие принимаемых значений
  • FSM coverage — покрытие состояний автомата

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

Отметки о покрытие строк кода.jpg

Отчет по покрытию.jpg

Отчет по покрытию 2.jpg

Детали по оттчеты по покрытию кода.jpg

Слайд: Команды ModelSim для работы с покрытием

Команда для компиляции

vcom +cover=bcsxf -work $wlibname $name

Ключевое слово +cover и после него строка из букв каждая из которых значит следующее:

  1. b - покрытие ветвлений
  2. c - покрытие условий
  3. s - покрытие состояний
  4. x - покрытие принимаемых битами значений ( 0\1\Z )
  5. t - покрытие принимаемых битами значений ( 0\1 )
  6. f - покрытие состояний конечного автомата

Слайд: Команды ModelSim для работы с покрытием

Запуск моделирования.jpg

Слайд: Команды ModelSim для работы с покрытием

Bombilla amarilla - yellow Edison lamp.pngДля запуска моделирования с покрытием нужно включить следующие опции:

Simulate->Start Simulation на закладке other поставить птичку enable code coverage

Команда для запуска

vsim -coverage 

Bombilla amarilla - yellow Edison lamp.pngДля того чтобы база данных с информацие по покрытию сохранялась в файл после завершения моделирования, нужно выполнить след команду:

coverage save -onexit

Слайд: Верификация на основе утверждений

Позволяет контролировать:

  • Булева логика (Boolean logic) - тестирует основные утверждения (statements) о проекте.
  • Временная логика (Temporal logic) - добавляет временное измерение (dimension) в булеву логику (Boolean logic) и тестирует отсутствие (absence), наличие (presence), неизменность/повторяемость (persistence), последовательность (sequence), и прочее определённых событий.
  • Свойства/утверждения (Property) - это формальное описание поведения проекта, взятое из спецификации проекта и выраженное в терминах временной логики (temporal logic).

Могут быть выражены с помощью PSL (Property Specification Language – теперь включен в VHDL) или с помощью SVA (подмножество SystemVerilog Assertions – работает с VHDL через модули проверок (checker modules)).

  • Последовательности (Sequences) являются простейшей формой свойств/утверждений, представляющие последовательность событий/состояний.\

Bombilla amarilla - yellow Edison lamp.png Assertions – работает с VHDL через модули проверок (checker modules)).

Слайд: Пример верификации на основе утверждений

  • Можно вставлять PSL код в специальные комментарии в VHDL; таким образом, этот код не будет оказывать влияния на синтез и похожие программы.
  • Можно задать последовательности (sequences) для представления разных фаз задаваемого свойства.
  • Конечное описания свойства (property) объединяет эти последовательности.
  • Помеченная меткой директива cover показывает симулятору, как проверять это свойство.
--@clk  rising_edge(CLK);
--@psl  sequence ack35_s is { rose(ACK) : (ACK='1')[*3 to 5] } ;
--@psl  sequence dvalid24_s is { rose(DVALID) : (DVALID='1')[*2 to 4] } ;
--@psl  sequence dvalid2inf_s is { fell(ACK) : (DVALID='1')[*2 to inf] } ;
--@psl  property ackdvalid_p is { ack35_s ; dvalid24_s ; dvalid2inf_s } ;
--@psl  ackdvalid_c: cover(ackdvalid_p) report "Sequence ACK/DVALID covered!";

Слайд: Запуск моделирования в ModelSim с верификацией на основе утверждений

Для компиляции проекта содержащего файл верификации утверждений выполняем команду:

vcom -93 DIGITAL_BLOCK.vhd -pslfile DIGITAL_PSL.psl

После параметра -pslfilee указываем имя или путь к файлу

Для запуска моделирования проекта содержащего файл верификации утверждений выполняем команду:

vsim имя_проекта 

Для отключения выполнения проверок используем параметр -nopsl

vsim имя проекта -nopsl 


Слайд: Быстродействие и расход памяти

Кроме полноты тестирования, одной из важных характеристик тестирующей программы являются:

  • Требуемая память
  • Расход машинного времени

Слайд: Требуемая память

  • Зависит от числа данных в программе
  • Их размера (размерности)
  • От количества и сложности операторов

Пример:

Bombilla amarilla - yellow Edison lamp.pngДанные типа signal в VHDL занимают на порядок!! больше места, чем variable, поэтому массивы данных большого объема в тестирующих модулях лучше объявлять с использованием variable.

Bombilla amarilla - yellow Edison lamp.pngVerilog расходует обычно в 4 раза меньше памяти на хранение одного бита данных, чем VHDL.

Слайд: Сокращение расхода машинного времени

  1. Профилирование - эффективня организация тестирующей программы
  2. Использование систем и языков предназначенных для верификации
  3. Выбор более быстрой системы моделирования (вместо интерпретатора компилятор)
  4. Использование более мощной ЭВМ
  5. Ограничение множества входных наборов тестов (нет ничего мощнее здравого смысла)
  6. Использование аппаратных ускорителей моделирования (10-100раз)
  7. Использование прототипов схем для прогонов тестов (на этапе отладки тестов)

Bombilla amarilla - yellow Edison lamp.pngПример:

1. Три отдельных процесса требуют больше времени, чем те же операции объединенные в один процесс.

2. Использование языков C,C++,SystemC позволяет не несколько раз снизить расход памяти