Краткое описание возможностей SystemC [14]
Изначально библиотека SystemC разрабатывалась для реализации полного цикла разработки, начиная от модели системы и физических объектов и заканчивая моделью ОС реального времени и аппаратной части. Так же, как и для других высокоуровневых языков HDL, для синтеза может быть использован только ограниченный набор конструкций языка. Для того чтобы ознакомиться с этим подмножеством, лучше всего воспользоваться описанием синтеза с SystemC от Synopsys.
Независимо от языка, на котором сделано RTL-описание, результатом синтеза является список соединений между триггерами, защелками и логическими элементами. Поэтому синтезируемые подмножества Verilog, VHDL и SystemC совпадают по смыслу и отличаются только синтаксисом описания. Возможно, что разработка поведенческого синтеза расширит возможности SystemC для описания аппаратуры, но в настоящее время следует ориентироваться на привычные и широко используемые RTL-описания.
Для понимания синтаксиса SystemC следует разбираться в С++, так как любая конструкция SystemC является синтаксически верной конструкцией C++, особое внимание следует обратить на классы и шаблоны (templates).
Рассмотрим конструкции SystemC, применяемые для описания иерархической структуры модулей.
#include “system.h”
SC_MODULE (module_name)
[
// Module port declaration
// Signal variable declaration
// Data variable declaration
// Member function declaration
// Method process declaration
// Module constructor
SC_CTOR (module_name)
[
// Register processes
// Declare sensitivity list
]
]:
В дополнение к стандартным объектам класса С++ добавлены описания портов, сигналов и процессов. Эти объекты воспринимаются средством синтеза и являются основными элементами RTL-описания.
SC_Method (my_method_proc);
// declare level- sensitive sensitivity list
sensitive << a << c << d; // Stream declaration
sensitive(b); // Function declaration
sensitive(e); // Function declaration
Порты описываются следующим образом:
Для взаимодействия процессов внутри модуля следует использовать сигналы. Это требуется для моделирования конкурирующих процессов и соединения модулей. Сигналы описываются следующим образом:
На типы сигналов действуют те же ограничения, что и на типы портов.
Внутри модуля могут использоваться переменные, не являющиеся сигналами или портами. Описание переменных не отличается от описания в C++. Типы переменных должны принадлежать тому же подмножеству, что и для портов и сигналов.
// Module port declaration
sc_in
port_name;
sc_out
port_name;
sc_inout
port_name;
sc_in
port_name;
// Internal signal variable declaration
sc_signalsignal_name;
sc_signal signal1, signal2;
Разница между сигналами и переменными состоит в том, что значения сигналам присваиваются в конце временного шага исполнения модели (дельта-цикла), а присвоения переменным происходят мгновенно.
Аналогом Verilog блока alwais (или process в VHDL) с условием запуска по уровню или фронту сигнала (сигналов), который применяется для описания триггеров, защелок и комбинаторной (параллельной) логики, является процесс. В SystemC существует несколько видов процессов, но для RTL-описаний применяется только SC_METHOD. Процесс должен быть описан как функция-член, а потом зарегистрирован с помощью макроса SC_METHOD.
// process declaration
void my_method_proc();
// module constructor
SC_CTOR (my_module)
[
// register process
SC_Method (my_method_proc);
// define the sensitivity list
Список чувствительности может включать в себя события по уровню и по фронту. При этом, правила синтезируемости такие же, как и в Verilog/VHDL.
Для построения иерархии используются указатели на модули нижнего уровня и оператор new. Подключение сигналов к портам модуля может производиться как по имени, так и по позиции.
// Create data members – pointers to instantiated modules
fir_fsm *fir_fsm1;
fir_fsm * fir_fsm2;
SC_CTOR (fir_top)
[
// Create new instance of fir_fsm module
fir_fsm1 = new fir_fsm(“Fir_FSM1”);
fir_fsm2 = new fir_fsm(“Fir_FSM2”);
// Binding by name
fir_fsm1 -> clock(CLK);
fir_fsm1 -> reset(RESET);
fir_fsm1 ->state_out(state_out1);
// Binding by position alternative
fir_fsm2 (CLK, RESET, state_out2);
В общем, этого достаточно для описания аппаратной части. В качестве примера приведем описания некоторых стандартных элементов на SystemC:
Пример 1
#include “system.h”
SC_MODULE (dffsr)
[
sc_inin_data, reset;
sc_outout_q;
sc_in clock; //clock port
// Method for D-flip-flop
void dff ();
// Constructor
SC_CTOR (dffsr)
[
SC_METHOD (dffsr);
sensitive_pos << clock;
]
];
void dffsr.:dff()
[
if (reset.read()) out_q.write(0);
else out_q.write(in_data.read());
]
Пример 2
#include “system.h”
SC_MODULE (decoder)
[
sc_inin_i;
sc_outout;
// Method process
void decoder_fcm () [
switch (in_i.read())
[
case0: out.write(0x01); break;
case1: out.write(0x02); break;
case2: out.write(0x04); break;
case3: out.write(0x10); break;
case4: out.write(0x20); break;
case5: out.write(0x40); break;
default: out.write(0x01);
]
Пример 1 описывает триггер с синхронным сбросом, а пример 2 –комбинаторную логику.
В дополнение к RTL-синтезу в будущем предполагается наличие поведенческого синтеза, который не требует от пользователя знаний об элементарных ячейках: триггерах, защелках и логических элементах – и выполняет автоматическое разбиение проекта на соответствующие модули, создание тактовых сигналов и т. п. Возможно, что это направление будет очень полезным.
Для моделирования цифровых схем (или любых других систем) отсутствуют ограничения, накладываемые на описание RTL-кода.
Для моделирования систем передачи информации существуют каналы и интерфейсы. Это позволяет моделировать различные слои протоколов обмена.
Для моделирования вычислений с фиксированной точкой существуют классы SystemC, позволяющие проводить вычисления с фиксированной точкой с любой разрядностью и любой позицией десятичной точки.
Для моделирования ОС реального времени имеются потоки вычислений (THREAD), семафоры, очереди и модель невытесняющей многозадачности.
SystemC выглядит удачной альтернативой известным языкам HDL и может использоваться в качестве системного языка разработки от модели до готового изделия. В библиотеке реализовано много классов для моделирования различных этапов разработки SoC, в особенности для систем связи и обработки сигналов. К плюсам следует отнести то, что для моделирования не требуется симулятор, а к минусам – то, что средства синтеза для SystemC распространены меньше, чем для специализированных HDL-языков. Но производители начинают поддерживать RTL SystemC – в настоящее время продаются компилятор CoCentric от Synopsys или продукция Forte Design Systems.
Do'stlaringiz bilan baham: |