[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ポートはユニット間の結合の仲介、パケット転送の仲介を行う。ポートには、
複数の入出力を共用するような結線に相当するport
クラスと、仮想チャ
ネルに相当するvirtual_channel_input
クラス、
virtual_channel_output
クラスがある。
6.1 portクラス 6.2 bus_port_baseクラス 6.3 bus_portクラス 6.4 virtual_channel_inputクラス 6.5 virtual_channel_outputクラス
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ハードウェアを表すクラス同士の接続に使われる、入出力端子(ポート)を表す クラスである。複数ポート同士を接続すると、接続された全てのポートで共有 される1つの経路が確保される。あるポートからパケットを入力すると、接続 されたポート全てから入力したパケットの参照および取得を行うことができる。
ポートが結合路を占有する状況をシミュレートするために、相互接続されたポー トにはそれぞれ経路内で固有のID番号が自動的に割り振られている。経路の占 有を行いたい場合は、ポートがオーナシップ要求を経路に対して発行する。要 求が衝突した場合、ポートのID番号を元に指定したアルゴリズムに従ってアー ビトレーションを行い、オーナを選定する。経路を使用し終わったオーナは占 有権を放棄することで経路を解放する。
ポート上の一連のパケット転送には、結合路内で一意なトランザクションIDが 自動的に割り付けられる。このトランザクションIDは、オーナが交代するごと に更新される。また、任意の値を設定することもできる。この値はスプリット トランザクションを行う場合に使用する。
結合路は、内部に複数のアービタを格納することができる。無指定では単一の アービタのみが使用できる。複数アービタを使用することで、複数のオーナシッ プを独立に扱うことが可能である。
6.1.1 portクラスの定義 6.1.2 パケットの送信 6.1.3 ポートのオーナシップ 6.1.4 portクラスの使用方法
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
bool is_connected(void) const
bool is_connected(const port&) const
bool have_packet(void) const
void connect(port&)
void disconnect(port&)
void disconnect(void)
void put(packet*)
packet* get(void)
NULL
が返される。
void clear(void)
const packet* look(void) const
NULL
が返される。
bool is_connected_to_asynchronous_unit(void) const
bool is_connected_to_asynchronous_unit(const asynchronous_unit&) const
void connect_to_asynchronous_unit(asynchronous_unit&)
void disconnect_asynchronous_unit(void)
int id(void) const
void set_id(int)
bool is_owned(int = 0) const
bool is_owner(int = 0) const
void request_ownership(int = 0)
void release_ownership(int = 0)
int transaction_id(void) const
void set_transaction_id(int)
void set_number_of_arbitor(int)
virtual bool compete(int, int) const
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
パケットを送る場合、以下の手順で行う。なお、ここでは経路の排他制御は行っ ていない。排他制御を行う場合は、パケットの送受信を行う前後にポートの占 有処理を行わなければならない。See section 6.1.3 ポートのオーナシップ.
new
演算子で生成する。
put
メンバ関数を使う。以後のパケットの実体の扱い
はポートに任されるので、ユーザが勝手に開放してはいけない。
have_packet
関数でポートからパケットを出力できるかどうか確認して
おく。
look
メンバ
関数を使い、パケットの内容を参照する。パケットが送られていれば、パケッ
トを参照することができる。この時点で必要がないと判断されたパケットにつ
いては、実際の受け取りを必ずしも行う必要はない。受け取らずに放置された
パケットは後続パケットによって上書きされる。なお、放置されたパケットは
後続パケットが到着するまでポート内に残る可能性があるので注意すること。
get
メンバ関
数を使い、パケットの実体を受け取る。パケットが送られていれば、パケット
を受け取ることができる。実際の受取りはポインタの受渡しである。使い終わっ
たパケットは受け取ったユーザが開放する責任を持つ。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
例えば、複数のプロセッサが共有バスに接続されているようなシステムでは、 複数プロセッサが同時に共有バスに対して書き込みを行おうとする。このアク セスの衝突は排他制御によって回避する必要がある。この排他制御処理を行う ために、ポートには経路の占有処理を行う機能が設けてある。
相互接続されたポートにはそれぞれ経路内で固有のID番号が自動的に割り振ら
れている。経路の占有を行いたい場合は、ポートがオーナシップ要求を経路に
対して発行する。要求が衝突した場合、ポートのID番号を元に指定したアルゴ
リズムに従ってアービトレーションを行い、オーナを選定する。経路を使用し
終わったオーナは占有権を放棄することで経路を解放する。アービトレーショ
ンアルゴリズムはcompete
仮想関数によって実装されており、ユーザが
自由にアルゴリズムを変更することができる。デフォルトのアルゴリズムはラ
ウンドロビンである。
実際に通信路の占有を行う場合は、例えば以下のような手順を踏む。オーナシッ プの要求や開放は出力フェーズ、状態の問い合わせは入力フェーズでのみ行わ なければならない。
request_ownership
関数でオーナシップを要求する。
is_owner
関数でオーナになったかどうか確認
する。オーナになれなかった場合には、再び出力フェーズでオーナシップを要
求し直す。
release_ownership
関数を用いオー
ナシップを開放する。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
port
クラスの使用例として、2つのポート間でbus_packet
をや
り取りするプログラムを紹介する。
#include <isis/isis.h> int main(void) { port a, b; a.connect(b); packet* pkt = new bus_packet<int>; ((bus_packet<int>*)(pkt))->address() = 100; a.put(pkt); pkt = b.get(); ((bus_packet<int>*)(pkt))->address()++; b.put(pkt); pkt = a.get(); cout << *pkt << endl; delete pkt; return 0; } |
connect
関数にもう一方のポートを与えることによって行わ
れる。
100
を表すパケット(pkt)を生成する。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バスに対するインタフェースの役割を果たすクラス。ISIS上でのバスは
port
クラスとbus_packet_base
クラスの派生クラスにより実装
されているが、これらのクラスを直接アクセスするのは繁雑な作業を要するた
め、その複雑さを隠蔽するために用意されている。bus_port_base
クラ
スの機能だけを使用してバスにアクセスする様にすることにより、
port
クラスとbus_packet_base
クラスに依存しない実装が可能
である。See section 5.2 bus_packet_baseクラス.
このクラスが用意するのは抽象クラスであるbus_packet_base
へのイン
タフェースであるため、パケットを生成するような関数は用意されていない。
See section 6.3 bus_portクラス.
const packet_type* look(void) const
address_type address(void) const
data_type data(void) const
int total_packet_count(void) const
int packet_number(void) const
bool is_single(void) const
bool is_multi(void) const
bool is_ready(void) const
bool is_read(void) const
read
パケットが存在すれば真を返す。
bool is_write(void) const
write
パケットが存在すれば真を返す。
bool is_request(void) const
request
パケットが存在すれば真を返す。
bool is_grant(void) const
grant
パケットが存在すれば真を返す。
bool is_ack(void) const
ack
パケットが存在すれば真を返す。
bool is_nack(void) const
nack
パケットが存在すれば真を返す。
bool is_data(void) const
data
パケットが存在すれば真を返す。
bool is_read_request(void)
read_request
パケットが存在すれば真を返す。
bool is_read_grant(void) const
read_grant
パケットが存在すれば真を返す。
bool is_read_ack(void) const
read_ack
パケットが存在すれば真を返す。
bool is_read_nack(void) const
read_nack
パケットが存在すれば真を返す。
bool is_read_data(void) const
read_data
パケットが存在すれば真を返す。
bool is_write_request(void)
write_request
パケットが存在すれば真を返す。
bool is_write_grant(void) const
write_grant
パケットが存在すれば真を返す。
bool is_write_ack(void) const
write_ack
パケットが存在すれば真を返す。
bool is_write_nack(void) const
write_nack
パケットが存在すれば真を返す。
bool is_write_data(void) const
write_data
パケットが存在すれば真を返す。
bool is_single_read_request(void) const
read_request
パケットが存在すれば真を返す。
bool is_single_read_grant(void) const
read_grant
パケットが存在すれば真を返す。
bool is_single_read_ack(void) const
read_ack
パケットが存在すれば真を返す。
bool is_single_read_nack(void) const
read_nack
パケットが存在すれば真を返す。
bool is_single_read_data(void) const
read_data
パケットが存在すれば真を返す。
bool is_single_write_request(void) const
write_request
パケットが存在すれば真を返す。
bool is_single_write_grant(void) const
write_grant
パケットが存在すれば真を返す。
bool is_single_write_ack(void) const
write_ack
パケットが存在すれば真を返す。
bool is_single_write_nack(void) const
write_nack
パケットが存在すれば真を返す。
bool is_single_write_data(void) const
write_data
パケットが存在すれば真を返す。
bool is_multi_read_request(void) const
read_request
パケットが存在すれば真を返す。
bool is_multi_read_grant(void) const
read_grant
パケットが存在すれば真を返す。
bool is_multi_read_ack(void) const
read_ack
パケットが存在すれば真を返す。
bool is_multi_read_nack(void) const
read_nack
パケットが存在すれば真を返す。
bool is_multi_read_data(void) const
read_data
パケットが存在すれば真を返す。
bool is_multi_write_request(void) const
write_request
パケットが存在すれば真を返す。
bool is_multi_write_grant(void) const
write_grant
パケットが存在すれば真を返す。
bool is_multi_write_ack(void) const
write_ack
パケットが存在すれば真を返す。
bool is_multi_write_nack(void) const
write_nack
パケットが存在すれば真を返す。
bool is_multi_write_data(void) const
write_data
パケットが存在すれば真を返す。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
bus_packet
によるバスに対するインタフェースの役割を果たすクラス。
bus_port_base
クラスの派生クラスで、パケットの送信機能が追加され
ている。See section 6.2 bus_port_baseクラス.
void send_single_read_request(address_type)
read_request
を発行する。引数はアドレスである。
void send_single_read_grant(void)
read_grant
を発行する。
void send_single_read_ack(void)
read_ack
を発行する。
void send_single_read_nack(void)
read_nack
を発行する。
void send_single_read_data(data_type)
read_data
を発行する。引数はデータである。
void send_single_write_request(address_type)
write_request
を発行する。引数はアドレスである。
void send_single_write_grant(void)
write_grant
を発行する。
void send_single_write_ack(void)
write_ack
を発行する。
void send_single_write_nack(void)
write_nack
を発行する。
void send_single_write_data(data_type)
write_data
を発行する。引数はデータである。
void send_multi_read_request(address_type, unsigned int)
read_request
を発行する。第一引数はアドレス、第二引
数は転送するワード数である。
void send_multi_read_grant(void)
read_grant
を発行する。
void send_multi_read_ack(void)
read_ack
を発行する。
void send_multi_read_nack(void)
read_nack
を発行する。
void send_multi_read_data(data_type, unsigned int, unsigned int)
read_data
を発行する。第一引数はデータ、第二引数は転
送するワード数、第3引数はデータの通し番号である。
void send_multi_write_request(address_type, unsigned int)
write_request
を発行する。第一引数はアドレス、第二引
数は転送するワード数である。
void send_multi_write_grant(void)
write_grant
を発行する。
void send_multi_write_ack(void)
write_ack
を発行する。
void send_multi_write_nack(void)
write_nack
を発行する。
void send_multi_write_data(data_type, unsigned int, unsigned int)
write_data
を発行する。第一引数はデータ、第二引数は
転送するワード数、第3引数はデータの通し番号である。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
仮想チャネルへの入力ポートを表すクラス。出力ポートを表す virtual_channel_outputクラスのオブジェクトと組で使用することにより、仮 想チャネルを実現する。仮想チャネル間には指定された個数の仮想的なパケッ トの経路が確保される。それぞれの仮想的なチャネルには指定されたサイズの 待ち行列が付加されており、パケットを一定数格納しておくことができる。ま た、ハンドシェーク機能などもサポートする。See section 6.5 virtual_channel_outputクラス.
6.4.1 virtual_channel_inputクラスの定義
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
virtual_channel_input(void)
virtual_channel_input(size_t a, size_t b)
bool is_connected(void)
bool is_connected(const virtual_channel_output&)
void connect(virtual_channel_output&)
void disconnect(void)
size_t channel_size(void) const
size_t buffer_size(void) const
void channel_resize(size_t)
void buffer_resize(size_t)
bool empty(size_t)
bool full(size_t)
size_t length(size_t)
packet* get(size_t)
const packet* look(size_t)
void del(size_t)
void clear(size_t)
void clear(void)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
仮想チャネルへの出力ポートを表すクラス。入力ポートを表す virtual_channel_inputクラスのオブジェクトと組で使用することにより、仮 想チャネルを実現する。See section 6.4 virtual_channel_inputクラス.
6.5.1 virtual_channel_outputクラスの定義
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
virtual_channel_output(void)
bool is_connected(void)
bool is_connected(const virtual_channel_input&)
void connect(virtual_channel_input&)
void disconnect(void)
size_t channel_size(void) const
size_t buffer_size(void) const
void channel_resize(size_t)
void buffer_resize(size_t)
bool empty(size_t)
bool full(size_t)
size_t length(size_t)
void put(size_t, packet*)
const packet* look(size_t) const
void clear(size_t)
void clear(void)
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |