プロセサとメモリをつなぐコモンバス

複数のプロセサを使う初期のマルチプロセサシステムでは、すべてのプロセサとメモリを1つのバスに接続するコモンバスがインタコネクトとして用いられた。コモンバスでは、図3.2に示すようにプロセサコアやメモリからの出力にはトライステート(Tri-State;0,1,High-Zの3状態を持つ)ドライバを使用し、出力を行わないモジュールはドライバをHigh-Zとして電気的に切り離し、コモンバスを使用する1つのプロセサ、あるいはメモリのトライステートドライバが0か1の値をコモンバスに載せる。そして、各プロセサやメモリは(この図ではNANDゲートを通して)コモンバスに載せられた信号を常時、読み取ることができるようになっている。

なお、この図3.2では1ビット分の回路しか描かれていないが、64ビットのバスであればこの回路が64組並んでいることになる。

図3.2 コモンバスの電気的接続

Tri-Stateドライバは図3.3のような回路構成になっており、Enableが"1"の場合は出力段のPとNトランジスタのゲートにDinの否定が供給され、出力段はインバータとして働く。その結果、出力Doutは入力Dinと同じ値になる。

一方、Enableが"0"の場合は、Pトランジスタのゲートは"1"、Nトランジスタのゲートは"0"となり、両方のトランジスタはオフになる。結果としてコモンバス線への電流の供給も引き込みも行わない高インピーダンス(High-Z)状態となる。

図3.3 Tri-Stateドライバの回路

図3.2に見られるように、コモンバスの信号線は共通なので2つ以上のモジュールがバスドライバをEnableしてしまうと、信号がぶつかってしまい正しいデータの伝送ができない。このため、コモンバスでは、バスを使いたいモジュールが複数ある場合でも、一時には1つのモジュールだけが信号を出力するようにしなければならない。

このため、図3.4に示すように、コモンバスではArbiter(アービタ:調停者)と呼ぶブロックを設ける。コモンバスを使用したいモジュールはRQ(リクエスト、要求)信号を"1"にしてアービタにバスを使用したいという要求を送る。アービタはすべてのモジュールからのRQ信号を監視し、要求を上げているモジュールの中のどのモジュールにバスを使わせるかを決め、そのモジュールへのGT(グラント、許可)信号を"1"として、使用権を与えることを通知する。

図3.4 コモンバスの使用権のアービトレーション

1つのモジュールだけがバスの使用を要求している場合は問題ないが、2つ以上の要求元がある場合は、何らかのアルゴリズムで優先順位を付けて最も高い優先順位の要求元に使用権を与える。

固定的な優先順位づけを行う場合もあるが、一般的には、プロセサ1がバスを使用すると、その次にはプロセサ2~4の中でRQ信号を上げている最も若い番号のプロセサにバスの使用権を渡す。例えば、プロセサ2はRQ信号を上げず、プロセサ3がRQ信号を上げているとすると、次はプロセサ3にバスの使用権を渡す。そして、プロセサ3がバスを使用したので、その次はプロセサ4、1、2、3の優先順位でRQ信号を上げているプロセサにバスの使用権を渡すというように、バスを使用しているプロセサの右側(右端で折り返してループする順序で)のプロセサに使用権を渡すというラウンドロビン制御が使われることが多い。このようにすると、すべてのプロセサが公平にバスを使用することができる。

このようなバスアービタは、前回バスを使用したプロセサ番号を記憶する回路を持ち、その番号と各プロセサからのRQ信号の値を入力とし、次のサイクルに各プロセサに返すGT信号を出力とする真理値表を作り、論理合成を行えば容易に作ることができる。

GT信号で"1"を受け取ったプロセサはバスの使用権が得られたことが分かるので、次のバスサイクルにバスドライバのEnable信号を"1"としてバスに信号を載せる。アービタは、その他のプロセサにはGT信号として"0"を返すので、それらのプロセサはEnable信号を"0"としてバスを駆動しない。

このようにアービタでコモンバスを使用するプロセサを決めることにより、複数のプロセサのバスドライバが同時にEnableになってしまうという事態を回避することができる。