Забавляюсь последнее время по работе с СистемСи. Это такая надстройка над Си++, по сути набор классов для симуляции цифровых электронных систем. Пародия на СистемВерилог: работает так же шустро, и не стоит никаких денег. Но код выглядит ужасно.
Цифровые схемы уже несколько приелись, и решил я развлечься чем-нибудь более человеческим. Благо, к СистемСи народ умудрился добавить расширение для работы с аналоговыми вещами.
Зацените: модель материальной точки с одной степенью свободы. Как бы аналоговый элемент с одним входом и двумя выходами. На входе воздействующая сила, на выходе скорость и координата. Внутренний параметр - масса.
Добавляем второй элемент - пружину, получаем маятник. Результат симуляции выглядит вполне симпатично:

Полные исходники примера можно посмотреть здесь: https://code.google.com/p/vak-opensource/source/browse/#svn%2Ftrunk%2Fhardware%2Fsystemc-ams
Но все это не просто ради забавы. Есть у меня задумка попытаться сделать одноногого прыгающего робота. Типа Pogo Stick, но без привлечения человека.
Цифровые схемы уже несколько приелись, и решил я развлечься чем-нибудь более человеческим. Благо, к СистемСи народ умудрился добавить расширение для работы с аналоговыми вещами.
Зацените: модель материальной точки с одной степенью свободы. Как бы аналоговый элемент с одним входом и двумя выходами. На входе воздействующая сила, на выходе скорость и координата. Внутренний параметр - масса.
SCA_TDF_MODULE(point_mass) {
sca_in force_in<double>;
sca_out velocity_out<double>;
sca_out position_out<double>;
double mass;
double position;
double velocity;
double time_last;
SCA_CTOR(point_mass) {
mass = 1.0; // 1 kg by default
position = 0;
velocity = 0;
time_last = 0;
}
void set_attributes() {
set_timestep(0.001, SC_SEC);
position_out.set_delay(1);
}
void processing() {
double force = force_in.read();
double time_now = get_time().to_seconds();
double delta_t = time_now - time_last;
velocity += delta_t * force / mass;
position += velocity * delta_t;
time_last = time_now;
velocity_out.write(velocity);
position_out.write(position);
}
};Добавляем второй элемент - пружину, получаем маятник. Результат симуляции выглядит вполне симпатично:

Полные исходники примера можно посмотреть здесь: https://code.google.com/p/vak-opensource/source/browse/#svn%2Ftrunk%2Fhardware%2Fsystemc-ams
Но все это не просто ради забавы. Есть у меня задумка попытаться сделать одноногого прыгающего робота. Типа Pogo Stick, но без привлечения человека.

Я НЕ МЕРЯЛ????
Date: 2014-10-21 18:28 (UTC)Кроме собственных измерений, я внимательно читал измерения, сделанные такими титанами индустрии как Сангвинетти.
Единственный вариант, когда SystemC может быть быстрее - это с повышением уровня абстракции за счет оперирования с более сложными структурами данным untimed алгоритмами.
Re: Я НЕ МЕРЯЛ????
Date: 2014-10-21 18:31 (UTC)Re: Я НЕ МЕРЯЛ????
Date: 2014-10-21 18:36 (UTC)Далее,
*** the SystemC Verification Library ***
Что-то тут не то. Мне на DVCON'11 сказали из SystemC, что SystemC Verification Library провалилась. Она что, воскресла?
*** It is true that you can also can made similar things using Verilog and PLI but is not so easy and here with simulating Verilog with PLI, the simulation is slower than one only with SystemC ***
Это не может быть "человек с опытом". "Человек с опытом" прекрасно должен знать, что после 2001 года (когда появился DirectC / DPI) любые слова про PLI - это введение читателя в заблуждение. Ибо общеизвестный факт, что PLI принципиально медленнее чем DPI, и говорить про PLI не упоминая DPI - это либо человек устарел лет на 15, либо вводит намеренно читателя в заблуждение. Это как судить о MIPS по MIPS R2000.
Даже SystemC внутри использует DPI для интерфейса с verilog-ом в VCS. Так на хрена делать заведомо некорректное сравнение, вводя в сравнение заведомо тормознутый PLI bottleneck?