Спец курс (Избранные главы VHDL)/SystemC — различия между версиями
ANA (обсуждение | вклад) м (→Слайд: Generic) |
Vidokq (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
+ | {{ИГСАПР_TOC}} | ||
<slideshow style="custis" headingmark="Слайд:" incmark=":step" scaled="true" > | <slideshow style="custis" headingmark="Слайд:" incmark=":step" scaled="true" > | ||
;title: '''Введение в SystemC.''' | ;title: '''Введение в SystemC.''' |
Версия 13:07, 2 декабря 2013
- Тест 1 по RFID системам
- Тест 2 по основам языка VHDL (начальный уровень)
- Тест 3 по языку VHDL (экспертный уровень)
- Тест 4 Среда моделирования
- Тест 5 Верификация VHDL-описания
- Тест 6 Основы языка SystemC
- Заголовок
- Введение в SystemC.
- Автор
- Зайцев В.С.
- Нижний колонтитул
- Спец курс (Избранные главы VHDL)/SystemC
- Дополнительный нижний колонтитул
- Зайцев В.С., 13:18, 2 декабря 2013
Основы языка SystemC
Слайд:Типы данных (Форматы и способ представления данных)
Слайд:Типы данных (native)
// Пример типа данных 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} ;
Слайд:Типы данных (Arithmetic)
// Пример целочисленных типов данных 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
Слайд:Типы данных (Boolean)
// Пример типа данных SystemC sc_bit NAME...; sc_bv<BITWIDTH> NAME...;
- sc_bit и sc_bv могут принимать значения: SC_LOGIC_1 и SC_LOGIC_0.
- Для сокращения типов, можно использовать Log_1 и Log_0 или ‘1’ и ‘0’.
- Над этим типом данных возможно выполнение битовых операций and, or, xor (&,|, ^).
- Для обращения к отдельным битам и массивам [], range().
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;
Слайд:Типы данных ( многозначные (ZX10))
// Пример типа данных 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';
Слайд:Операторы SystemC
Слайд:Главный модуль MAIN
int main(int argc, char* argv[]) { BODY_OF_PROGRAM return EXIT_CODE; // }
int sc_main(int argc, char* argv[]) { //ELABORATION sc_start(); // <-- Simulation begins & ends // in this function! //[POST-PROCESSING] return EXIT_CODE; // }
Слайд: Модуль
#include <systemc.h> SC_MODULE(module_name) { MODULE_BODY };
Содержит:
- Порты
- Каналы связи
- Объявления переменных для хранения данных
- Другие модули с большей вложенностью
- Конструктор
- Деструктор
- Функции -процессы
- Вспомогательные функции
Слайд: Конструктор (SC_CTOR)
SC_CTOR(module_name) : Initialization // могут отсутствовать объявления и инициализация сигналов { Subdesign_Allocation Subdesign_Connectivity Process_Registration Miscellaneous_Setup }
- Объявление под модулей
- Подключение и соединение с подмодулями
- Регистрация процессов на SystemC
- Объявление списка чувствительности
- Разнообразные пользовательские объявления
Слайд: Конструктор (SC_HAS_PROCESS)
//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 } };
- Все возможности конструктора SC_CTOR
- Альтернативный метод создания модуля
- Позволяет создавать конструктор с аргументами(+ к имени модуля)
- Используется, если желаете расположить конструктор в файле описания .cpp (не в файле .h)
Слайд: Процесс SC_THREAD
SC_MODULE(simple_process_ex) { SC_CTOR(simple_process_ex) { SC_THREAD(my_thread_process); } void my_thread_process(void); };
SC_THREAD в SystemC:
- аналог initial block в Verilog
- process без списка чувствительности с оператором wait() в VHDL.
Слайд:Введение времени
Единицы измерения времени
SC_SEC // seconds SC_MS // milliseconds SC_US // microseconds SC_NS // nanoseconds SC_PS // picoseconds SC_FS // femtoseconds
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") }
Слайд:Запуск выполнения sc_start()
Функция запускающая выполнения главного процесса
Пример запуска моделирования на 60 секунд модельного времени
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 ; }
Слайд:Контроль текущего времени моделирования sc_time_stamp ()
std::cout << " The time is now " << sc_time_stamp() << "!" << std::endl;
После запуска моделирования в консоли получим
The time is now 0 ns!
Слайд: Остановка выполнения моделирования wait(sc_time)
Функция останавливающая выполнение процесса до заданного времени или до прихода события
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; }
% . /run_example Now at 10 ns Delaying 4 ms Now at 4000010 ns
Слайд:События sc_event
Слайд:События SC_THREAD::wait()
Процесс SC_THREAD процес выполняющийся один раз!!, для управления работой такого процесса используют функцию задержки выполнения wait
wait(time); wait(event); wait(event1 | event2) // до прихода любого из событий wait(event1 & event2) // до прихода всех событий вместе wait(timeout, event); // до прихода события ожидает в течении времени wait ( timeout, event1 | event2 ) wait ( timeout, event1 & event2 ) wait(); // ожидание дельта цикла выполнения, статическая задержка
Слайд:Запуск события (установка,назначение)
Для запуска события используется атрибут .notify()
Он выполняет запуск событий, отсчет времени идет от запуска моделирования. Для сброса точки отсчета используют .cancel()
sc_event action; sc_time now(sc_time_stamp()); //вытягиваем текущее время моделирования //стартуем событие немедленно action.notify(); //следующее событие через 20 ms от текущего момента action.notify(20, SC_MS); //переопределим событие на время 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);
Слайд:Процесс со списком чувствительности SC_METHOD
SC_METHOD(process_name);
Список чуствительности задаеться после ключевого слова sensitive
sensitive << event [<< event] ;// поточный стил sensitive (event [, event] ); // стиль с использованием функции
Слайд:dont_initialize()
Отменяет начальную установку значений
- После запуска моделирования конструктор создает модуль и инициализирует все процессы и переменные.
- Это заставляет выполниться всем методам работающим по событию по одному разу во время запуска если событие устанавливалось в значение.
- Для исключения начального выполнения используется функция dont_initialize()
Слайд: Стек событий sc_event_queue
Событие можно задать не только от начального момента времени, а и от текущего.
Для этого используется функция sc_event_queue()
sc_event_queue action; sc_time now(sc_time_stamp()); action.notify(20, SC_MS); action.notify(1.5,SC_NS); 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();
Слайд:Совместное использование ресурсов
- При совместном использовании ресурсов, шин, памяти нужно разграничить область полномочий каждого процесса.
- Иначе при одновременной, к примеру записи будет происходить сбой или некорректная запись.
sc_mutex NAME; // блокируем mutex NAME (ждем пока разблокируется) NAME.lock(); // Возвращает статус состояния блокировки NAME.try lock() // Снимает блокировку NAME.unlock();
Если управлением доступом к нескольким ресурсам
sc_semaphore NAME(COUNT); // блокируем mutex NAME (ждем пока разблокируеться) NAME.wait(); // Возвращает статус состояния блокировки NAME.trywait() //Возвращает число свободных ресурсов NAME.get_value() // Снимает блокировку NAME.post();
Слайд:Иерархия и структура проекта
Слайд:Иерархия и структура проекта (sc_main)
Подключение и создание модуля внутри главного модуля аналогично созданию объекта заданного класса
Стандартная конструкция блока хранения информации для RFID
//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(); } |
//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; } |
Слайд:Иерархия и структура проекта (SC_MODULE)
Подключение и создание модуля внутри другого модуля аналогично созданию объекта заданного класса, внутри другого класса. Поэтому объявления производиться в конструкторе верхнего модуля
//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 } }; } |
//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 } }; } |
Слайд:Порты - точки подачи и снятия внешних воздействий
Слайд:Типы портов
- sc_port - аналог inout порта в языке VHDL
- sc_in - аналог in порта в языке VHDL
- sc_out - аналог out порта в языке VHDL
- sc_export - внешний порт, порт который позволяет получить доступ к private данным модуля, но иерархически модулю не принадлежит.
Механизм использования sc_export порта напоминает доступ к сигналам по иерархии, как в VHDL-2008.
Слайд:Порты - точки подачи и снятия внешних воздействий
Слайд: VHDL и SystemC конструкции
Слайд: Entity
Слайд: Architecture
Слайд: Generic
Слайд: Process без списка чувствительности
Слайд: Process со списком чувствительности (пример 1)
Слайд: Process со списком чувствительности (пример 2)
Слайд: Работа с файлами
Слайд: Работа с файлами
Слайд: Работа с функциями
Слайд: Работа с сигналами
Слайд: Конструкции С++
Все конструкции языка С++ разрешено использовать.
Слайд: Управление процессом моделирования (сообщения, запуск останов моделирования)
Для запуска останова и контроля выполнения есть так же встроенные функции.
Слайд: Запуск моделирования только SystemC описания
Слайд: Запуск моделирования SystemC описания и VHDL(верхний уровень)
Для запуска моделирования:
-
Скачать и установить в корневую дирректорию компилятор gcc-4.2.1-mingw32vc9
-
Если компилятор установлен то переходим на следующий пункт
- Скомпилировать описание: sccom -work <library>
- Преобразовать выходной файл в исполняемый sccom -link -work <library>
- Запустить моделирование без опций оптимизации
vsim voptargs=+acc work sc_module