[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7. デバイス

計算機内部のデバイスを表す以下のクラスが提供される。これらのデバイスは ユニットを実装する際にユーザに対してハードウェアの持つ機能のみを提供す るものであり、ポートとパケットによる通信やクロック入力による自律動作を 行うものではない。

7.1 cache_line_baseクラス  
7.2 simple_cache_lineクラス  
7.3 cache_line_setクラス  
7.4 directmap_cacheクラス  
7.5 set_associative_cacheクラス  
7.6 instruction_bufferクラス  
7.7 register_fileクラス  
7.8 write_bufferクラス  
7.9 memoryクラス  
7.10 mapped_memoryクラス  
7.11 memory_mapクラス  
7.12 sysinfo_mapクラス  
7.13 fileio_mapクラス  
7.14 argument_mapクラス  
7.15 crossbarクラス  
7.16 network_packet_senderクラス  
7.17 network_packet_receiverクラス  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.1 cache_line_baseクラス

キャッシュラインを表すクラスの基底クラス。オブジェクト内にキャッシュラ インのアドレスタグ、キャッシュラインデータを内包している。このクラスは 3つの型引数を取るクラステンプレートで、第一引数はアドレスの型、第二引 数はデータの型、第三引数はコンテナの型である。キャッシュラインの状態は 定義されていない。実際のキャッシュラインの状態は派生クラスで定義する必 要がある。

派生クラスは、以下の仮想関数を定義しなければならない。

virtual bool is_valid(void) const
キャッシュラインが有効であれば真を返す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.2 simple_cache_lineクラス

有効と無効の2状態を持つ単純なキャッシュラインを表すクラス。 cache_line_baseクラスの派生クラスである。See section 7.1 cache_line_baseクラス.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.3 cache_line_setクラス

ウェイ数分のキャッシュラインを表すクラス。キャッシュラインの型を引数と するクラステンプレートである。例えば2ウェイのキャッシュなら、このクラ スのオブジェクトは2つのキャッシュラインを内包する。また、ラインの追い 出し制御のためのLRUカウンタのテーブルも内蔵している。 See section 7.1 cache_line_baseクラス.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.4 directmap_cacheクラス

ダイレクトマップ方式のキャッシュを表すクラス。キャッシュラインの型を引 数とするテンプレートクラスである。キャッシュサイズ、ラインサイズは2のn 乗の値で指定する。2のn乗でない値を指定しても、自動的に指定した値より大 きい2 のn乗の値に補整される。

directmap_cache(address_type a, address_type b)
キャッシュサイズaバイト、ラインサイズbバイトのキャッシュを 構築する。

address_type cache_size(void) const
キャッシュサイズを参照する。値はバイト単位である。

address_type line_size(void) const
キャッシュラインサイズを参照する。値はバイト単位である。

size_t line_size_in_word(void) const
キャッシュラインサイズを参照する。値はワード単位である。

address_type tag_address(address_type) const
引数で示されるアドレスのデータをキャッシュに格納した場合の、キャッシュ ラインの先頭アドレスを返す。

bool is_hit(address_type) const
引数で示されるアドレスのデータをキャッシュ内に格納していれば真を返す。

bool is_valid(address_type) const
引数で示されるアドレスのデータを格納するラインが有効であれば真を返す。

address_type read_address(address_type) const
引数で示されるアドレスに対応するタグのアドレス値を返す。

data_type read(address_type) const
引数で示されるアドレスに対応するデータを返す。

void write(address_type a, data_type b)
引数で示されるアドレスに対応するタグにa、データにbを書き込 む。

void clear(void)
キャッシュの値をクリアする。

void resize(address_type, address_type)
キャッシュサイズを変更する。第一引数でキャッシュサイズ、第二引数でライ ンサイズを指定する。値はどちらもバイト数である。負の値を指定した場合は 変更は行われない。また、サイズ変更が行われるとキャッシュ内の値は全て消 去される。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.5 set_associative_cacheクラス

セットアソシアティブキャッシュデバイスを表すクラス。キャッシュラインを 型引数とするテンプレートクラスとして実装されている。 See section 7.1 cache_line_baseクラス.

set_associative_cache(address_type, address_type, size_t)
第一引数で示されるキャッシュサイズ(バイト単位)、第二引数で示されるキャッ シュラインサイズ(バイト単位)、第三引数で示されるウェイ数のキャッシュを 構築する。

const line_set_type& cache_line_set(address_type) const
line_set_type& cache_line_set(address_type)
引数で示されるアドレスに対応するキャッシュラインセットを参照する。

address_type cache_size(void) const
キャッシュサイズをバイト単位で取得する。

address_type line_size(void) const
キャッシュラインサイズをバイト単位で取得する。

size_t way_size(void) const
ウェイ数を取得する。

size_t line_size_in_word(void) const
キャッシュラインサイズをワード単位で取得する。

int max_lru_counter(void) const
キャッシュラインの追い出しで使用されるLRUカウンタの最大値として現在設 定されている値を取得する。

address_type tag_address(address_type) const
引数で示されるアドレスに対応するキャッシュラインの先頭アドレスを取得す る。

size_t line_offset(address_type) const
引数で示されるアドレスの、対応するキャッシュライン内でのオフセットを取 得する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.6 instruction_bufferクラス

パイプライン化された命令バッファを表すクラス。命令の型を型引数とするク ラステンプレートである。step関数を呼び出すごとにステージがシフ トされる機能を持つ。例えばある時点でステージ0で参照されたステージは、 次の時点ではステージ1で参照されるようになる。

size_t size(void) const
ステージの総数を参照する。

value_type& operator[](size_t i)
i番目のステージを参照する。

void clear(void)
命令バッファをクリアする。

void step(void)
ステージを1つ進める。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.7 register_fileクラス

レジスタファイルを表すクラス。レジスタの型を型引数とするクラステンプレー トである。機能的にはSTLのvectorのサブセットに近いが、オブジェク ト構築後にサイズを変更することはできない。

const_reference operator[](size_t i) const
reference operator[](size_t i)
i番目のレジスタを参照する。

size_type size(void) const
レジスタファイルのサイズを得る。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.8 write_bufferクラス

プロセッサ内部のライトバッファを表すクラス。アドレスとデータの対をワー ド単位で格納する待ち行列である。アドレス型address_typeとデータ 型address_typeを型引数としたクラステンプレートである。

size_t size(void) const
バッファの大きさ(最大長さ)を得る。

size_t length(void) const
待ち行列の長さを得る。

bool empty(void) const
待ち行列が空かどうか調べる。
bool full(void) const
待ち行列が満たされているかどうか調べる。

bool buffered(address_type) const
引数で示されたアドレスへの書き込みが格納されていれば真を返す。

data_type read(address_type) const
引数で示されたアドレスへの書き込みが格納されていれば、そのアドレスへ書 き込む値を返す。同じアドレスへの書き込みが複数格納されている場合は、最 も最後に行われる書き込みの値が返される。アドレスが一致する書き込みがな い場合はダミーの値を返す。

address_type address(void) const
待ち行列の先頭要素のアドレスを参照する。

data_type data(void) const
待ち行列の先頭要素のデータを参照する。

void clear(void)
待ち行列を空にする。

void push(address_type, data_type&)
待ち行列の最後に要素を追加する。

void pop(void)
行列の先頭要素を捨てる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.9 memoryクラス

ハードウェアの記憶装置を表現するクラステンプレートである。アドレスの型 はクラスの第一型引数、格納するデータの型はクラスの第二型引数で示される。 このクラス自身はユニットを表現してはいない。時間の概念を持たず、状態遷 移も行われない。このmemoryクラスをシミュレータ上で実際に使用す るためには、メモリコントローラに相当する機能を付加する必要がある。

memoryクラスは記憶領域の大きさの情報を管理している。記憶領域サ イズはバイト単位で扱われる。

アドレス指定は、ワード単位のアクセスではワード単位のみがサポートされ、 ワード境界にまたがったアドレスを指定しても、ワード境界に補整されたアド レスが使用される。バイト単位のアクセスは、設定したエンディアンに応じて 行われる。エンディアンは何も指定しなければビッグエンディアンに設定され ている。

7.9.1 memoryクラスの定義  
7.9.2 memoryクラスの使い方  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.9.1 memoryクラスの定義

memory(void)
サイズ0のメモリを構築する。

memory(address_type a)
サイズaのメモリを構築する。

address_type size(void) const
サイズを取得する。

bool is_valid(address_type) const
引数で示されたアドレスが記憶領域内にあるかどうかを判別する。

void resize(address_type)
サイズを変更する。

bool is_big_endian(void) const
ビッグエンディアンに設定されていれば真を返す。

bool is_little_endian(void) const
リトルエンディアンに設定されていれば真を返す。

void set_big_endian(void)
ビッグエンディアンに設定する。

void set_little_endian(void)
リトルエンディアンに設定する。

data_type read(address_type) const
第一引数で示されたアドレスのワードを読み込む。

char_type read_char(address_type) const
第一引数で示されたアドレスの文字を読み込む。

void write(address_type, data_type)
第一引数で示されたアドレスに第二引数で示されたデータを書き込む。

void write_char(address_type, char_type)
第一引数で示されたアドレスに第二引数で示された文字を書き込む。

void clear(void)
記憶領域全体を0クリアする。

void dump(ostream&) const
引数で示されるストリームにメモリ内容を出力する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.9.2 memoryクラスの使い方

memoryクラスは内部で動的にページ単位で自由記憶領域管理を行って おり、要求されたサイズのメモリをすぐには確保しない。0でない値が書き込 まれた時点でページ毎に実体が確保される。従って1Gといったような莫大な量 の記憶領域を要求しても、実際に巨大な領域を使用しなければリソースが不足 することはない。

以下は先頭アドレス0x10000000、サイズ1Gのメモリを確保し、アドレ ス0x2000から0x3000までに0xffffffffを書き込む例で ある。

 
typedef unsigned word;

const word size = 1024 * 1024 * 1024; // size: 1G
const word area_top = 0x2000, area_size = 0x1000;
memory<word, word> mem(size);
for (int i = 0; i < area_size; i += sizeof(word)) {
    write(area_top + i, 0xffffffffU);
}


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.10 mapped_memoryクラス

メモリマップ上に配置されたメモリブロックを表すクラス。先頭アドレスとサ イズを管理する。バッファ内のメモリはmemoryクラスで実装されてい る。

mapped_memory(void)
サイズ0のメモリを構築する。

mapped_memory(address_type a, address_type b)
先頭アドレスa、サイズbのメモリを構築する。

address_type top(void) const
先頭アドレスを取得する。

size_type size(void) const
サイズを取得する。

address_type bottom(void) const
終端アドレス(先頭アドレス + サイズ)を取得する。

bool is_valid(address_type) const
引数で示されたアドレスが記憶領域内にあるかどうかを判別する。

address_type top(address_type)
先頭アドレスを変更する。

void resize(size_type)
サイズを変更する。

bool is_big_endian(void) const
ビッグエンディアンに設定されていれば真を返す。

bool is_little_endian(void) const
リトルエンディアンに設定されていれば真を返す。

void set_big_endian(void)
ビッグエンディアンに設定する。

void set_little_endian(void)
リトルエンディアンに設定する。

data_type read(address_type) const
第一引数で示されたアドレスのワードを読み込む。

char_type& read_char(address_type) const
第一引数で示されたアドレスの文字を読み込む。

void write(address_type, data_type)
第一引数で示されたアドレスに第二引数で示されたデータを書き込む。

void write_char(address_type, char_type)
第一引数で示されたアドレスに第二引数で示された文字を書き込む。

void clear(void)
記憶領域全体を0クリアする。

void dump(ostream&) const
引数で示されるストリームにメモリ内容を出力する。

void dump(ostream&, address_type a, address_type b) const
第一引数で示されるストリームに、先頭アドレスa、サイズbの領 域のメモリ内容を出力する。

virtual void disassemble(ostream&, address_type a, address_type b) const
第一引数で示されるストリームに、先頭アドレスa、サイズbの領 域のメモリ内容のディスアセンブル結果を出力する。memoryクラスで は何も処理を行わない関数になっている。ディスアセンブル機能を持つ継承ク ラスで使用するために用意されている。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.11 memory_mapクラス

プロセッサから見たアドレス空間を統合して扱うメモリマップを提供するクラ ス。登録されているメモリ全体をまとめて取り扱うためのインタフェースを持 つ。

bool is_valid(address_type) const
引数で示されるアドレスが記憶領域内にあるかどうかを判別する。

data_type read(address_type) const
第一引数で示されるアドレスのワードを読み込む。

char_type read_char(address_type) const
第一引数で示されるアドレスの文字を読み込む。

void write(address_type, data_type)
第一引数で示されるアドレスに第二引数で示されるデータを書き込む。

void write_char(address_type, char_type)
第一引数で示されるアドレスに第二引数で示される文字を書き込む。

void insert(const mapped_memory_type&)
引数で示されるメモリをメモリマップに追加する。追加されるメモリのアドレ ス空間がまだ使用されていなければ、追加が行われる。

void erase(const mapped_memory_type&)
引数で示されるメモリをメモリマップから削除する。

void dump(ostream&) const
引数で示されるストリームにメモリ内容を出力する。

void dump(ostream&, address_type a, address_type b) const
第一引数で示されるストリームに、先頭アドレスa、サイズbの領 域のメモリ内容を出力する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.12 sysinfo_mapクラス

アーキテクチャ固有の情報を格納するデータベースを作成するクラス。メモリ マップの受け渡しや実行結果の参照など、ホストマシンとシミュレータ上のソ フトウェア間の通信に用いられる。実体は変数名と値の対を記憶する連想配列 である。各変数には整数値または文字列を格納することが可能である。

void set(const string&, T)
第一引数で示される名前の変数に、第二引数で示される整数値を登録する。

void set(const string&, const string&)
第一引数で示される名前の変数に、第二引数で示される文字列値を登録する。

void unset(const string&)
引数で示される名前の変数を消去する。

void clear(void)
すべての変数を消去する。

bool is_defined(const string&)
引数で示される名前の変数が定義されていれば真を返す。

bool is_integer(const string&)
引数で示される名前の変数が整数値として定義されていれば真を返す。

bool is_string(const string&)
引数で示される名前の変数が文字列値として定義されていれば真を返す。

T get_integer(const string&)
引数で示される名前の変数の整数値を返す。

const string& get_string(const string&)
引数で示される名前の変数の文字列値を返す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.13 fileio_mapクラス

ファイルテーブルを管理するデータベースを作成するクラス。シミュレータ上 のソフトウェアのファイルアクセスに用いられる。ソフトウェア側からのファ イルアクセス要求を、標準入出力を含めたストリーム操作に写像する。ファイ ルテーブルは0からの通し番号で管理される1次元配列で、各ファイルは以下の 3つの属性、およびストリーム実体で管理される。

void fileio_map(void)
空のファイルテーブルを作成する。

void fileio_map(size_t)
引数で指定された大きさのファイルテーブルを作成する。

void set_standard_io(void)
標準入出力と結び付ける。ファイル0がcin、ファイル1がcout、 ファイル2がcerrに接続される。

size_t size(void) const
ファイルテーブルの大きさを得る。

void resize(size_t)
ファイルテーブルの大きさを変更する。

bool is_readable(size_t)
引数で指定されたファイルが読み込み可能なら真を返す。

bool is_writable(size_t)
引数で指定されたファイルが書き込み可能なら真を返す。

bool is_opened(size_t)
引数で指定されたファイルがオープンされていれば真を返す。

void set_input_stream(size_t, istream&)
第一引数で指定されたエントリを第二引数で指定された読み込みストリームに 結び付ける。

void set_output_stream(size_t, ostream&)
第一引数で指定されたエントリを第二引数で指定された書き込みストリームに 結び付ける。

bool open(size_t, const char*, int)
第一引数で指定されたエントリに、第二引数で指定されたファイル名のファイ ルをオープンして結び付ける。オープン操作時には第三引数で指定されたフラ グを用いる。フラグの値は`io_protocol.h'のマクロ IO_FILE_OPEN_*で規定されている。成功すれば真を返す。

bool close(size_t)
引数で指定されたファイルをクローズする。成功すれば真を返す。

bool eof(size_t) const
引数で指定された入力ストリームが終了しているなら真を返す。

bool good_input_stream(size_t) const
引数で指定された入力ストリームの次の演算が成功するなら真を返す。

bool good_output_stream(size_t) const
引数で指定された出力ストリームの次の演算が成功するなら真を返す。

bool put(size_t, char)
第一引数で指定された出力ストリームに、第二引数で指定された文字を出力す る。成功すれば真を返す。

bool get(size_t, &char)
第一引数で指定された入力ストリームから文字を取得し、第二引数で指定され た変数に格納する。成功すれば真を返す。

long seek(size_t, long, int)
第一引数で指定されたファイルに対し、lseek操作を行う。位置の指定 方法は第三引数、位置は第二引数で指定される。位置の指定方法は `io_protocol.h'のマクロIO_FILE_SEEK_*で規定されている。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.14 argument_mapクラス

コマンドライン引数を管理するデータベースを作成するクラス。シミュレータ 上のソフトウェアがコマンドライン引数を読み込む際に用いられる。

int argc(void) const
argcを参照する。

const char* argv(size_t) const
引数で指定されたargvを参照する。

void set(const char* const*)
コマンドライン引数を設定する。

void clear(void)
格納しているすべての値を破棄する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.15 crossbarクラス

クロスバを表すクラス。入力線数、出力線数を設定して使用する。内部に入力 線数×出力線数のスイッチがあり、それらを切替えることで入力線と出力線間 の接続を切替える。1つの入力に対して複数の出力を接続することができる。

crossbar(void)
入力線数0、出力線数0のクロスバを作成する。

crossbar(size_t a, size_t b)
入力線数a、出力線数bのクロスバを作成する。

size_t input_size(void) const
入力線数を返す。

size_t output_size(void) const
出力線数を返す。

void resize(size_t a, size_t b)
入力線数をa、出力線数をbに設定する。

void clear(void)
内部のスイッチををすべてOFFにする。

inline void connect_crosspoint(size_t a, size_t b)
(a, b)のスイッチをONにする。

inline void disconnect_crosspoint(size_t a, size_t b)
(a, b)のスイッチをOFFにする。

bool is_connected_input_channel(size_t)
引数で指定された入力線が出力線に接続されていれば真を返す。

bool is_connected_output_channel(size_t)
引数で指定された出力線が入力線に接続されていれば真を返す。

inline void disconnect_input_channel(size_t)
引数で指定された入力線のスイッチをすべてOFFにする。

inline void disconnect_output_channel(size_t)
引数で指定された出力線のスイッチをすべてOFFにする。

size_t input_to_output_size(size_t)
引数で指定した入力線に接続されている出力線数を返す。

size_t input_to_output_index(size_t a, size_t b = 0)
入力線aに接続されている出力線の番号を返す。bは、その入力線 に接続されている出力線の通し番号を指定する。

size_t output_to_input_index(size_t)
引数で指定した出力線に接続されている入力線の番号を返す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.16 network_packet_senderクラス

ネットワークインタフェースユニットを実装するためのサポートクラス。ルー タに接続して使用する。入力されたパケットを、複数フリットに展開してネッ トワークに送出する。

virtual_channel_output& channel(void)
出力チャネルを参照する。

bool empty(void) const
パケットを送出可能であれば真を返す。

bool full(void) const
パケットを送出不能であれば真を返す。

void put(packet_type*)
パケットを投入する。

void clock(void)
クロック入力を行なう。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.17 network_packet_receiverクラス

ネットワークインタフェースユニットを実装するためのサポートクラス。ルー タに接続して使用する。ネットワークから入力されたフリットの集合を、1つ のパケットに戻す。

virtual_channel_input& channel(void)
入力チャネルを参照する。

bool full(void) const
パケットを受理可能であれば真を返す。

packet_type* get(void)
パケットを受理する。

void clock(void)
クロック入力を行なう。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Masaki WAKABAYASHI on September, 3 2003 using texi2html