約 3,156,328 件
https://w.atwiki.jp/bambooflow/pages/140.html
SystemC 動的プロセスについて メソッドを動的にSC_METHODやSC_THREAD指定することが可能。 普通のモデリング時には必要ないが、応用的なことに使用することがある。 たとえば、デバッグ機能を追加したい、とか、検証機能を強化したい、とか。 以下にその方法をメモる。 SystemC 動的プロセスについて動的プロセスを扱うための準備 使用する関数 動的methodを指定する記述例 動的threadを指定する記述例 動的プロセスを扱うための準備 以下のようにsytemc.hをインクルードする前にSC_INCLUDE_DYNAMIC_PROCESSESを定義する必要がある。 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h もしくは、コンパイルオプションの "-D"を使用する方法もある。 g++ -I/usr/local/systemc-2.2 -DSC_INCLUDE_DYNAMIC_PROCESSES -c model.cpp 使用する関数 sc_spawn プロセスを指定するときに使用する。 sc_bind プロセスとする関数を指定するときに使用する。 sc_bindはboost bindのdefine定義。 sc_spawn_options プロセスのオプション設定をする。たとえば、センシティブ指定とか。 戻り値なしで登録する場合 sc_process_handle hname = sc_spawn( /*void*/sc_bind( funcName, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); sc_process_handle hname = sc_spawn( /*void*/sc_bind( funcName, object, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); 戻り値ありで登録する場合 sc_process_handle hname = sc_spawn( returnVar, sc_bind( funcName, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); sc_process_handle hname = sc_spawn( returnVar, sc_bind( funcName, object, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); 動的methodを指定する記述例 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h SC_MODULE( DUT ) { sc_in sc_uint 8 din1; sc_in sc_uint 8 din2; sc_out sc_uint 9 dout; SC_CTOR( DUT ) { SC_THREAD( init_thread ); } void init_thread() { sc_spawn_options mth; mth.spawn_method(); mth.dont_initialize(); mth.set_sensitivity( din1 ); mth.set_sensitivity( din2 ); sc_spawn( sc_bind( DUT spawn_method0,this), "method0", mth ); } void spawn_method0() { dout.write( din1.read() + din2.read() ); } }; 注意として、sc_spawnの指定は、プロセス内に記述する。 コンストラクタに記述すると実行時エラーとなる。 動的threadを指定する記述例 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h SC_MODULE( DUT ) { sc_in bool clk; SC_CTOR( DUT ) { SC_THREAD( run ); } void run() { sc_spawn_options opt; opt.set_sensitivity( clk.pos() ); sc_spawn( sc_bind( DUT spawn_thread,this, false ), "thread0", opt ); } void spawn_thread( bool flag ) { while (true) { ・・・ wait(); } } }; 動的プロセスでは引数を渡したり戻り値を受け取ったりするができる。 例では、bool型の引数を渡している。
https://w.atwiki.jp/bambooflow/pages/53.html
SystemC なんとなく覚書き。 勉強のためにメモを残しているだけなので、間違いやテキトウな表現が大いにあります。賢いひとは参考にしないでください。 願わくばSystemCがもっと普及することを。 SystemCを始めるSystemCとは インストール(Linux,Cygwin,VC++EE) HelloWorld - 始めの一歩 Makefileの書き方 クロックカウンタを作る - モジュール定義を覚える 並列処理について - 並列処理動作を体感する Visual C++2008 Express Editionでの使用方法について SystemCの基本的な機能SystemCの基本データタイプ固定小数点 ユーザデータタイプ モジュール プロセス動的プロセスについて チャネルsc_clockクロック信号 sc_fifoチャネル 未分類検証環境モデル構成(テンプレート) SystemCのコアとなるクラス定義一覧 エラボレーション・フェーズ RTL記述 デバッグ 遅延モデル サンプル ビットアクセス 検証波形トレース レポート処理について SCV ↓まだまだ、勉強不足でわからないことだらけ。 間違いもあると思うので注意のほど。 TLM-2.0TLM-2.0について TLM-2.0クラス ジェネリック・ペイロード b_transportについて ブロッキング・インターフェースLTモデル Interconnect(ブロッキングI/F LTモデル) その他SystemC関連の歴史 コーディングスタイル(自分用) 用語集 参考ページ SystemCDoxygenマニュアル 関連サーチ Doxygenマニュアル 参考のためDoxygenを使ってみた。なかなか便利かも。 SystemC ver 2.1.v1 SystemC ver 2.2 TLM-1.0 TLM-2.0 Draft2 TLM-2.0 SCV-1.0p2 注意 packageとqtのフォルダは含めていない。 関連サーチ #bf
https://w.atwiki.jp/systemc/pages/16.html
SystemCのコンパイルを試す。 下記の記述がhello.cppにあるとすれば、 #include systemc using namespace sc_core; using namespace sc_dt; using namespace std; int sc_main(int argc, char **argv){ cout "Hello" endl; return 0; } g++ -o hello.x hello.cpp -I/usr/local/systemc-2.2/include -L/usr/local/systemc-2.2/lib-linux -lsystemc のようにコンパイルすることで、実行ファイルhello.xを作成することができる。/usr/local/systemc-2.2の部分は、SystemCをインストールしたディレクトリを記述する。lib-linuxの記述は、OSに合わせて変更する。 無事エラーなく作成できたら ./hello.xで実行しよう。 Hello と表示される。 SystemCのライブラリを使用するときに読み込むヘッダファイルは、systemcである。名前空間はsc_coreとsc_dtの2つが用意されている。dtは、data typeの略と思われ、sc_intなどのSystemCのデータ型が定義されている。SystemCのライブラリ中でmain()文が定義されているので、SystemCの記述はそのmain()文から呼び出されるsc_main()が最上位の記述となる。
https://w.atwiki.jp/systemc/pages/12.html
SystemC-2.3.1のインストール Accelleraのホームページからダウンロードする。特に修正しなくてもg++-4.9でコンパイル可能。修正以外の手順は2.2.0と同じ。 cygwin用は、configureするときに --enable-pthreadsのオプションが必要。 g++-4でのSystemC-2.2.0のインストール g++-4.9でコンパイルしようとするとエラーになる。エラー箇所(src/sysc/datatypes/bit/sc_bit_proxies.h)のmutableを消すとコンパイル可能ではあるが、他のバグもあるようなので、SystemC-2.3.1を使用するのがお勧め。 (ここから、2012年の記述) OSCIのホームページからダウンロードしてきたsystemc-2.2.0.tgzを展開する。 tar xvfz systemc-2.2.0.tgz 展開されたsystemc-2.2.0ディレクトリへ移動する。 cd systemc-2.2.0 src/sysc/utils/sc_utils_ids.cppの62行目に次の2行を加える。 #include cstdlib #include cstring src/sysc/kernel/sc_constants.hの中のSC_DEFAULT_STACK_SIZEは大きくした方が良い。0x50000くらいがお勧め。 作業用のobjdirディレクトリを作成する。 mkdir objdir objdirディレクトリへ移動する。 cd objdir CXX環境変数を設定した方が良いかもしれない。 export CXX=g++ コンパイル環境を構築する。 ../configure もし、環境を指定したい場合は、 ../configure --help で確認する。次のようにインストール場所を指定する場合が多い。 ../configure --prefix=/usr/local/systemc-2.2 インストール場所は、あらかじめ作成しておくこと。 コンパイルを行う。 make ライブラリなどをインストールする。 make install 2015-05-06 20 39 52 (Wed) -
https://w.atwiki.jp/systemc/pages/27.html
高位合成 高位合成の定義は、学会でも業界でもきちんと定まっていないように思える。ここでは、高位合成(High Level Synthesis)は、RTL(Register Transfer Level)からの論理合成よりも抽象度の高い記述から自動的に論理回路を生成することと定義する。 入力がC言語などのプログラム言語であっても、HDL(Hardware Discription Language)で表現できるような内容のものしか受け付けないものが高位合成として市販されている場合もあるので、ユーザとしてはツールの機能をしっかり確認する必要がある。 動作合成 また、高位合成と同様な場面で使われる動作合成(Behavioral Synthesis)を、データパスに対するスケジューリングとリソースシェアリング(複雑な演算を時分割して演算器とレジスタを共用する)を自動生成する機能と定義する。 SystemCの高位合成ツールに望まれる機能 SystemCを用いた高位合成には、下記の機能が望まれる。 動作合成 インタフェース合成 関数型かオブジェクト指向による表現の抽象化 並列処理、処理タイミング、モジュール化、外部端子を表現する手段 高位の記述とは データパスの記述であれば、スケジューリングとリソースシェアリングを行う前の動作合成される記述が高位合成用の記述と考えられる。高位合成の価値はそれだけではないので、データパスのない制御系の記述で考えてみる。 汎用性の高い記述 動作の目的を明確にする。具体的な実装については、別の場所で定義する。 信号で進めと合図する。 signal.show(sign_go); 具体的な記述 動作を表現する。しかし、これでもまだ具体的な実装については、別の場所で定義する。 信号を青にする。 signal.set(color_blue); 詳細な記述 実装をそのまま記述する。ここまで記述するのであれば、高位合成は必要ない。 信号の青色灯を点灯する。黄色灯と赤色灯を消す。 signal.blue = true; signal.yellow = false; signal.red = false; 参考 動作合成 http //techon.nikkeibp.co.jp/article/WORD/20090107/163727/ SystemC推奨設計メソドロジ 合成編 http //jeita-edatc.com/users_lib/SystemC_DM_for_synthesis_080428.pdf SystemC Synthesizable Subset 1.3 draft Synthesis Working Group of Open SystemC Initiative 2014-02-11 13 14 07 (Tue) -
https://w.atwiki.jp/systemc/pages/20.html
SystemC-AMSの紹介 SystemC-AMSは、Embedded Analog/Mixed-Signal(E-AMS) systemを取り扱う。デジタルの領域を扱うSystemCにアナログの領域を扱う手段を追加している。次のような目的で使われることを想定している。 実行可能仕様書 (Executable specification) 仮想試作 (Virtual prototyping) アーキテクチャ探索 (Architecture exploration) 実装検証 (Integration validation) SystemC-AMSのアナログシステムのモデル化の方法には次の3通りが用意されている。 Timed Data Flow (TDF) 離散時間の非線形な表現が可能。時間軸と周波数軸の処理を別々に定義する。 Linear Signal Flow (LSF) 連続時間の線形な数式を扱う。 Electrical Linear Network (ELN) 線形なふるまいをする部品(抵抗、コンデンサ、コイルなど)で回路を表現する。 TDFのモジュールはユーザが定義するが、LSFとELNでは用意されたモジュールを利用する前提になっている。これらのモジュールを含む上位階層はsc_moduleである。時間軸解析と小信号(周波数)解析を行うことができる。SPICEのような非線形解析はできない。 SystemC-AMS名前空間 TDFのモジュール LSFのモジュール ELNのモジュール 小信号(周波数)解析 時間軸解析 2012-02-15 18 47 06 (Wed) -
https://w.atwiki.jp/systemc/pages/21.html
SystemC-AMSライブラリのキーワードはsca_で始まる。マクロはSCA_で始まる。 AMSの基本的なクラスは名前空間sca_coreにある。 トレースやデータ型のようなユーティリティクラスは名前空間sca_utilにある。 モデル化の手法ごとに名前空間(namespace)が用意されている。 モデル化の手法 名前空間 TDF sca_tdf LSF sca_lsf ELN sca_eln モデル化手法にかかわらず同等なクラスがある場合は、名前空間で区別される。 たとえば、TDF用のモジュールのクラスはsca_tdf sca_moduleである。 2012-01-30 21 04 15 (Mon)
https://w.atwiki.jp/bambooflow/pages/128.html
SystemC プロセスについて SystemC プロセスについてプロセスとは プロセスの種類SC_METHOD SC_THREAD SC_CTHREAD プロセスとは プロセスはプログラムが並列動作するための機構の1つ。 シミュレーションが開始されると、プロセスとして指定された関数(プロセス関数)が実行される。 プロセス関数は1つのモジュールに複数存在することも許される。 ソフトウェアの場合、プログラムは上から順に逐次実行の動作となるが、ハードウェアの場合には並列動作となるため、ピュアなCやC++ではハードウェアを表現するには難がある。並列動作を可能賭したのがSystemCであり、プロセスはSystemCの特徴の1つとなっている。 プロセスは、Verilog-HDLでいうところのinitial文やalways文に該当する。 プロセスの種類 次の3つが存在する。 SC_METHOD SC_THREAD SC_CTHREAD それぞれマクロとなっているが、詳しい説明はしない。 SC_METHOD Verilog-HDLのalways文に似ている。 センシティビティ・リストの記述が必要。 シミュレーション中、何度でも呼び出される。 プロセス内にwait記述することはできない。 プロセス内に無限ループを構成してはならない。 このプロセスでは機能記述することは少ない。 RTL記述の表現に使用したり、信号の受渡しのタイミング調整に使う程度。 構文 void process_func(); // 戻り値はvoid、引数もvoid、もしくは記述しない SC_METHOD( process_func ); RTL組合せ回路記述例 SC_MODULE( MOD ) { sc_in sc_uint 8 in_a; sc_in sc_uint 8 in_b; sc_out sc_uint 9 out; SC_CTOR( MOD ) { SC_METHOD( adder_method ); sensitive in_a in_b; } void adder_method() { out.write( in_a.read() + in_b.read() ); } RTLのF/F回路生成 sc_in_clk Clk; sc_in bool ResetN; sc_in sc_uint 8 a; sc_in sc_uint 8 b; sc_in sc_uint 8 z; SC_CTOR( MOD ) { SC_METHOD( method0 ); sensitive Clk.pos() ResetN.neg(); } void method0() { if (!ResetN.read()) { z.write( 0 ); // リセット記述 } else { z.write( a.read() + b.read() ); } } SC_THREAD Verilog-HDLのinitial文に似ている。 シミュレーション開始時の1度だけ呼び出される。プロセスの実行が終了してしまうと再度呼ばれることはないため、通常はwhile(true){}を使って無限ループを構成してその中に機能記述する。 センシティビティ・リストの記述が可能。センシティビティ・リストはなくてもよい。 このプロセスを使用して機能記述することが多い。 3つのプロセスの中で、もっともアルゴリズムを記述するのに敵している。 構文 void process_func(); // 戻り値はvoid、引数もvoid、もしくは記述しない SC_THREAD( process_func ); 記述例 SC_CTOR( ) { SC_THREAD( main_thread ); } void main_thread() { while (true) { // ここに機能を記述 wait( event ); } } SC_CTHREAD SC_THREADに似ているが、クロック動作の記述専用のTHREADである。 センシティビティ・リストは持たない。 wait記述はクロック・イベントを待つ動作となる。 reset_signal_isによりリセット動作が記述可能。 SC_THREADに比べてシミュレーション速度が遅くなる。 構文 sc_in_clk CLK; // クロック信号(sc_clockとつなぐ) void process_func(); // 戻り値はvoid、引数もvoid、もしくは記述しない SC_CTHREAD( process_func, clk.pos() ); 記述例 sc_in_clk CLK; sc_in bool RESET_N; SC_CTOR( ) { SC_CTHREAD( main_thread, CLK.pos() ); reset_signal_is( RESET_N, false ); } void main_thread() { // ここにリセット動作を書く wait(); while (true) { // ここに機能を記述 wait(); } }
https://w.atwiki.jp/bambooflow/pages/145.html
SystemCとは SystemCとはSystemCとは? SystemCが持つ機能 SystemCの利点 SystemCの欠点 SystemCの使い道 SystemCを扱うにあたっての要求スキル SystemCとは? SystemCは、1999年9月に発足した組織OSCI(Open SystemC Initiative)により規格化された、新しいハードウェアモデリング言語である。OSCIから無償でSystemCライブラリが提供されている。 SystemCは、標準のC++で実装されたクラスライブラリで、C++記述によるハードウェア設計の構築を提供する。SystemCを利用できるのは、ハードウェアとソフトウェアにおけるの企画・提案から実装までの設計と検証の期間である。つまり、実際にハードウェアを設計する前段階の作業で利用することができる。 SystemCは高速なシステムレベルC++モデルの開発と交換を可能とするプラットフォームを提供する。 これはシステムレベルツールの開発のためのプラットフォームも提供する。 簡単に言うと、C++のコンパイラを使ってハードウェア記述が可能で検証もできてしまう優れもの。 ただし、SystemCを記述したからといって、それを直接ハードウェアにできるというわけではない。あくまでもハードウェアの代替となる検証用どまり。 ただ、高位合成ツール(SystemC→RTL)が徐々に実用化されつつあるところ。 先はまだわからない。 SystemCが持つ機能 C++でハードウェアを記述するために、SystemCライブラリは次のような特徴的な機能を持つ。 時間モデル ビット・データ型(sc_bv , sc_uint , sc_fixed, etc.) モジュールの記述(SC_MODULE) チャネル/ポート(プリミティブ・チャネル、階層チャネル、インターフェース) 並列動作環境(プロセス) 波形シミュレーション環境(VCD etc.) SystemCの利点 ライブラリが無償で提供されている C++ベースであるため、検証環境が容易に構築できる(GCCもしくはVC++コンパイラ) ソフトウェア/ハードウェア協調検証が比較的容易にできる あらゆる抽象度(TLMからRTLまで)が記述可能 SystemCの欠点 C++の基本的な知識とSystemC固有の記述を覚えなくてはならず、スタートまで若干ハードルがある プロセス間のタイミングでクセがあり悩まされる 記述の自由度が高すぎて、モデルの統一化がなされていない SystemCの使い道 SW/HW協調検証 高位合成(動作合成) 並列分散処理モデル etc. SystemCを扱うにあたっての要求スキル C,C++の知識があり、クラスの概念やテンプレートがわかる(協調検証モデル作成) Verilog-HDL等のハードウェア記述等に興味があり精通している(高位合成)
https://w.atwiki.jp/bambooflow/pages/142.html
SystemCのモジュール定義について(SC_MODULE) SystemCのモジュール定義について(SC_MODULE)モジュール構文SC_MODULEマクロを使わないモジュールの構文 モジュールの構成部品モジュール SC_MODULE SC_MODULEクラスのコンストラクタ SC_CTOR 実行の単位 プロセス(SC_METHOD, SC_THREAD, SC_CTHREAD) モジュール複製の回避 マクロ定義SC_MODULEのマクロ定義 SC_CTORのマクロ定義 SC_HAS_PROCESSのマクロ定義 モジュール構文 SystemCの基本的なモジュール定義はつぎのようになる。 C++があまりよくわからない人は、とりあえずこういうものなんだ、と思っておけばよいかと。 #include systemc.h SC_MODULE( ModuleName ) { // ポート宣言(sc_port, sc_in, sc_out等) // メンバ・チャネル(sc_signal, sc_buffer等) // メンバ・データ(int, char, unsigned long等) // プロセス・メソッド(プロセス) // ヘルパ・メソッド // コンストラクタ SC_CTOR( ModuleName ) // 初期化 { // サブモジュールのインスタンス // サブもジュールの信号接続 // プロセス登録 // 静的センシティビティ設定 // ユーザ定義の各種設定 } // デストラクタ ~ModuleName() { } }; SC_MODULEマクロを使わないモジュールの構文 C++をわかっている人にとってはこちらの書き方の方がわかりやすいかもしれない。 #include systemc.h class ModuleName public sc_module { public SC_HAS_PROCESS( ModuleName ); // コンストラクタ ModuleName( sc_module_name m_name ) sc_module( m_name ) { } }; SC_HAS_PROCESSはモジュール(のコンストラクタ)内でプロセス登録をしている場合は必ず必要になる。コンストラクタをSC_CTORマクロで記述している場合は、このSC_HAS_PROCESSの記述は必要ない。 もし、プロセス登録がないモジュールでもSC_HAS_PROCESSが宣言されていたからといってエラーになることはないので、とりあえず書いておくことをお薦めする。 SC_HAS_PROCESSは単なるtypedefのマクロにすぎない。 モジュールの構成部品 モジュール SC_MODULE SystemCでハードウェアの1つの機能を記述するためのデザインの最小単位はSC_MODULEである。 Verilog-HDLでいうところのmoduleにあたる。 とにもかくにもこのSC_MODULEを作らなければ始まらない。 SC_MODULEはマクロで、C++のクラスを宣言することになる。 SC_MODULEでは以下の要素を構築する。 ポート(sc_port, sc_in, sc_out等) メンバ・チャネル(sc_signal, sc_buffer等) メンバ・データ(int, char, unsigned long等) コンストラクタ(SC_CTOR) デストラクタ プロセス・メソッド(プロセス) ヘルパ・メソッド SC_MODULEクラスのコンストラクタ SC_CTOR SC_MODULEのコンストラクタはSC_CTORというマクロが用意されている。 SC_MODULEのコンストラクタではSystemC特有の以下の処理を行う。 サブデザインの初期化/アロケーション サブデザインの接続(bind) SystemCカーネルへのプロセス登録(SC_METHOD, SC_THREAD, SC_CTHREAD) 静的センシティビティの設定(sensitive, reset_signal_is等) ユーザ定義の各種設定 実行の単位 プロセス(SC_METHOD, SC_THREAD, SC_CTHREAD) ハードウェアを表現するためにSystemCでは並列処理を表現することができる。 並列処理は関数が単位となる。 SystemCでは、並列処理に設定した関数のことをプロセスと呼ぶ。 プロセスの登録はSC_MODULEのコンストラクタで行う必要がある。それ以外では行わない。 SC_THREADのプロセス登録の例は次のとおり。 SC_MODULE( Model ){ ・・・ void func_thread(); // constructor SC_CTOR( Model ) { SC_THREAD( func_thread ); } }; モジュール複製の回避 モジュール複製は望ましくない。 たいていは暗黙のルールでモジュールのコピーはしないもの。 コピーコンストラクタと代入演算子関数をprivateで定義することでモジュールのコピーを許さないようにできる。 次にその記述を示す。 SC_MODULE( MyModel ) { SC_CTOR( MyModel ) { } private MyModel( const MyModel ) {} // コピーコンストラクタの禁止 MyModel operator=( const MyModel ) { return *this; } // 代入演算の禁止 }; こうすることで、万一モジュールの複製をしようとしても、コンパイル時にエラーとして怒られる。 マクロ定義 SC_MODULEのマクロ定義 SC_MODULEはsc_module.hで以下のように宣言されている。 #define SC_MODULE(user_module_name) \ struct user_module_name sc_core sc_module SC_CTORのマクロ定義 SC_MODULEのコンストラクタであるSC_CTORはsc_module.hで次のように定義されている。 #define SC_CTOR(user_module_name) \ typedef user_module_name SC_CURRENT_USER_MODULE; \ user_module_name( sc_core sc_module_name ) SC_HAS_PROCESSのマクロ定義 SC_HAS_PROCESSはsc_module.hで次のように定義されている。 #define SC_HAS_PROCESS(user_module_name) \ typedef user_module_name SC_CURRENT_USER_MODULE