«Работать добросовестно — значит: работать, повышая свою квалификацию, проявляя инициативу в совершенствовании продукции, технологий, организации работ, оказывая не предусмотренную должностными инструкциями помощь другим сотрудникам (включая и руководителей) в общей им всем работе.

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

Материал из Wiki
Перейти к: навигация, поиск
(Слайд:Введение времени)
 
(не показаны 59 промежуточных версий 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++
+
* {{Сн|'''Прямые тесты'''}} (Directed tests)
# Инструменты для автоматизации
+
* {{Сн|'''Псевдослучайные тесты'''}} (Random tests)
# Совместное моделирование с другими HDL-языками
+
* {{Сн|'''Управляемые псевдослучайные тесты'''}} (Constrained Random tests)
 +
* {{Сн|'''Верификация управляемая покрытием'''}} (на основе покрытия) (Coverage driven verification)
 +
** {{Гол|'''''Покрытие кода'''''}} (Code coverage)
 +
** {{Гол|'''''Функциональное покрытие'''''}} (Functional coverage )
 +
* {{Сн|'''Верификация на основе утверждений'''}} (Assertion based verification)
 +
* {{Сн|'''Эмуляция'''}} (Emulation)
 +
* {{Сн|'''Формальная верификация'''}} (Formal verification)
 +
 
 +
==Слайд: Типы тестов ФК==
 +
На что проверяем:
 +
* {{Гол|'''<big>Детерминистский</big>'''}} - Проверяет обычные режимы работы системы, а также функционирование в граничных условиях на основе фиксированного набора тестов
 +
* {{Гол|'''<big>Случайный</big>'''}} - Предполагает наличие генератора случайных входных воздействий
 +
* {{Гол|'''<big>Транзакционный</big>'''}} - Фиксирует внимание на проверке интерфейсов и прохождению пакетов данных через них
 +
 
 +
Способ проведения проверки:
 +
* {{Сн|'''<big>"Черный ящик"</big>'''}}   
 +
* {{Сн|'''<big>"Серый ящик"</big>'''}}
 +
* {{Сн|'''<big>"Прозрачный ящик"</big>'''}}
 +
 
 +
== Слайд:Что такое покрытие (Coverage)? ==
 +
 
 +
* {{Зел|'''Покрытие'''}} является крайне {{Кр|'''неоднозначным термином'''}}, когда используется сам по себе.
 +
 
 +
{{Info |'''Покрытие  в электронике''' ('''''Coverage''''') является одной из разновидностей метрик проекта, которая сообщает, если определённые аспекты проекта были правильно выполнены во время процедуры тестирования.}}
 +
 
 +
* Обычно уточняют термин покрытия, говоря какой аспект был протестирован:
 +
** '''Тестирование качества кода''' — покрытие кода (code coverage)
 +
** '''Проверка свойств/утверждений''' — покрытие свойств/утверждений (property coverage)
 +
** '''Сбор значений переменных проекта''' — функциональное покрытие (functional coverage).
 +
 
 +
== Слайд:Покрытие кода vs. функциональное покрытие==
 +
 
 +
[[Файл:Code quality-vs-functionality.png|center|400px]]
 +
 
 +
==Слайд: Полнота покрытия ==
 +
 
 +
* {{X|24px}}В реальных условия обычно полный перебор {{Кр|'''<big>невозможен</big>'''}}
 +
* {{V|24px}}Поэтому поступают следующим образом. Например для сумматора:
 +
# Тестируют как {{Фио|'''"Серый ящик"'''}} и проверяют простейшие случаи 0+0, 0+1, FFFF+FFFF, 0+FFFF
 +
# Затем целенаправленно проверяют граничные условия - переполнение, перенос
 +
# Затем тестирую как {{Фио|'''"Черный ящик"'''}} на случайном наборе тестов
 +
# Оценивают полноту проверки модели
 +
 
 +
==Слайд: Метрики оценки полноты тестов==
 +
{{ЖЛампа|24px}}'''Необходимое условие''' : Управляемость (выполняется строка или переход)
 +
 
 +
{{ЖЛампа|24px}}'''Достаточное условие''' : Наблюдаемость (результат исполнения влияет на выход сравниваемый с эталоном)
 +
 
 +
* {{Сн|'''<big>Эвристические метрики </big>'''}} - основанные на статистике появления ошибок
 +
* {{Сн|'''<big>Программные метрики </big>'''}}
 +
* {{Сн|'''<big>Автоматно-метрический подход </big>'''}}(лучший вариант использовать формальную верификацию для автоматов)
 +
* {{Сн|'''<big>Моделирование неисправностей </big>'''}}(в модель вносится неисправность)
 +
* {{Сн|'''<big>Мониторинг событий</big>'''}}
 +
 
 +
==Слайд: Эвристические метрики ==
 +
 
 +
* Календарное время между моментами обнаружения ошибок проекта (к концу процесса верификации оно увеличивается);
 +
* Общее количество промоделированных тактов работы проектируемого устройства;
 +
* Общее число обнаруженных ошибок в проекте и т.д.
 +
* Число обнаруженных ошибок в день, неделю, месяц
 +
 
 +
==Слайд: Программные метрики ==
 +
* '''Полнота покрытия тестом строк кода модели'''
 +
* '''Полнота покрытия переходов''' (число пополнений ветвей оператора if и case )
 +
* '''Полнота покрытия путей ''(Branch coverage)''''' (все пути в графе программы)
 +
* '''Полнота покрытия выражений ''(Expression coverage)''''' (оценка числа вычислений выражения по различных наборах)
 +
* '''Полнота переключений из 0 в 1 и из 1 в 0 каждого бита ''(Toggle coverage)'''''
 +
 
 +
== Слайд: Метрики в ModelSim ==
 +
 
 +
<slides split="-----" width="600" >
 +
{{V|24px}} В '''ModelSim''' для учета метрик покрытия при компиляции проекта нужно задать в меню '''Compile->Compiler option''' опции покрытия
 +
[[Файл:Опции компиляции покрытия.jpg|center]]
 +
 
 +
</slides>
 +
 
 +
== Слайд: Виды покрытия кода в ModelSim ==
 +
 
 +
* {{Сн|'''Statement coverage'''}} — покрытие состояний
 +
 
 +
* {{Сн|'''Branch coverage'''}} — покрытие ветвлений
 +
 
 +
* {{Сн|'''Condition coverage'''}} — покрытие условий
 +
 
 +
* {{Сн|'''Expression coverage'''}} — покрытие выражений
 +
 
 +
* {{Сн|'''Toggle coverage'''}} — покрытие принимаемых значений
 +
 
 +
* {{Сн|'''FSM coverage'''}} — покрытие состояний автомата
 +
 
 +
== Слайд: Мониторинг покрытия кода в ModelSim ==
  
== Основы языка SystemC ==
+
<slides split="-----" width="400" >
 +
[[Файл:Отметки_о_покрытие_строк_кода.jpg]]
 +
-----
 +
[[Файл:Отчет_по_покрытию.jpg]]
 +
-----
 +
[[Файл:Отчет_по_покрытию_2.jpg]]
 +
-----
 +
[[Файл:Детали_по_оттчеты_по_покрытию_кода.jpg]]
 +
</slides>
  
===Слайд:Типы данных (Форматы и способ представления данных) ===
+
==Слайд: Команды ModelSim для работы с покрытием ==
[[Файл:Типы_данных.png]]
+
  
===Слайд:Типы данных (native)===
+
{{Сн|<big>'''Команда для компиляции'''</big>}}
<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)===
+
vcom +{{Зел|'''cover'''}}={{Гол|'''bcsxf'''}} -work $wlibname $name
<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)===
+
Ключевое слово {{Зел|'''+cover'''}} и после него строка из букв каждая из которых значит следующее:  
<source lang="cpp">                // Пример типа данных SystemC
+
sc_bit NAME...;
+
sc_bv<BITWIDTH> NAME...;
+
</source>
+
  
* sc_bit и sc_bv могут принимать значения: '''SC_LOGIC_1''' и '''SC_LOGIC_0.'''  
+
# '''b''' - покрытие ветвлений
* Для сокращения типов, можно использовать '''Log_1 и Log_0''' или '''‘1’ и ‘0’.'''
+
# '''c''' - покрытие условий
* Над этим типом данных возможно выполнение битовых операций '''and, or, xor (&,|, ^).'''  
+
# '''s''' - покрытие состояний
* Для обращения к отдельным битам и массивам '''[], range()'''.
+
# '''x''' - покрытие принимаемых битами значений ( 0\1\Z )
 +
# '''t''' - покрытие принимаемых битами значений ( 0\1 )
 +
# '''f''' - покрытие состояний конечного автомата
  
<source lang="cpp">
+
==Слайд: Команды ModelSim для работы с покрытием ==
sc_bit flag(SC_LOGIC_1); // more efficient to use bool
+
<slides split="-----" width="600" >
sc_bv<5> positions = "01101";
+
[[Файл:Запуск_моделирования.jpg]]
sc_bv<6> mask = "100111";
+
</slides>
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>
+
  
===Слайд:Типы данных (Несколько значений )===
+
==Слайд: Команды ModelSim для работы с покрытием ==
<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>
+
{{ЖЛампа|24px}}{{Сн|<big>'''Для запуска моделирования с покрытием нужно включить следующие опции:'''</big>}}
  
===Слайд:Операторы SystemC ===
+
'''Simulate->Start Simulation''' на закладке other поставить птичку '''enable code coverage'''
[[Файл:Операции.png]]
+
  
===Слайд:Главный модуль MAIN===
+
{{Сн|<big>'''Команда для запуска'''</big>}}  
{{Гол|'''<big>Описание на языке C++</big>'''}}
+
<source lang="cpp">
+
int main(int argc, char* argv[]) {
+
BODY_OF_PROGRAM
+
return EXIT_CODE; //
+
}
+
</source>
+
  
{{Гол|'''<big>Описание на языке SystemC</big>'''}}
+
'''vsim -coverage'''  
<source lang="cpp">
+
int sc_main(int argc, char* argv[]) {
+
//ELABORATION
+
sc_start(); // <-- Simulation begins & ends
+
            // in this function!
+
//[POST-PROCESSING]
+
return EXIT_CODE; //
+
}
+
</source>
+
  
===Слайд: Модуль ===
+
{{ЖЛампа|24px}}{{Сн|<big>'''Для того чтобы база данных с информацие по покрытию сохранялась в файл после завершения моделирования, нужно выполнить след команду:'''</big>}}  
<source lang="cpp">
+
#include <systemc.h>
+
SC_MODULE(module_name) {
+
MODULE_BODY
+
};</source>
+
Содержит:
+
* '''{{Фио|<big>Порты</big>}}'''
+
* '''{{Фио|<big>Каналы связи</big>}}'''
+
* '''{{Фио|<big>Объявления переменных для хранения данных</big>}}'''
+
* '''{{Фио|<big>Другие модули с большей вложенностью</big>}}'''
+
* '''{{Фио|<big>Конструктор</big>}}'''
+
* '''{{Фио|<big>Деструктор</big>}}'''
+
* '''{{Фио|<big>Функции -процессы</big>}}'''
+
* '''{{Фио|<big>Вспомогательные функции</big>}}'''
+
  
===Слайд: Конструктор (SC_CTOR)===
+
'''coverage save -onexit'''
<source lang="cpp">SC_CTOR(module_name)
+
: Initialization // OPTIONAL
+
{
+
Subdesign_Allocation
+
Subdesign_Connectivity
+
Process_Registration
+
Miscellaneous_Setup
+
}</source>
+
  
* '''{{Фио|<big>Объявление под модулей</big>}}'''
+
==Слайд: Верификация на основе утверждений ==
* '''{{Фио|<big>Подключение и соединение с подмодулями</big>}}'''
+
<big>'''Позволяет контролировать'''</big>:
* '''{{Фио|<big>Регистрация процессов на SystemC</big>}}'''
+
* '''{{Фио|<big>Обеспечение постоянной чувствительности</big>}}'''
+
* '''{{Фио|<big>Разнообразные пользовательские объявления</big>}}''
+
  
===Слайд: Конструктор (SC_HAS_PROCESS)===
+
* {{Сн|'''Булева логика'''}} (Boolean logic) - тестирует основные утверждения (statements) о проекте.  
<source lang="cpp">
+
* {{Сн|'''Временная логика'''}} (Temporal logic) - добавляет временное измерение (dimension) в булеву логику (Boolean logic) и тестирует отсутствие (absence), наличие (presence), неизменность/повторяемость (persistence), последовательность (sequence), и прочее определённых событий.
//FILE: module_name.h
+
* {{Сн|'''Свойства/утверждения'''}} (Property) -  это формальное описание поведения проекта, взятое из спецификации проекта и выраженное в терминах временной логики (temporal logic).
SC_MODULE(module_name) {
+
Могут быть выражены с помощью PSL (Property Specification Language – теперь включен в VHDL) или с помощью SVA (подмножество SystemVerilog Assertions – работает с VHDL через модули проверок (checker modules)).
SC_HAS_PROCESS(module_name);
+
* {{Сн|'''Последовательности'''}} (Sequences) являются простейшей формой свойств/утверждений, представляющие последовательность событий/состояний.\
module_name(sc_module_name instname[, other_args…])
+
: sc_module(instname)
+
[, other_initializers]
+
{
+
CONSTRUCTOR_BODY
+
}
+
};</source>
+
  
* '''{{Фио|<big>Все возможности конструктора SC_CTOR</big>}}'''
+
{{ЖЛампа|24px}} Assertions – работает с VHDL через модули проверок (checker modules)).
* '''{{Фио|<big>Альтернативный метод создания модуля</big>}}'''
+
* '''{{Фио|<big>Позволяет создавать конструктор с аргументами(+ к имени модуля)</big>}}'''
+
* '''{{Фио|<big>Используется, если желаете расположить конструктор в файле описания .cpp (не в файле .h)</big>}}'''
+
  
===Слайд: Процесс SC_THREAD ===
+
==Слайд: Пример верификации на основе утверждений ==
 +
* Можно вставлять PSL код в '''специальные комментарии''' в VHDL; таким образом, этот код не будет оказывать влияния на синтез и похожие программы.
 +
* Можно задать  '''последовательности (sequences)''' для представления разных фаз задаваемого свойства.
 +
* Конечное описания '''свойства (property)''' объединяет эти последовательности.
 +
* Помеченная меткой '''директива cover''' показывает симулятору, как проверять это свойство.
  
<source lang="cpp">
+
--@clk  rising_edge(CLK);
SC_MODULE(simple_process_ex) {
+
--@psl  sequence ack35_s is { rose(ACK) : (ACK='1')[*3 to 5] } ;
  SC_CTOR(simple_process_ex) {
+
--@psl  sequence dvalid24_s is { rose(DVALID) : (DVALID='1')[*2 to 4] } ;
      SC_THREAD(my_thread_process);
+
--@psl  sequence dvalid2inf_s is { fell(ACK) : (DVALID='1')[*2 to inf] } ;
  }
+
--@psl  property ackdvalid_p is { ack35_s ; dvalid24_s ; dvalid2inf_s } ;
  void my_thread_process(void);
+
--@psl  ackdvalid_c: cover(ackdvalid_p) report "Sequence ACK/DVALID covered!";
};</source>
+
  
{{Зел|'''SC_THREAD'''}} в '''SystemC''':
+
==Слайд: Запуск моделирования в ModelSim с верификацией на основе утверждений ==
# аналог {{Зел|'''initial block'''}} в '''Verilog'''
+
# {{Зел|'''process'''}} без списка чувствительности с оператором '''wait()''' в '''VHDL'''.
+
  
===Слайд:Введение времени===
+
{{Сн|'''Для компиляции проекта содержащего файл верификации утверждений выполняем команду:'''}}
  
{{Ор|<big>'''Единицы измерения времени'''</big>}}
+
'''vcom''' -93 DIGITAL_BLOCK.vhd '''-pslfile''' DIGITAL_PSL.psl
  
<source lang="cpp">
+
После параметра '''-pslfile'''e указываем имя или путь к файлу
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>
+
  
 +
{{Сн|'''Для запуска моделирования проекта содержащего файл верификации утверждений выполняем команду:'''}}
 +
 +
'''vsim''' '''''имя_проекта'''''
  
===Слайд:Запуск выполнения '''sc_start()'''===
+
Для отключения выполнения проверок используем параметр '''-nopsl'''
  
{{Ор|<big>'''Функция запускающая выполнения главного процесса '''</big>}}
+
'''vsim''' '''''имя проекта''''' '''-nopsl'''  
  
{{Сн|'''Пример запуска моделирования на 60 секунд модельного времени'''}}
 
  
<source lang="cpp">
+
==Слайд: Быстродействие и расход памяти ==
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 ()'''===
+
Кроме полноты тестирования, одной из важных характеристик тестирующей программы являются:
  
<source lang="cpp">
+
* {{Зел|<big>'''Требуемая память'''</big>}}
std::cout << " The time is now "
+
* {{Зел|<big>'''Расход машинного времени'''</big>}}
<< sc_time_stamp()
+
<< "!" << std::endl;</source>
+
  
После запуска моделирования в консоли получим
+
==Слайд: Требуемая память==
The time is now 0 ns! 
+
  
 +
* Зависит от числа данных в программе
 +
* Их размера (размерности)
 +
* От количества и сложности операторов
  
===Слайд: Остановка выполнения моделирования wait(sc_time)===
+
Пример:  
  
 +
{{ЖЛампа|24px}}Данные типа {{Кр|'''signal'''}} в VHDL занимают {{Кр|'''на порядок!! больше'''}} места, чем {{Зел|'''variable'''}}, поэтому массивы данных большого объема в тестирующих модулях лучше объявлять с использованием '''variable'''.
  
{{Ор|<big>'''Функция останавливающая выполнение процесса до заданного времени или до прихода события'''</big>}}
+
{{ЖЛампа|24px}}Verilog расходует {{Кр|'''обычно'''}} в 4 раза меньше памяти на хранение одного бита данных, чем VHDL.
  
<source lang="cpp">
+
==Слайд: Сокращение расхода машинного времени==
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
+
# '''Профилирование''' - эффективня организация тестирующей программы
Now at 10 ns
+
# Использование '''систем и языков''' предназначенных для '''верификации'''
Delaying 4 ms
+
# Выбор более быстрой системы моделирования (вместо интерпретатора '''компилятор''')
Now at 4000010 ns
+
# Использование более '''мощной ЭВМ'''
 +
# '''Ограничение''' множества '''входных''' наборов '''тестов''' ({{Зел|'''''нет ничего мощнее здравого смысла'''''}})
 +
# Использование '''аппаратных ускорителей''' моделирования (10-100раз)
 +
# Использование '''прототипов''' схем '''для прогонов тестов''' (на этапе отладки тестов)
  
===Слайд:Иерархия и структура проекта===
+
{{ЖЛампа|24px}}{{Зел|'''<big>Пример: </big>'''}}
  
===Слайд:Модель параллельной обработки===
+
{{Зел|'''<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 позволяет не несколько раз снизить расход памяти