Comments
Description
Transcript
を使ったシステム設計
を使った システム設計 デバイスの記事 システムの記事 を使ったシステム設計 第8回 プリミティブ・チャネルを使った記述 長谷川裕恭,小川丈博 今回は,モジュール間を接続する通信手段を定義するプリミ ● インターフェース・メソッドを実装したものがチャネル ティブ・チャネルのうち,sc_signal,sc_buffer,sc_ 連載第5回(本誌2003年12月号,pp.126-135)の最後に紹 fifo の詳細な記述例を紹介する.sc_signal チャネルと 介したインターフェース接続の概念図を図1に示します.前 sc_buffer チャネルは,HDL のノンブロッキング代入と同 回紹介した純粋仮想関数と派生クラスを使って実現したの じ機能を実現するしくみを搭載している.一方,sc_fifo が,このインターフェースです. チャネルは内部にFIFOバッファを搭載している. (編集部) インターフェースは sc_interface を継承します. sc_interface は特に何もしませんが,このクラスを継 前回(本誌2004年3月号,pp.107-114)と前々回(本誌2004 承しないと port 接続でエラーが発生します.自分で作成 年2月号,pp.132-138)は,SystemCを理解するために必要 したインターフェース・メソッドは,アロー演算子 -> で となるC++の基本的な考えかた,およびその構文について 接続します.-> は,sc_port クラスで多重定義されてい 解説しました.今回は,まずインターフェースと て,インターフェース・メソッドを参照できるようにくふ チャネルの考えかたについて説明し,その後,プリミティ うされています.sc_signal,sc_buffer は,ドット ブ・チャネルである sc_signal , sc_buffer , sc_ (A_Signal.write(A))接続できますが,これは特別な fifo の具体的な記述例を紹介します. しくみがあらかじめ組み込まれているためです. チャネル(モジュール) モジュール ポート プロセス SC_MODULE( SMaster ) { sc_port<my_if> Din; .... }; void SMaster::MProcess() { .... Din->write(Data); } インターフェース class my_if : virtual public sc_interface { public: virtual bool write (sc_uint<32> Din) = 0; }; IMC(interface method call) 図1 class MyChannel : public my_if,sc_module { public: bool write( sc_uint<32> Din) { .... sc_signal,sc_eventへの代入 } } ポートとインターフェース インターフェース接続の概念図.I/Oは,ポートとインターフェースに分かれる.インターフェースは,C++ のクラス継承と純粋仮想関数を利用している.仮想 関数 write の実態は,チャネルの中で定義されている.この例では,SC_MODULE 内で write 関数が呼ばれると,チャネルの中身に直接アクセスしにいく. Design Wave Magazine 2004 May 139 Design Wave Magazine (p.139 ; ; ; ) インターフェース(テンプレート) my_if.h ヘッダ・ファイル #include <systemc.h> クラス・テンプレート宣言 template <class T> class my_if : virtual public sc_interface{ public: virtual bool write(T Din) = 0; }; SC_MODULE(SMaster) { sc_in_clk clk; sc_port<my_if<int> > my_port; ... } my_ifの型を指定 intをTに変更 チャネル(テンプレート) my_channel.h #include <systemc.h> #include "my_if.h" my_module.h #include <systemc.h> #include "my_channel.h" システム my_ifの型を指定 main.cpp #include <systemc.h> #include "my_module.h" template <class T> class my_channel : public my_if<T> { public: virtual bool write(T Din) { int sc_main(int argc, char* argv[]) { my_channelの型を指定 sc_clock clk; my_channel<int> my_ch; ... intをTに変更 図2 図3 テンプレートのインターフェースへの応用 テンプレートの使用 int が指定されているので,T は int に置き換わる.sc_signal,sc_ in,sc_out はこのテンプレートを活用し,どのデータ型にも対応したイ インターフェース接続にテンプレートを使用している.テンプレートは,使 用する変数のデータ型を限定せず,インターフェースを宣言するときに決め ることができる.template <class T> とすると,宣言時に T が指定 した型に置き換わる. ンターフェースを実現している. 図 2 にインターフェースとチャネルの記述を示します. インターフェース・メソッドを実装したモジュールは チャネルと呼ばれます.チャネルには,インターフェー template <class T> とすると,宣言時に Tが指定した ス・メソッドのほかに,sc_module で記述できるすべて タイプに置き換わります.図3が my_channel を使用した のものを記述できます.チャネルの中にプロセスを持った 例になります.ここでは int が指定されているので,T は ものを階層チャネルと呼びます.階層チャネルでは,モ int に置き換わります. sc_signal , sc_in,sc_ ジュールとチャネルの区別はありません.階層チャネルは, out は,このテンプレートを活用し,どのデータ型にも対 通常のモジュールにインターフェース・メソッドを付加し 応したインターフェースを実現しています. たものと考えてください.sc_signal,sc_buffer を使 sc_signal,sc_buffer は,プリミティブ・チャネル った接続と比較すると,チャネルとインターフェースには と呼ばれています.プリミティブ・チャネルは,プロセス 次のようなメリットがあります. を持たないチャネルで,主にモジュール間を接続する通信 ¡ハンドシェーク接続が一つの関数のように扱える 手段のみを定義します.これに対して,内部にプロセスを ¡信号スケジューリングが行われないので,シミュレー 持つチャネルが階層チャネルです. ション速度が速い ● あらかじめ組み込まれているプリミティブ・チャネル ¡インターフェース部分を置き換えることで簡単に詳細化 できる プリミティブ・チャネルは,SystemCのライブラリにあ インターフェース部分の詳細化は「アダプタ」と呼ばれて らかじめ組み込まれており,ハードウェアの並行動作を実 います.こちらについては,次回に解説します. 現するための評価・更新のしくみを搭載しています. SystemC v.2.0.1で実装されているプリミティブ・チャネル ● テンプレートをインターフェースに応用する には, sc_signal , sc_buffer のほかに sc_fifo , インターフェース接続にテンプレートを使用してみます. sc_mutex,sc_semaphre があります. テンプレートは,使用する変数のデータ型を限定せず,イ sc_signal,sc_buffer チャネルは,HDLのノンブ ンターフェースを宣言するときに決めることができます. ロッキング代入と同じ機能を実現するしくみを搭載してい 140 Design Wave Magazine 2004 May Design Wave Magazine (p.140 ; ; ; )