SystemC — это набор классов и макросов C++ , которые предоставляют интерфейс моделирования , управляемый событиями (см. также дискретное моделирование событий ). Эти возможности позволяют проектировщику моделировать параллельные процессы , каждый из которых описывается с использованием простого синтаксиса C++ . Процессы SystemC могут взаимодействовать в моделируемой среде реального времени, используя сигналы всех типов данных, предлагаемых C++, некоторые дополнительные типы, предлагаемые библиотекой SystemC, а также определяемые пользователем. В некоторых отношениях SystemC намеренно имитирует языки описания оборудования VHDL и Verilog , но более точно описывается как язык моделирования системного уровня .
SystemC применяется к моделированию на уровне системы , архитектурному исследованию, моделированию производительности, разработке программного обеспечения , функциональной проверке и высокоуровневому синтезу . SystemC часто ассоциируется с проектированием на уровне электронной системы (ESL) и с моделированием на уровне транзакций (TLM).
SystemC определен и продвигается Open SystemC Initiative (OSCI — теперь Accellera ) и был одобрен Ассоциацией стандартов IEEE как IEEE 1666-2011 [1] — Справочное руководство по языку SystemC (LRM). LRM предоставляет окончательное изложение семантики SystemC. OSCI также предоставляет симулятор с открытым исходным кодом для проверки концепции (иногда неправильно называемый эталонным симулятором), который можно загрузить с веб-сайта OSCI. [2] Хотя намерением OSCI было то, чтобы коммерческие поставщики и академические круги могли создавать оригинальное программное обеспечение, соответствующее IEEE 1666, на практике большинство реализаций SystemC были, по крайней мере, частично основаны на симуляторе для проверки концепции OSCI.
SystemC имеет семантическое сходство с VHDL и Verilog , но можно сказать, что он имеет синтаксические издержки по сравнению с ними при использовании в качестве языка описания оборудования . С другой стороны, он предлагает более широкий диапазон выражений, аналогичный объектно-ориентированному проектированию секционирования и шаблонным классам. Хотя SystemC является строго библиотекой классов C++, иногда его рассматривают как язык сам по себе. Исходный код может быть скомпилирован с помощью библиотеки SystemC (которая включает ядро моделирования) для получения исполняемого файла. Производительность реализации OSCI с открытым исходным кодом обычно хуже, чем у коммерческих симуляторов VHDL/Verilog при использовании для моделирования уровня передачи регистров . [ необходима цитата ]
SystemC версии 1 включала в себя общие функции языка описания оборудования , такие как структурная иерархия и связность, точность тактового цикла, дельта-циклы, четырехзначную логику (0, 1, X, Z) и функции разрешения шины.
SystemC версии 2 и далее фокусировалась на абстракции коммуникации, моделировании на уровне транзакций и моделировании виртуальной платформы. Также были добавлены абстрактные порты, динамические процессы и уведомления о событиях по времени.
SystemC имеет понятие класса-контейнера, называемого модулем. Это иерархическая сущность, которая может содержать в себе другие модули или процессы.
Модули являются основными строительными блоками иерархии дизайна SystemC. Модель SystemC обычно состоит из нескольких модулей, которые взаимодействуют через порты. Модули можно рассматривать как строительный блок SystemC.
Порты обеспечивают связь изнутри модуля с внешней средой (обычно с другими модулями) по каналам.
SystemC поддерживает разрешенные и неразрешенные сигналы. Разрешенные сигналы могут иметь более одного драйвера (шину), тогда как неразрешенные сигналы могут иметь только один драйвер.
Модули имеют порты, через которые они подключаются к другим модулям. SystemC поддерживает однонаправленные и двунаправленные порты.
Экспорты включают каналы и обеспечивают связь изнутри модуля с внешним миром (обычно с другими модулями).
Процессы используются для описания функциональности. Процессы содержатся внутри модулей. SystemC предоставляет три различные абстракции процессов [ какие? ] для использования проектировщиками оборудования и программного обеспечения. Процессы являются основными элементами вычислений. Они являются параллельными.
Каналы — это элементы связи SystemC. Они могут быть как простыми проводами, так и сложными механизмами связи, такими как FIFO или каналы шины .
Элементарные каналы:
Порты используют интерфейсы для связи с каналами.
События обеспечивают синхронизацию между процессами и должны быть определены во время инициализации.
SystemC вводит несколько типов данных, которые поддерживают моделирование оборудования.
Расширенные стандартные типы:
sc_int<n>
n- битное целое число со знакомsc_uint<n>
n- битное беззнаковое целое числоsc_bigint<n>
n -битное целое число со знаком для n > 64sc_biguint<n>
n -битное беззнаковое целое число для n > 64Типы логики:
sc_bit
2-значный одиночный битsc_logic
4-значный одиночный битsc_bv<n>
вектор длины n из sc_bitsc_lv<n>
вектор длины n sc_logicТипы с фиксированной точкой:
sc_fixed<>
шаблонная знаковая фиксированная точкаsc_ufixed<>
шаблонная беззнаковая фиксированная точкаsc_fix
нешаблонная знаковая фиксированная точкаsc_ufix
нешаблонный беззнаковый с фиксированной точкойSystemC берет свое начало в работе над языком программирования Scenic, описанным в статье DAC 1997 года. [4]
Компании ARM Ltd., CoWare , Synopsys и CynApps объединились для разработки SystemC (CynApps позже стал Forte Design Systems ) и выпустили его первую версию в 1999 году. [5] [6] Главным конкурентом в то время был SpecC — другой пакет с открытым исходным кодом на основе C, разработанный сотрудниками Калифорнийского университета в Ирвайне и некоторыми японскими компаниями.
В июне 2000 года была сформирована группа по стандартизации, известная как Open SystemC Initiative, с целью создания нейтральной в отрасли организации для проведения мероприятий SystemC и предоставления крупнейшим конкурентам Synopsys, Cadence и Mentor Graphics, возможности демократического представительства в разработке SystemC.
Пример кода сумматора :
#включить "systemc.h" SC_MODULE ( adder ) // объявление модуля (класса) { sc_in < int > a , b ; // порты sc_out < int > sum ; void do_add ( ) // процесс { sum.write ( a.read () + b.read ()); // или просто sum = a + b } SC_CTOR ( adder ) // конструктор { SC_METHOD ( do_add ); // регистр do_add в ядре sensitive << a << b ; // список чувствительности do_add } };
Оценка мощности и энергии может быть выполнена в SystemC с помощью моделирования. Powersim [7] — это библиотека классов SystemC, предназначенная для расчета мощности и энергопотребления оборудования, описанного на системном уровне. Для этого отслеживаются операторы C++, и для каждого типа данных SystemC могут использоваться различные модели энергии. Моделирование с помощью Powersim не требует никаких изменений в исходном коде приложения.