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

10. バス

ここではバスの実装方法と使用方法について述べる。

10.1 バスの実装  
10.2 バスの使用方法  


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

10.1 バスの実装

バスは、バス上を流れる情報を表すパケットとパケットの転送路となるバスそ のものの入出力ポートの2つから構成される。

パケット
バス上の情報は、bus_packet_baseクラスで表される。このクラスは抽 象クラスであり、アドレスとデータ以外の状態を内包せず、状態の問い合わせ 関数のみを純粋仮想関数および定義済み仮想関数として提供する。実際の状態 まで含めたパケットを実装するためには、状態を追加した具体派生クラスを使 用する必要がある。純粋仮想関数のみを定義すれば具体派生クラスを実装でき るが、実行時の関数呼び出しのコストを低減させるためにその他の仮想関数に ついても再定義した方が良い。See section 5.2 bus_packet_baseクラス.

bus_packetクラスは、bus_packet_baseの具体派生クラスであ る。bus_packet_baseクラスで用意されている機能のみを実体化したも のである。通常のバストランザクションであれば、このbus_packetク ラスで実装可能である。See section 5.3 bus_packetクラス.

ポート
バスに対するインタフェースの役割を果たす。ISIS上でのバスはport クラスとbus_packet_baseクラスの派生クラスにより実装されているが、 これらのクラスを直接アクセスするのは繁雑な作業を要するため、その複雑さ を隠蔽するために用意されている。bus_port_baseクラスの機能だけを 使用してバスにアクセスするようにすることにより、portクラスと bus_packet_baseクラスに依存しない実装が可能である。 See section 6.2 bus_port_baseクラス.

bus_port_baseが用意するのは抽象クラスである bus_packet_base へのインタフェースであるため、パケットを生成す るような関数は用意されていない。bus_portクラスが bus_packetによるバスに対するインタフェースの役割を果たす bus_port_baseクラスの具体派生クラスで、パケットの送信機能が追加 されている。See section 6.3 bus_portクラス.


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

10.2 バスの使用方法

bus_packet_baseでは、パケットの状態としてrequest、grant、ack、 nack、dataの5つの基本型を設定している。1つのバストランザクションはこれ らのうちのいくつかのパケットを要求側と応答側で送受信することで行われる。

request
read requestやwrite requestなど、何らかの要求を表す。通常、対象となる アドレスが示されている。このパケットに転送するデータ(例えばwriteするデー タ) を示しても良い。

grant
その要求が受理可能なものであることを表す。このパケットを受信した要求者 は、バスを一旦開放してack、nackまたはdataを待つ。

ack
その要求が受理可能であり、かつ自分が受理可能な状態になっていることを表 す。このパケットに応答となるデータ(例えばread要求されたデータ)を示して も良い。

nack
その要求は通常なら受理可能だが、現在は受理不能な状態にあることを表す。

data
実際に転送するべきデータを表す。

10.2.1 単独バスマスタ  
10.2.2 複数バスマスタ  
10.2.3 スプリットトランザクション  


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

10.2.1 単独バスマスタ

バスマスタが単独である場合のリードトランザクションとライトトランザクショ ンの例を示す。パケットの参照はすべてclock_inフェーズ、パケット の送信やバスの開放はすべてclock_outフェーズで行う。


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

10.2.2 複数バスマスタ

複数のバスマスタが存在する場合は、実際のパケットの送受信を行う前に転送 路のオーナになり、バスを占有して通信を行う必要がある。また、通信終了時 にはバスを開放し、他のバスマスタが次の通信を行えるようにしなければなら ない。バスの占有処理はport_baseクラスによって実装されている。 See section Port Ownership.

以下にシングルリードトランザクションとシングルライトトランザクションの 例を示す。


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

10.2.3 スプリットトランザクション

スプリットトランザクションを行う場合は、複数バスマスタの場合に行う転送 路のオーナシップの取り扱いに加え、トランザクション途中でバスを開放する 処理が追加される。この処理を行うために、ポートの持つトランザクションID 機能を使用する。この機能はportクラスで用意されているもので、そ れぞれのバストランザクションに個別にID番号を割り当てる機能である。

要求側はまずバスのオーナになる。オーナになったら、自分に割り当てられた トランザクションIDを記憶しておいてから要求パケットを送信する。応答側は、 要求を受理したらその時のトランザクションIDを記憶し、即座にgrantパケッ ト(要求を受理可能だが、まだ受理できる状態にないことを示す)を返す。要求 側はgrantパケットを受け取った時点でバス上のパケットを消去し、バスのオー ナシップを一旦開放し、トランザクションIDをチェックしつつackを待つ。応 答側は応答準備が整ったらバスのオーナになり、記憶しておいたトランザクショ ンIDを設定してackを返す。要求側は自分に割り当てられたトランザクション IDであることを確認してからackを受信する。その後の処理は複数バスマスタ の場合と同一である。

以下にシングルリードトランザクションとシングルライトトランザクションの 例を示す。


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

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