しかしながら、従来のキュー装置は以下のような問題点をかかえていた。
(1)キューのデータ容量には限界があるため、キューが満杯となり空き容量が無くなった場合には、データをキューに投入する側、すなわちデータ生成装置は、該キューに空き領域が生じるまでそのデータの投入を待たねばならない。このため、データ生成装置側にとっては、キューに空きが生じるまで待機していなければならず、その間の待ち時間が処理効率の低下をもたらす。
(2)また、データ処理装置として、ある一連のデータ列をパケットとして処理するような装置がキューの出力側に接続されている場合、キューにパケットの全データが投入されるまでの間、該データ処理装置はそのパケット処理を終了することができない。すなわち、データ生成装置がパケットの全データをキューに投入するまで、データ処理装置は処理を中断しなければならない。したがって、この場合には、キューにパケットの全データが投入されてからパケットの取り出しを開始しないとパケット処理装置に待ち時間が生じ処理効率が低下することになる。
(3)また、パケット処理においては、キューにパケットデータを投入中にそのデータを取り除く必要が生じる場合があるが、パケット処理装置側が既にそのデータをキューから取り出してパケット処理を開始しているときには、その出力済のデータを取り戻すのは不可能であった。すなわち、この場合、そのパケットデータは廃棄されることになる。このような場合は、例えばデータ生成装置が複数のプログラム(プロセス)を並列して実行するプロセッサから成り、各プロセスがそれぞれ個別にパケットを生成して共有キューにその書き込みを行うシステムにおいて発生する。すなわち、あるプロセスがキューにパケットデータを書き込んでいる途中で、実行権が他のプロセスに切り換えられ、この新たにスケジューリングされたプロセスがキューに自己の生成したパケットデータを続けて書き込もうとした場合である。
本発明は、キューが満杯になった場合でも、データ生成装置側が該キューに空きが生じるまで待たされることなく、キューへのデータ投入操作を行えるようにすることを目的とする。
上記課題を解決するため、本発明は以下のように構成する。
請求項1に記載の発明は、パケットデータを有するパケットが格納されるFIFOバッファと、記憶手段と、前記FIFOバッファ内に格納されているパケットデータの個数を計数する計数手段と、前記計数手段の計数値と、前記パケットを構成するパケットデータ数とに基づいて、前記FIFOバッファ内に書き込みの完結しているパケットが存在するか否かを検出するパケット完結検出手段と、前記パケット完結検出手段により書込未完結と判別されたパケットに含まれ、前記FIFOバッファに既に書き込まれているパケットデータを、前記記憶手段に退避させるデータ退避手段と、を備えたことを特徴とするキュー装置である。
請求項2に記載の発明は、請求項1記載のキュー装置において、前記パケット完結検出手段は、前記計数手段の計数値と、前記FIFOに格納されたパケット内に設定されるパケットサイズ情報とに基づいて、前記FIFOバッファ内に書き込みの完結したパケットが存在するか否かを判別することを特徴とするものである。
請求項3に記載の発明は、請求項1又は2記載のキュー装置において、前記FIFOバッファは、複数のプロセスによってパケットデータが書き込まれるものであり、前記パケット完結検出手段は、プロセスAが前記FIFOバッファにパケットを書き込んでいる途中で別のプロセスBに実行権が切り替えられた際、前記FIFOバッファに書込未完結のパケットに含まれるパケットデータが存在するか否かを判別し、前記データ退避手段は、前記パケット完結検出手段により前記FIFOバッファに書込未完結のパケットに含まれるパケットデータが存在すると判別された場合に、前記FIFOバッファ内の前記書込未完結のパケットに含まれるパケットデータを前記記憶手段に退避させることを特徴とするものである。
請求項4に記載の発明は、請求項3記載のキュー装置において、前記プロセスAに再び実行権が移行した際、前記プロセスAの実行再開前に前記記憶手段に退避させておいたパケットデータを前記FIFOバッファに転送させるデータリストア手段を更に備えることを特徴とするものである。
請求項5に記載の発明は、複数のプロセスによってパケットが書き込まれるFIFOバッファと、記憶手段と、プロセスAが前記FIFOバッファにパケットを書き込んでいる途中で別のプロセスBに実行権が切り換えられた際、前記プロセスAが書き込んだ、書込未完結のパケットに含まれるパケットデータを、前記FIFOバッファから取り出し前記記憶手段に退避させるデータ退避手段と、再び前記プロセスAに実行権が移行した際、該プロセスAの実行再開前に前記記憶手段に退避させておいたパケットデータを前記FIFOバッファに転送させるデータリストア手段と、を備えたことを特徴とするキュー装置である。
以下に、本発明又はそれと関連する発明(以下、関連発明と言う)の原理について説明する。
図1は、第1の関連発明の原理を説明する図である。
この発明は、FIFOバッファ1と、該FIFOバッファに書き込まれるデータが退避される退避バッファ2と、該退避バッファにデータが退避されているか否かを示すフラグ3を備える。また、さらに第1の検出手段4とデータ退避手段5を備える。
第1の検出手段4は、上記FIFOバッファ1の残り容量が予め定められた第1の閾値より少なくなったことを検出する。
データ退避手段5は、該第1の検出手段4により上記FIFOバッファ1の残り容量が上記第1の閾値よりも少なくなったことが検出されると、その後のFIFOバッファ1に対する書き込みデータを前記退避バッファ2に退避させると共に前記フラグ3をセットさせ、該フラグがセットされている状態の間、上記FIFOバッファ1に対する書き込みデータを前記退避バッファの方に書き込む。
第2の関連発明は、上述した第1の関連発明が有する各構成要素に加え、さらに以下の手段を有する。
第2の検出手段6は、前記フラグ3がセットされている状態のときに、前記FIFOバッファ1の残り容量が予め定められた第2の閾値よりも多くなったことを検出する。
データリストア手段7は、該第2の検出手段6よりFIFOバッファ1の残り容量が上記第2の閾値よりも多くなったことが検出された際、前記退避バッファ2に退避されていたデータを上記FIFOバッファ1に転送し、前記退避バッファ2に退避されているデータが無くなったときに前記フラグ3をリセットする。
第3の関連発明は、上記第1の関連発明が有する各構成要素に加え、下記の第3の検出手段8を備える。
第3の検出手段8は、前記退避バッファ2の残り容量が予め定められた第3の閾値よりも少なくなったことを検出し、該検出時に例えば、割り込み信号などの特定の信号を発生する。
図2は、第4乃至第7の関連発明の原理を説明する図である。
第4の関連発明は、パケットが格納されるFIFOバッファ11と、該FIFOバッファ11に格納されるパケットの個数を計数する計数手段12とを備える。
第5の関連発明は、上記第4の関連発明が有する各構成要素に加え、前記FIFOバッファ11に書き込まれるパケットのデータが退避される退避バッファ13と、該退避バッファ13にパケットデータが退避されているか否かを示すフラグ14と、前記FIFOバッファ11の残り容量が予め定められた第1の閾値よりも少なくなったことを検出する第1の検出手段15と、該第1の検出手段15により前記FIFOバッファ11の残り容量が前記第1の閾値よりも少なくなったことが検出されると、その後のFIFOバッファ11に対する書き込みデータを前記退避バッファ13に退避させると共に、前記フラグ14をセットさせ、該フラグがセットされている状態の間、上記FIFOバッファ11に対する書き込みパケットデータを前記退避バッファの方に書き込むパケットデータ退避手段16と、を更に備える。
前記FIFOバッファ11に格納される各パケットデータには、例えば、該パケットデータが当該パケットの最後のデータであるか否かを示す情報が設定されたビットが付加されるようにしてもよい。
第6の関連発明は、上記第5の関連発明が有する各構成要素に加え、前記フラグ14がセットされている状態のときに、前記計数手段12の計数値が予め定められた第2の閾値よりも少なくなったことを検出する第2の検出手段17と、該第2の検出手段17により前記FIFOバッファ11に格納されているパケット数が上記第2の閾値よりも少なくなったことが検出された際、前記退避バッファ13に退避されていたデータを上記FIFOバッファ11に転送し、前記退避バッファ13に退避されているデータが無くなったときに前記フラグ14をリセットするデータリストア手段18と、をさらに備える。
第7の関連発明は、上記第4の関連発明が有する各構成要素に加え、前記計数手段12の計数値を参照して、前記FIFOバッファ11内に完結しているパケットデータが存在するか否かを検出するパケット完結検出手段19を、さらに備える。
図3は、第8乃至第10の関連発明の原理を説明する図である。
第8の関連発明は、請求項1に記載の発明とも一部共通するものであり、パケットサイズを示す情報が設定されているデータを先頭に有するパケットが格納されるFIFOバッファ21と、前記FIFOバッファ21内に格納されているパケットデータの個数を計数する計数手段22と、該計数手段22の計数値と、前記FIFOバッファ21に格納されているパケットの上記パケットサイズ情報が設定されているデータとを入力して、前記FIFOバッファ21内に完結しているパケットが存在するか否かを検出するパケット完結検出手段23と、を備える。
第9の関連発明は、上記第8の関連発明が有する各構成要素に加え、前記FIFOバッファ21に書き込まれるパケットのデータが退避される退避バッファ23と、該退避バッファ23にパケットデータが退避されているか否かを示すフラグ24と、前記FIFOバッファ21の残り容量が予め定められた第1の閾値よりも少なくなったことを検出する第1の検出手段25と、該第1の検出手段25により前記FIFOバッファ21の残り容量が前記第1の閾値よりも少なくなったことが検出されると、その後のFIFOバッファ21に対する書き込みデータを前記退避バッファ23に退避させると共に、前記フラグ24をセットさせ、該フラグ24がセットされている状態の間、上記FIFOバッファ21に対する書き込みデータを前記退避バッファの方に書き込むパケットデータ退避手段26と、をさらに備える。
第10の関連発明は、上記第9の関連発明が有する各構成要素に加え、前記フラグ24がセットされている状態のときに、前記計数手段22の計数値が予め定められた第2の閾値よりも少なくなったことを検出する第2の検出手段27と、該第2の検出手段27によりFIFOバッファ21の残り容量が上記第2の閾値よりも少なくなったことが検出された際、前記退避バッファ23に退避されていたデータを上記FIFOバッファ21に転送し、前記退避バッファ23に退避されているデータが無くなったときに前記フラグ24をリセットするデータリストア手段28と、をさらに備える。
次に、図4は請求項5に記載の発明を説明する原理図である。
この発明は、複数のプロセスによってパケットが書き込まれるFIFOバッファ41と、記憶手段42と、プロセスAが上記FIFOバッファ41にパケットを書き込んでいる途中で別のプロセスBに実行権が切り換えられた際、上記プロセスAが書き込んだ、書込未完結のパケットに含まれるパケットデータを、上記FIFOバッファ41から取り出し上記記憶手段42に退避させるデータ退避手段43と、再び前記プロセスAに実行権が移行した際、該プロセスAの実行開始前に前記記憶手段42に退避させておいたパケットデータを前記FIFOバッファに転送させるデータリストア手段44と、を備える。
次に、上述した発明の作用について説明する。
第1の関連発明においては、第1の検出手段4がFIFOバッファ1の残り容量が予め定められた第1の閾値よりも少なくなったことを検出する。データ退避手段5は、該検出後にFIFOバッファ1に対するデータの書き込み要求があると、該データを退避バッファ2の方に書き込み、フラグ3をセットする。そして、該フラグ3がセットされている状態の間、データ退避手段5はFIFOバッファ1に対する書き込みデータを退避バッファ2の方に書き込む。
これにより、FIFOバッファ1に対してデータを書き込むデータ生成装置は、FIFOバッファ1が満杯になっても、FIFOバッファ1に空きが生ずるまで待たされることなくデータの出力が可能になり、処理効率が向上する。
また、第2の関連発明においては、第2の検出手段6がフラグ3がセットされている状態においてFIFOバッファ1の残り容量が予め定められた所定の閾値よりも多くなったことを検出する。データリストア手段7は、この検出を受けて、退避バッファ2に退避されていたデータをFIFOバッファ1に転送する。そして、退避バッファ2に退避データが無くなるとフラグ3をリセットする。
これにより、退避バッファ2に退避されていたデータは正しい順序でFIFOバッファ1に書き込まれる。そして、フラグ3がリセットされると、FIFO1に空きがある間再びFIFOバッファ1の方にデータが書き込まれる。
第3の関連発明においては、第3の検出手段8が退避バッファの残り容量が予め定められた第3の閾値よりも少なくなった状態を検出し、その旨を示す特定の信号を外部に出力する。
これにより、例えば、プロセッサ等に割り込みをかけ、退避バッファ2のサイズを拡張することが可能になる。
第4の関連発明においては、計数手段12によりFIFOバッファ11に格納されるパケットの個数が計数される、したがって、この計数手段12の計数値を参照することにより、FIFOバッファ11にパケットが格納されているか否かを判断することが可能になり、パケット処理装置20は、FIFOバッファ11内においてパケットが完結してからパケットのデータを連続して取り出すことが可能になり、パケット処理を効率良く行うことができる。
第5の関連発明においては、退避バッファ13、フラグ14、第1の検出手段15、及びパケットデータ退避手段16により、上述した請求項2記載の発明と同様な動作が、FIFOバッファ11に対するパケットデータの書き込みに対して行われる。したがって、パケット生成装置10はFIFOバッファ11が満杯になっても、FIFOバッファ11に空きが生ずるまで待たされることなく、パケットデータの出力が可能となり、処理効率が向上する。
第6の関連発明においては、第2の検出手段17がフラグ14がセットされている状態のときに計数手段12の計数値すなわちFIFOバッファ11内の格納パケット数が予め定められた第2の閾値よりも少なくなったことを検出する。データリストア手段18は、この検出を受けて退避バッファ13に退避されていたパケットデータをFIFOバッファ11に転送する。そして、退避バッファ13に退避パケットデータが無くなると、フラグ14をリセットする。
したがって、退避バッファ13に退避されていたパケットが、その一部のデータが退避されていたパケットも含め、正しい順序並びに正しい形式でFIFOバッファ11にリストアされる。
第7の関連発明においては、パケット完結検出手段19が計数手段12の計数値を参照して、FIFOバッファ11内に完結しているパケットデータが存在するか否か検出する。したがって、この検出を利用して、未完結のパケットのデータがFIFOバッファ11から出力されてしまう事態を抑止できる。
なお、FIFOバッファ11からパケットデータと共に出力される特定のビットの値を参照するようにすれば、パケット処理装置はFIFOバッファ11から読み出したデータがパケットの最後のデータであるか否かを容易に検出できる。
請求項1に記載の発明と一部共通する第8の関連発明においては、計数手段22によりFIFOバッファ21に格納されているパケットデータの個数が計数される。パケット完結検出手段23は、該計数値とFIFOバッファ21の先頭に格納されているパケットのそのサイズ情報が設定されているデータを入力して、両者を比較することによりFIFOバッファ21内に完結しているパケットが存在するか否か検出する。
したがって、このパケット完結手段23の検出情報を利用して、FIFOバッファ21内の書込未完結のパケットに含まれるパケットデータがパケット処理装置40に出力されてしまう状態を回避させることができる。
第9の関連発明においては、前述した第5の関連発明と同様な動作が、退避バッファ23、第1の検出手段25、及びパケットデータ退避手段26により行われる。
したがって、パケット生成装置30は、FIFOバッファ21に空きが生じていない間でも、生成したパケットを出力できるので、処理効率が向上する。
第10の関連発明においては、前述した第6の関連発明と同様な動作が、第2の検出手段27とデータリストア手段28により行われる。
したがって、退避バッファ23に退避されていたパケットが、その一部のデータが退避されていたパケットも含め、正しい順序並びに正しい形式でFIFOバッファ11にリストアされる。
請求項5に記載の発明においては、プロセスAがFIFOバッファ41にパケットを書き込んでいる途中で別のプロセスBに実行権が切り換えられた際、データ退避手段43が上記プロセスAが書き込んだ、書込未完結のパケットに含まれるパケットデータを、上記FIFOバッファ41から取り出し記憶手段42に退避させる。そして、再び前記プロセスAに実行権が移行した際、データリストア手段44が該プロセスAの実行開始前に前記記憶手段に退避させておいたパケットデータを前記FIFOバッファ41に転送させリストアさせる。
したがって、プロセスAがFIFOバッファ41にパケットのデータを書き込んでいる途中であっても、新たに起動されたプロセスBはFIFOバッファ41にパケットを書き込むことが可能になる。そして、再びプロセスBが再起動された際には、プロセスBはFIFOバッファ41に残りのパケットデータを書き込むことにより、FIFOバッファ41に正しくパケットを書き込むことが可能になる。
請求項1乃至4に記載の発明によれば、FIFOバッファに格納されているパケットデータの個数が計数手段により計数され、パケット完結検出手段は、上記計数値とFIFOバッファに格納されているパケットデータ数とに基づいて、FIFOバッファ内に書き込みの完結しているパケットが存在するか否か検出し、書込未完結と判別されたパケットに含まれ、FIFOバッファに既に書き込まれているパケットデータを、データ退避手段が記憶手段に退避させる。したがって、パケット完結検出手段の検出情報を利用して、FIFOバッファ内の書込未完結のパケットに含まれるパケットデータがパケット処理装置に出力されてしまう状態を回避させることができる。
請求項5に記載の発明によれば、プロセスAがFIFOバッファにパケットのデータを書き込んでいる途中であっても、新たに起動されたプロセスBはFIFOバッファにパケットを書き込むことが可能になる。そして、再びプロセスAが再起動された際には、プロセスAはFIFOバッファに残りのパケットデータを書き込むことにより、FIFOバッファに正しくパケットを書き込むことが可能になる。したがって、書込未完結のパケットに含まれる、FIFOバッファ内に既に格納済のパケットデータの、退避及びその復帰が可能である。
図5は、本発明の一実施例のキュー装置の全体構成を示すブロック図である。
FIFOバッファ110は、nビット単位でのデータの一括入出力が可能なFirst-In, First-Out 方式のメモリであり、例えば1チップで構成される。そして、FIFOバッファ110の残り容量が予め定められた第1の閾値以下になったことを示すフルフラグ信号full(以下、full信号と記述する)並びにFIFOバッファ110が現在、全くデータを格納していない状態であることを示すエンプティ・フラグ信号empty (以下、empty信号と記述する)の出力端子と、該FIFOバッファ110へのデータ書き込み時にイネーブルとする書き込みイネーブル信号W1並びに該FIFOバッファ110からデータを読み出すときにイネーブルとする読み出しイネーブル信号R1の入力端子を備えている。
また、さらにnビットのデータ入力線D1とnビットのデータ出力線Q1を備えている。また、FIFOバッファ110は、バッファ内の残り容量が予め定められた第2の閾値よりも大きくなった場合には、Almost-Empty信号を出力する。
該FIFOバッファ110は、例えばSRAM(Static Random Access Memory)のアレイから構成され、該アレイに対してデータの入・出力が行われる。また、該SRAMに対する次の入力データの書き込みアドレスを指す入力ポインタと該SRAMから次に読み出すデータのアドレスを指す出力ポインタを内蔵している。これらのポインタは、例えばリングカウンタから成る。またさらに、上記2つのポインタが指すアドレス値の差を常に監視・比較しているコンパレータも内蔵しており、該コンパレータにより上記full信号や上記empty信号並びにAlmost-Empty信号を生成・出力する。
尚、該FIFOバッファ110をSRAMではなく、シフトレジスタにより構成するようにしてもよい。
退避バッファ120は、例えばDRAM(Dynamic Random Access Memory) 等から成り、例えば上記FIFOバッファ110よりも大きな記憶容量を有する。この退避バッファ120も、nビット幅のデータ入力線D2並びにデータ出力線Q2を備え、さらに、上記FIFOバッファ110が有する書き込みイネーブル信号W1と同等の機能を有するライトイネーブル信号W2と、例えば、データ読み出し用のアウトプット・イネーブル信号OEを有する。この退避バッファ120には、FIFOバッファ110の残り容量が上記第1の閾値よりも少なくなったとき、すなわち、FIFOバッファ110からfull信号が出力されたとき、オーバーフロー制御部130の制御によってFIFOバッファ110に対して書き込み要求がなされたデータが退避・格納される。
オーバーフロー制御部130は、FIFOバッファ110に対するデータの投入要求をデータ書き込み要求信号write のイネーブル入力により受け付け、FIFOバッファ110から入力される上記full信号の状態に応じて、上記投入要求データをFIFOバッファ110または退避バッファ120のいずれかに格納する。
このオーバーフロー制御部130は、書き込み先決定装置131、フラグ132、書き込みポインタ133、及び退避バッファフル検出装置134を備えている。
書き込み先決定装置131は、上記データ書き込み要求信号write がイネーブルになって加わると、FIFOバッファ110から入力されるfull信号がアクティブとなっているか否か調べ、アクティブでない間は上記信号write と共に、外部装置から入力されるデータD1を、書き込みイネーブル信号W1を制御してFIFOバッファ110に書き込む。
FIFOバッファ110に対するデータの投入の方が、FIFOバッファ110からのデータ取り出しよりも高速に行われる場合には、FIFOバッファ110はやがて充満状態となり、FIFOバッファ110はfull信号を“アクティブ”とする。書き込み先決定装置131は、full信号が“アクティブ”になった状態のときにデータ書き込み要求信号write がイネーブルになって加わると、書き込みポインタ133に上記信号write がイネーブルになった後に送られてきたFIFOバッファ110に対する書き込みデータの退避バッファ120上の格納先アドレスをセットする。
書き込みポインタ133にセットされたアドレス値は、退避バッファ120にアドレス信号として送られ入力される。そして、書き込み先決定装置131が、ライトイネーブル信号W2をイネーブルにすることにより、FIFOバッファ110に対する書き込み要求データD1が退避データD2として書き込みポインタ133にセットされたポインタ値の指す退避バッファ120上のアドレスに書き込まれ、一時的に退避される。書き込み先決定装置131は、このようにして退避バッファ120にデータを書き込んだ後、フラグ132をセットする。
書き込み先決定装置131は、一度、フラグ132がセットされると、外部装置からのFIFOバッファ110に対する書き込みデータを、退避バッファ120の方へ転送し書き込む。この間、FIFOバッファ110から出力されるAlmost-Empty信号を監視し、該信号が“アクティブ”になる、すなわち、FIFOバッファ110に上記第2の閾値以上の“空き”が生ずると、退避バッファ120に退避させていたデータを、不図示のデータリスト装置を介してFIFOバッファ110に転送・復帰させる。
一方、Almost-Empty信号が“アクティブ”になる前に、退避バッファ120の残り容量が予め定められた第3の閾値よりも少なくなる場合がある。退避バッファフル検出装置134は、退避バッファ120がこのような状態になったことを、書き込みポインタ133から入力されるポインタ値すなわち退避バッファ120の次のデータの格納先アドレスにより検出する。そして、該検出時に、バッファフル検出信号buffer-full を外部出力する。この信号は、例えばプロセッサなどのデータ生成装置に対する割り込み信号として用いられる。
次に、図6はFIFOバッファ110を、コマンドなどを表現する1個以上のデータ列である“パケット”を格納するキューとして使用する場合の一実施例を示す模式図である。
カウンタ140は、FIFOバッファ110に格納されているパケット数を計数し、その計数値value を該FIFOバッファ110からパケットを取り出して処理するパケット処理装置へ出力する。
このカウンタ140のインクリメント(+1)は、プロセッサなどのFIFOバッファ110にパケットを投入するパケット生成装置によって行われ、デクリメント(−1)は該FIFOバッファ110からパケットを取り出すパケット処理装置により行われる。すなわち、FIFOバッファ110へのデータ入力側のパケットの投入の終了においてカウンタ140をインクリメントし、データ出力側のパケットの取り出しの終了においてカウンタ140をデクリメントすることによって、FIFOバッファ110に格納されているパケットの数を検出することができる。
このように、パケット数を計数するカウンタ140を付加することにより、パケット処理装置はFIFOバッファ110内においてパケットが完結してから、該パケットのデータを連続して取り出して効率良く処理することが可能になる。
続いて、図7に示す実施例は上述した図6に示す構成において、FIFOバッファ110Aに格納するパケットの各データに該データがパケットの最後のデータであるか否かを示す1ビットの情報(end bit)を付加するようにしたものである。このような構成とすることにより、FIFOバッファ110Aの出力側では、上記end bit の出力端子を監視することにより、FIFOバッファ110Aからデータを取り出す過程でパケットの終了を容易に検出することができる。
図8は本発明の実施例のキュー装置1000を適用したプロセッサ要素の全体的な回路構成を示すブロック図である。
プロセッサ100は、例えばRISC(Reduced Instruction Set Computer)型またはCISC(Complex Instruction Set Computer) 型のマイクロプロセッサから成り、コマンドなどから成るパケットを生成する。
このプロセッサ100には、バス200を介してメモリ300が接続されている。このメモリ300は、例えばDRAM等から成り、その内部には退避バッファ1020の領域が確保される。この退避バッファ1020は、上記退避バッファ120と同等の機能を有するもので、上記プロセッサ100により生成されるパケットの一時的な退避領域として利用される。
本実施例のキュー装置1000の上記退避領域1020を除く部分は、バスインタフェース400を介してバス200に接続されている。
次に、上記退避領域1020以外のキュー装置1000の構成を説明する。
2つのFIFOバッファ(FIFO1、FIFO2)から成るFIFOバッファ1010は、プロセッサ100がバスインタフェース400を介して書き込むパケットを格納するキューとして機能するFIFOメモリである。プロセッサ100は、FIFO1または2のいずれにデータを書き込むかは、バスインタフェース400を介してオーバーフロー制御部1030に出力する書き込み要求信号W11またはW12を制御することにより指示する。
これらの各FIFOバッファ1,2にそれぞれ対応するカウンタC1,C2を有するカウンタ1040が設けられている。
カウンタC1,C2は、それぞれ、FIFO1,2に格納されているパケット数を計数する。
オーバーフロー制御部1030は、これらFIFO1,2並びにカウンタC1,C2と上記バスインタフェース400との間に介在して設けられている。
オーバーフロー制御部1030は、2つのフラグF1,F2を有するフラグ1032、パケットデータラッチ回路1036(以下、単にラッチ回路1036と表現する)、退避バッファ1020用の書き込みポインタ1033,該退避バッファ1020のサイズに応じて決定される該書き込みポインタ1033の限界値(最終格納アドレス)が設定されるlimit レジスタ1037、上記ポインタ1033とlimit レジスタ1037とを比較するコンパレータ1038、さらには前記フラグF1,F2及び前記カウンタC1,C2の値を基に、プロセッサ100に対してデータリストアを要求する割り込みをかけるインタラプト発生部1039を備えている。
フラグF1は、対応するFIFO1から入力されるfull1信号が“アクティブ”になったとき、すなわちFIFO1が充満状態になったときに“セット”される。そして、退避バッファ1020に退避されていた全てのデータがFIFOバッファ1に投入された時点で“クリア”(リセット)される。
フラグF2は、FIFO2に対して、上記フラグF1と同様の動作をする。書き込み先ポインタ1033には、最初、退避バッファ1020の先頭アドレスか設定される。そして、FIFOバッファ1010に対する書き込みデータが格納される毎にインクリメントされる。この書き込み先ポインタ1033の値は、バスインタフェース400及びバス200を介してメモリ300にアドレス信号(address)として供給される。
コンパレータ1038は、上記書き込み先ポインタ1033の値がlimit レジスタ1037の値を越えた時に、割り込み信号(Interrupt 1)をバスインタフェース400及びバス200を介してプロセッサ100に加える。この割り込みは、退避バッファ1020に“空き”が無くなったことをプロセッサ100に通知するものである。
ラッチ回路1036は、バスインタフェース400を介して入力されるプロセッサ100がバス200上に出力したFIFOバッファ1010に対する書き込みデータ(data) を一時的に保持する。また、プロセッサ100は、パケットの最後のデータを書き込む時には、バス200上のエンド・ビット(end bit)の信号線を有効(“1”)にする。このend bit の値もバスインタフェース400を介してラッチ回路1036にラッチされる。
オーバーフロー制御部1030内の不図示のカウンタ制御部は、このラッチ回路1036にラッチされたend bit が“1”に設定されていることを検出することにより、ラッチ回路1036にパケットの最後のデータがラッチされたことを検出する。そしてFIFO1またはFIFO2にパケットの最後のデータを書き込んだ後に、カウンタC1またはC2をインクリメント(+1)する。
インタラプト発生部1039は、フラグF1またはF2がセットされているときに、そのセットされているフラグF1またはF2に対応するカウンタC1またはC2の値が“0”または所定の閾値以下になると割り込み信号(Interrupt 2)を発生し、バスインタフェース400及びバス200を介してプロセッサ100に割り込みをかける。この割り込みは、FIFOバッファ1010に対する書き込みデータが、退避バッファ1020に退避されている状態のときに、FIFO1またはFIFO2に格納されているパケットが“皆無”になったときに発生する。
図9(a) ,(b) は、上記インタラプト発生部1039の回路構成例を示す図である。
同図(a) に示すインタラプト発生部1039は、フラグF1がセットされており、かつカウンタC1の値(FIFO1の格納パケット数)value 1 が“0”のとき、またはフラグF2がセットされており、かつカウンタC2の値(FIFO2の格納パケット数)value 2が“0”のとき、共通の割り込み信号Interrupt2を発生する。
コンパレータ1102は、カウンタC1の値value 1が“0”のとき“H”信号をアンドゲート1104の一方の入力端子に出力する。アンドゲート1104は他方の入力端子にフラグF1の値(“1”(セット状態)のときに“H”、“0”(クリア状態)のときに“L”)を入力する。そして、フラグF1がセットされており、かつカウンタC1の値value 1が“0”のときに“H”信号をオアゲート1110に出力する。また、上記フラグF1とカウンタC1の出力に対する回路と同様な回路が、コンパレータ1106とアンドゲート1108によりフラグF2の出力とカウンタC2の出力に対しても設けられている。アンドゲート1108は、フラグF2がセットされており、かつカウンタC2の値value 2が“0”のときに“H”信号をオアゲート1110に出力する。
オアゲート1110は、アンドゲート1104またはアンドゲート1108のいずれか一方が“H”となったときに、割り込み信号Interrupt 2をバスインタフェース400に出力する。
この場合、プロセッサ100は、オーバーフロー制御部1030並びにバスインタフェース400を介してカウンタC1,C2の値を読み出して、値が“0”となっているカウンタCi(i=1,2,)を検出することにより、FIFO1またはFIFO2のいずれが格納パケット数が“0”になったか判断する。
一方、図9(b) に示す回路は、上述した同図(a) に示す回路からオアゲート1110を省略したものであり、上記アンドゲート1104と上記アンドゲート1108の出力が、それぞれ独立の割り込み信号Interrupt 2A,2Bとなって、バスインタフェース400に出力される。この場合、プロセッサ100は、FIFO1またはFIFO2のいずれの方が格納パケット数が“0”になったかを認識できる。
アービタ1050は、カウンタC1,C2の値value 1,2を監視しており、該カウンタ値value 1または2の値が“0”より大きくなると、2つのFIFO1,2のうち適当な方を選択し、該選択したFIFO1または2からそれに加えるイネーブル信号r1またはr2を“イネーブル”にしてパケットデータを順次読み出す。これらの読み出されたパケットデータはマルチプレクサ1060に入力される。アービタ1050は、該マルチプレクサ1060に入力選択信号selectを加え、上記FIFO1またはFIFO2から読み出されたパケットデータdataをパケット処理装置500に入力させる。
マルチプレクサ1060は、FIFO1及びFIFO2からアービタ1050によって取り出されたパケットデータが入力されるデータセレクタであり、アービタ1050から加わる入力選択信号selectに応じて、FIFO1またはFIFO2のいずれか一方から出力されるパケットデータdataをパケット処理装置500に出力する。
マルチプレクサ1070は、FIFO1及びFIFO2からそれぞれempty信号1,2を入力し、アービタ1050から上記マルチプレクサ1060と同様に入力選択信号selectを入力する。そして、該選択信号selectに応じて、上記2つのempty信号1または2のいずれか一方をパケット処理装置500に選択出力する。
パケット処理装置500は、パケット処理の開始に際して前記アービタ1050にパケットの読み出し要求信号readを送り、アービタ1050にFIFOバッファ1010に格納されているパケットの取り出しを依頼する。アービタ1050は、この信号readを受け取るとカウンタC1,C2を参照し、マルチプレクサ1060を介してFIFO1またはFIFO2に格納されているパケットデータをパケット処理装置500に入力させる。パケット処理装置500は、マルチプレクサ1060を介してパケットの最後のデータを受け取ると、パケットの取り出し終了を示すdone信号をアービタ1050に出力する。アービタ1050は、このdone信号を受信すると、上記パケットが取り出されたFIFOi(i=1,2)に対応するカウンタCiをデクリメント(−1)する。パケット処理装置500には前述したようにマルチプレクサ1070を介してempty信号が入力されるので、該empty信号が非アクティブとなっている間はFIFOバッファ1010にパケットが格納されていることを知ることができる。
図10は、FIFOバッファ1010(FIFO1,FIFO2)に格納されるパケットの形式を示す図である。
パケットの先頭(第1ワード)には、コマンドの種類を示す情報が設定される。これに続く第2ワード目以降には、該コマンドに付随するパラメータが必要な個数だけ設定される。
また、図11は、退避バッファ1020に退避されるパケットの形式を示す図である。このパケットには、パケットデータdataに加え、さらに投入すべきFIFOバッファを示すキュー番号(例えばFIFO1の場合には“1”、FIFO2の場合には“2”)と対応するパケットデータが当該パケットの最後のデータであるか否かを示す情報であるend-bit が付加される。該end-bit は、例えば“1”のときに有効である。プロセッサ100が退避バッファ1020に退避されているパケットデータを該当するFIFOi(i=1,2)に戻す場合には、これらの付加情報を参照する。
次に、上記構成のプロセッサ要素の動作を説明する。
プロセッサ100は、パケットを生成すると、該パケットをバス200のデータバス幅に合わせて分割し、end bit データに該当値を設定して逐次バス200に出力する。そして、オーバーフロー制御部1030に対し、FIFO1またはFIFO2に対するパケットデータdataの書き込み要求信号W11またはW12をイネーブルにしてバス200上のコマンドバスに出力する。
バスインタフェース400は、上記書き込み要求信号Wi(i=1,2)のイネーブル出力を検出すると、この信号Wiをオーバーフロー制御部1030に出力し、その内部のラッチ回路1036にバス200上に出力されているパケットデータdata並びにend bit をラッチさせる。
このようにして、ラッチ回路1036にラッチされたパケットデータは、オーバーフロー制御部1030によって書き込み要求がなされたFIFOiに順次書き込まれる。そして、プロセッサ100がパケットの最後のデータと共に“1”に設定したend bit データをバス200上に出力すると、オーバーフロー制御部1030は、該当するFIFOiにそのパケットの最後のデータを書き込み、その後、対応するカウンタCiをインクリメント(+1)する。
以上のようにして、プロセッサ100によってFIFOバッファ1010(FIFO1またはFIFO2)に対してパケットが書き込まれ、各FIFO1,2に書き込まれるパケット数がオーバーフロー制御部1030によってカウンタC1,2により計数される。
アービタ1050は、カウンタC1,C2の値を常時、監視しており、該カウンタC1又はC2の値が“0”より大きくなると、マルチプレクサ1060を制御して2つのFIFO1,2の内、適当な方をパケットを取り出すキューとして選択する。また、該制御に伴って、マルチプレクサ1070からパケット処理装置500に対して非アクティブのempty信号が加わる。非アクティブのempty信号は、FIFOバッファ1010すなわちFIFO1またはFIFO2の少なくともいずれか一方にパケットが格納されていることを示している。
パケット処理装置500は、マルチプレクサ1070から非アクティブのempty信号が加わると、アービタ1050に対して出力される信号readをアクティブにして、パケットの受信要求を行う。アービタ1050は、この要求を受けて、FIFO1またはFIFO2のいずれか適切な方にリードイネーブル信号r1またはr2を“イネーブル”にして出力し、該イネーブル出力を行ったFIFOi(i=1,2)からパケットデータを順次読み出す。アービタ1050は、例えば、カウンタC1,2の値が共に“0”より大きな値であった場合、カウンタ値すなわち格納パケット数が多いFIFOiの方を優先的に選択する。そして、マルチプレクサ1060を制御して、該選択したFIFOiから読み出されたパケットデータをパケット処理装置500に順次入力させる。
パケット処理装置500は、該FIFOiから読み出されてくるパケットデータを順次取り込んでパケット処理を開始する。そして、パケットの最後のデータを取り込むと、アービタ1050に対してdone信号を送信する。アービタ1050は、これを受けて上記FIFOiに対応するカウンタCiの値をデクリメント(−1)する。すなわち、FIFOiの格納パケット数は“1”減少したので、これに合わせてカウンタCiの値を更新する。パケット処理装置500は、例えば、各種コマンドの全体長を記憶しており、その記憶情報により各パケットの取り出し終了を検出する。
プロセッサ100がFIFO1またはFIFO2にパケットを書き込む速度の方が、パケット処理装置500がFIFO1またはFIFO2からパケットを取り出して処理する速度よりも速い場合には、FIFO1またはFIFO2が充満状態になる場合があり得る。
このような場合、オーバーフロー制御部1030は、プロセッサ100から現在、充満状態にあるFIFOiに対するパケットデータの書き込み要求を受け取ると、該書き込み要求のあったパケットデータを図11に示す形式で退避バッファ1020のポインタ1033の指すアドレスに書き込む。そして、対応するフラグFiをセットする。このように、いったんフラグFiがセットされると、オーバーフロー制御部1030はその後プロセッサ100からFIFOiに対して書き込み要求がなされるパケットを、ポインタ1033を更新しながら退避バッファ1020の方に書き込む。
このように退避バッファ1020にパケットの書き込みが行われている間に、充満状態にあったFIFOiからパケット処理装置500によってパケットが順次、取り出されていく。そして、やがて、該FIFOiの格納パケット数は“0”となる。すなわち、該FIFOiに対応するカウンタCiの値は“0”になる。これにより、オーバーフロー制御1030においてインタラプト発生部1039からプロセッサ100に対して割り込み信号Interrupt 2が加わる。
プロセッサ100は、この割り込みにより当該割り込み処理ルーチンを実行し、退避バッファ1020からFIFOiに投入すべきパケットデータを読み出し、該パケットデータを該FIFOiに書き込む。そして、この結果退避バッファ1020内にFIFOiに投入すべきパケットデータが残らなくなれば、対応するフラグFiをクリア(リセット)する。このフラグFiのクリアにより、オーバーフロー制御1030は、再びFIFOiが充満状態になるまで、プロセッサ100から書き込み要求がなされるパケットデータをFIFOiに書き込む。
一方、上記退避バッファ1020からFIFOiへのデータのリストアにおいて、まだ、退避バッファ1020の中にFIFOiへの投入パケットデータが残っている場合には、フラグFiはクリアしない。したがって、この場合には、オーバーフロー制御1030は引き続いて、プロセッサ100のFIFOiに対する投入データを、退避バッファ1020の方に書き込む。すなわち、この場合には、退避バッファ1020の方にFIFOiに先に投入すべきパケットデータが残っているからである。
ところで、あるパケットにおいてFIFOiにデータを投入している途中で、FIFOiが充満状態となり、それ以降のデータが退避バッファ1020の方に格納される場合もありえる。この場合においては、カウンタCiはインクリメント(+1)されないので、FIFOiには該パケットは格納されていないものとみなされる。そして、退避バッファ1020に退避されていた残りの全てのデータがFIFOiに転送された時点でカウンタCiがインクリメント(+1)される。したがって、パケット処理装置500は、常にFIFOi内でパケットが完結した時点でFIFOiからパケットを効率良く取り出すことができる。
一方、退避バッファ1020がオーバーフローする状態もありえる。この場合には、コンパレータ1038により割り込み信号Interrupt 1がプロセッサ100に加えられる。プロセッサ100は、この割り込みが加わると、例えばメモリ300上の退避バッファ1020のサイズを拡張する処理などを行う。そして、これに伴ってlimit レジスタ1037の値を更新する。
上述した実施例では、退避バッファ1020から該当するFIFOiへのデータのリストアを、プロセッサ100のソフトウェア処理により実行している。
次に述べる実施例は、上記データリストア処理を完全にハードウェアで実現するキュー装置を実装したプロセッサ要素の例である。
この実施例では、図12に模式的に示すように、退避バッファ1020に対して書き込みポインタWP(図8のポインタ1033に対応)の他に、退避バッファ1020から読み出すべき先頭のパケットデータの格納アドレスを指す読み出しポインタRPを用意する。これにより、退避バッファ1020をリングバッファとして取り扱うことが可能になる。そして、FIFOバッファ1010が空になったことを検出したら、退避バッファ1020に退避されていたデータを上記読み出しポインタRPで示されるアドレスから読み出し、FIFOバッファ1010に転送する。そして、このデータ転送により、退避バッファ1020が“空”になったならば、退避バッファ1020に退避データがあることを示すフラグ1032をリセット(クリア)する。これらの一連の処理をハードウェアにより実現する。
図13は上記データリストア処理をハードウェアにより実現するキュー装置2000を実装したプロセッサ要素の全体構成を示すブロック図である。
同図において、前述した図8に示す実施例内のブロックと同一のブロックには同一の符号を付与しており詳しい説明は省略する。
本実施例においては、FIFOバッファ1010は1個のみ備えられ、これに対応して該FIFOバッファ1010内の格納パケット数を計数するカウンタ1040が設けられている。
本実施例のオーバーフロー制御部2030は、前記図8に示す実施例と同様に、ラッチ回路1036、退避バッファ1020にFIFOバッファ1010に書き込まれるべきパケットデータが退避されていることを示すフラグ1032を備えている。そして、これらの回路以外に、上述した退避バッファ1020用に設けられた書き込みポインタWPと読み出しポインタRP、ポインタ比較器2031、シーケンサ2032、2つのマルチプレクサ2033,2034を備えている。
ポインタ比較器2031は、上記2つのポインタWP,RPの値を入力・比較し、退避バッファ1020が現在、“空”になっているか又は“充満状態”にあるかを検出する。そして、退避バッファ1020が“空”になっていればempty3信号を、“充満状態”になっていればfull3信号をシーケンサ2032に出力する。退避バッファ1020は、上述したようにリングバッファの構成となっているので、“空”の状態のときには上記両ポインタの値は一致し、充満状態のときには上記両ポインタはリングバッファ上における隣接するアドレスを指すことになる。
シーケンサ2032は、オーバーフロー制御部2030を全体を制御し、プロセッサ100からのFIFOバッファ1010に対するパケットデータdataとそれに付加されるend bit データの書き込み要求信号Wをバスインタフェース400を介して受信する。そして、ラッチ回路1036に該パケットデータdataとend bit データをラッチさせる。
マルチプレクサ2033は、シーケンサ2032から加えられる入力選択信号select1に従って上記ポインタWPまたはRPのいずれか一方をアドレス信号としてバスインタフェース400に出力する。このアドレス信号は、バス200を介してメモリ200に送られる。すなわち、シーケンサ2032は、FIFOバッファ1010への投入データを退避バッファ1020に退避させる場合には、書き込みポインタWPの値が選択出力されるように、退避バッファ1020に退避されているデータをFIFOバッファ1010にリストアさせる場合には読み出しポインタRPの値が選択出力されるようにマルチプレクサ2033を制御する。
マルチプレクサ2034は、シーケンサ2032から加えられる入力選択信号select2に従って、ラッチ回路1036にラッチされたプロセッサ100の書き込みデータまたは退避バッファ1020から読み出されたリストア用のデータのいずれか一方を、FIFOバッファ1010に選択出力する。すなわち、シーケンサ2032は、プロセッサ100から書き込み要求がなされたパケットデータdataをFIFOバッファ1010に直接書き込む場合にはラッチ回路1036にラッチされているパケットデータdataが選択出力されるように、退避バッファ1020から読み出されたリストア用のパケットデータdataをFIFOバッファ1010に書き込む場合にはバスインタフェース400から入力される上記リストア用のパケットデータdataが選択出力さるようにマルチプレクサ2034を制御する。また、シーケンサ2032は、上記マルチプレクサ2034からの出力パケットデータdataをFIFOバッファ1010に書き込むときには、ライトイネーブル信号write 2をイネーブルにしてFIFOバッファ1010に加える。
シーケンサ2032は、ラッチ回路1036にパケットの最後のデータdataがラッチされると、該データdataと共にもラッチ回路1036にラッチされたend-bit の値によりラッチ回路1036にパケットの最後のデータdataがラッチされたことを認識する。そして、該最後のデータdataをFIFOバッファ1010に書き込んだ後にカウンタ1040をインクリメント(+1)する。
本実施例においては、FIFOバッファ1010は1個しか実装されていないので、退避バッファ1020に格納されるパケットデータの形式は図14に示すように、前述した実施例とは異なり、end-bit のみが付加された形式となる。シーケンサ2032は退避バッファ1020からFIFOバッファ1010へリストアするパケットデータdataを読み出した際、該end-bit の情報によりパケットの最後のデータdataの読み出しを検出する。そして、該最後のデータdataをFIFOバッファ1010にリストアした後に、カウンタ1040をインクリメント(+1)する。また、パケット処理装置500は、FIFOバッファ1010からパケットの最後のデータを読み出す毎に、該カウンタ1040をデクリメント(−1)する。
以上のような構成の実施例におけるキュー装置2000の動作を、図15のフローチャートを参照しながら説明する。
オーバーフロー制御部2030のシーケンサ2032は、下記の(A)〜(D)の判断を行う。
(A)プロセッサ100からキューすなわちFIFOバッファ1010へのパケットデータdataの書き込み要求があると、退避バッファ1020に“空き”があるか否か調べる。これは、ポインタ比較器2031から入力されるfull3信号がアクティブになっているか否かによって判断する。非アクティブであれば、退避バッファ1020には“空き”がある。
(B)オーバーフローフラグ1032にセットされているflag情報を参照して該オーバーフローフラグ1032がセットされているか否か判別することにより、現在、オーバーフローデータが退避バッファ1020に退避されているか調べる。そして、退避データがあれば次にFIFOバッファ1010からのfull2信号の状態を調べ、現在、FIFOバッファ1010に“空き”があるか調べる。
(C)上記判断(A)において、現在、退避バッファ1020に“空き”があると判断すると、次に、オーバーフローフラグ1032がセットされているか又はFIFOバッファ1010が充満状態(フル状態)にあるか調べる。上述したように、オーバーフローフラグ1032がセットされていることは現在、退避バッファ1020に退避データが存在することを意味する。
(D)上記判断(A)において、現在、退避バッファ1020に“空き”があると判断すると、オーバーフローフラグ1032がオフとなっており、かつFIFOバッファ1010に“空き”があるか否か調べる。
シーケンサ2032は、上記(A)〜(D)の判断を行い、その判断結果に応じてプロセッサ100からキューに対する書き込み要求のあったパケットデータをFIFOバッファ1010または退避バッファ1020のいずれかに書き込む。また、退避バッファ1020に退避されていたパケットデータをFIFOバッファ1010にリストアする。
すなわち、システムの動作開始時には、上記(D)の判断においてオーバーフローフラグ1032がリセットされており、かつFIFOバッファ1010に“空き”があることが認識され、プロセッサ100からのキューに対する書き込み要求データは、FIFOバッファ1010に順次書き込まれる(ステップS11)。そして、FIFOバッファ1010に書き込んだパケットデータに付加されているend-bit が“オン”となっている場合、すなわち、FIFOバッファ1010にパケットの最後のデータを書き込んだ際にはカウンタ1040をインクリメント(+1)する(ステップS12)。これにより、カウンタ1040にはFIFOバッファ1010に格納されているパケット数がセットされる。その後も、マイクロプロセッサ100のキューへの書き込みデータは、上記ステップS11〜S12の処理によりFIFOバッファ1010に書き込まれていく。
そして、やがてFIFOバッファ1010が充満状態になると、FIFOバッファ1010から出力されるfull2信号が“アクティブ”になる。これにより、シーケンサ2032は、上記判断(C)において、FIFOバッファ1010が充満状態(フル)になったことを検出し、これ以降のマイクロプロセッサ100からのキューに対する書き込みデータdataは退避バッファ1020に書き込む。このとき、図14に示すように書き込みデータdataに対して“end-bit ”を付加する(ステップS21)。そして、該データdataの書き込み後、書き込みポインタWPをインクリメント(+1)し(ステップS22)。オーバーフローフラグ1032を“オン”にセットする(ステップS23)。シーケンサ2032は、このように、オーバーフローフラグが“オン”になると、マイクロプロセッサ100からキューへのパケットデータdataの書き込み要求がある毎に、上記ステップS21〜S23の処理を行い、退避バッファ1020に該パケットデータdataを書き込む。
その後、パケット処理装置500によりFIFOバッファ1010からパケットの取り出しが行われ、FIFOバッファ1010に“空き”が生じると、FIFOバッファ1010から出力されるfull2信号は非アクティブとなる。これにより、シーケンサ2032は、上記判断(B)においてFIFOバッファ1010に“空き”が生じたことを検出する。また、オーバーフローフラグ1032がセットされていることにより、退避バッファ1020にオーバーフローデータ(退避データ)が格納されていることを知る。
これにより、シーケンサ2032は退避バッファ1020の読み出しポインタRPの指すアドレスからパケットデータdataを読み出し、該データdataをFIFOバッファ1010に書き込む(ステップS31)。続いて、読み出しポインタRPをインクリメント(+1)する(ステップS32)。そして、FIFOバッファ1010に書き込んだパケットデータdataに付加されていたend-bit が“オン”にセットされていたならば、カウンタ1040をインクリメント(+1)する。すなわち、FIFOバッファ1010に1パケットをリストアするごとにカウンタ1040をインクリメント(+1)する(ステップS33)。この後、ポインタ比較器2031から入力されるempty3信号の状態を調べ、退避バッファ1020が“空”になったか否か調べ、退避バッファ1020に退避されていたデータdataが皆無になったならば、オーバーフローフラグ1032をクリア(リセット)する(ステップS34)。
シーケンサ2032は、例えばマイクロプロセッサ100からキューへのパケットデータdataの書き込み要求が無い間、上記ステップS31〜S34の処理を随時行う。これにより、マイクロプロセッサ100がバス200を使用していない間を利用して、退避バッファ1020からFIFOバッファ1010へのデータのリストアを、マイクロプロセッサ100の動作を妨げることなく行うことができる。
次に、図16は本発明のさらに別の実施例であるキュー装置3000を実装したプロセッサ要素の全体構成を示すブロック図である。同図において、前述した図8に示すプロセッサ要素内のブロックと同一のブロックには同一の符号を付与してあり、これらについては詳しい説明は省略する。
本実施例のFIFOバッファ3010は、2つのFIFOメモリ1,2(以下、単にFIFO1,2と記述する)から成っており、各FIFO1,2はリングバッファ構成となっている。図17にその詳しい構成を示す。
FIFOi(i=1,2,)は、FIFOバッファ3110と、該バッファ3110への次のデータの書き込みアドレスを指す書き込みポインタwpiと、次のデータの読み出しアドレスを指す読み出しポインタrpiから成っている。そして、これらの2つのポインタwpi,rpiを操作することにより、エンドレスなバッファとして機能する。
FIFOバッファ3110に書き込まれるパケットの形式を図18に示す。同図に示すように、パケットの先頭(第1ワード目)にはパケットの全体長を示すサイズ情報が設定されている。
各FIFO1,2にそれぞれ対応してパケット完結検出部3060が設けられている。該パケット完結検出部3060は、対応するFIFO1,2に完結したパケットが格納されているか否かを検出するもので、1個以上の完結されたパケットがFIFO1,2に格納されていれば外部出力のpacket complete 1,2信号を“アクティブ”にする。このpacket complete 1,2信号は、アービタ3050に入力されており、アービタ3050はこのpacket complete 1,2信号により前記マルチプレクサ1060並びにマルチプレクサ1070を制御する。すなわち、このpacket complete 1,2信号は、アービタ3050に対して前記カウンタC1,C2の代替として機能する。そして、アービタ3050は、FIFO1,2からパケットデータdataを読み出す毎に上記ポインタrp1,2を更新する。また、上記書き込みポインタwp1,2の操作は、オーバーフロー制御部3030内の不図示のシーケンサによって行われる。
次に、パケット完結検出部3060の内部の回路構成を図17を参照しながら説明する。
パケットデコーダ3061は、FIFO1,2内に格納されているパケットの先頭ワードのデータをデコードして、該パケットの全体サイズを示すパケット長(packet size)をコンパレータ3063に出力する。
演算器3062は、FIFO1,2から上記2つのポインタrp,wpの値を入力し、両ポインタ値からFIFO1,2に格納されているパケットデータの個数(ワード数)を示すデータ長(data length)を求め、これを上記コンパレータ3063に出力する。
コンパレータ3063は、パケットデコーダ3061から入力されるパケット長と演算器3062から入力されるデータ長とを比較する。そして、該データ長がパケット長以上であれば、FIFO1,2内においてパケットが完結していることを示すべくアービタ3050に加えるpacket complete 信号1,2を“アクティブ”にする。
ポインタ比較器3064は、前述した図13に示すポインタ比較器2031と同様な動作を行うものでFIFO1,2から上記2つのポインタrp(rp1,2),wp(wp1,2)を入力し、これら両ポインタ値を比較して、FIFO1,2が“充満状態(full) ”にあることを示すfullフラグ1,2信号と、該FIFO1,2が“空”になっていることを示すemptyフラグ1,2信号を生成し、これらをオーバーフロー制御部3030に出力する。
本実施例におけるオーバーフロー制御部3030内におけるインタラプト発生部3039の構成を図19に示す。
同図に示すように、インタラプト発生部3039は前述したインタラプト発生部1039からコンパレータ1102,1106を削除した構成となっており、アンドゲート1104,1108には、それぞれ前記パケット完結検出部3060から出力されるemptyフラグ1,2信号が入力される。そして、前記インタラプト発生部1039と同様に、フラグFi(i=1,2)がセットされているときにFIFOiが“空”になったら、割り込み信号Interrupt 2を“アクティブ”にしてプロセッサ100に割り込みをかける。
上述した実施例においては、パケット処理装置500は、FIFOバッファ3010内でパケットが完結した時点で、該パケットを取り出す。換言すれば、FIFOバッファ3010内でパケットが未完結な場合、そのパケットデータdataのFIFOバッファ3010からの出力を抑制できる。これにより、プロセッサ100のソフトウェア処理により、FIFOバッファ3010にいったん入力された未完結なパケットの一部のデータdataをFIFOバッファ3010から取り出し一時的にメモリ300上に設けた不図示の退避領域に退避させておき、その後、この退避領域に退避させていたパケットデータdataを再びFIFOバッファ3010に復帰させることによりこのパケットをその他のパケットと同様にFIFOバッファ3010内で完結させることが可能である。
このような機能は、プロセッサ100がマルチプログラム処理をサポートしている場合に有効である。この場合、複数のプロセス(ここで、プロセスとは1つのプログラムの走行単位とする)が、1つのFIFOバッファ(FIFO1またはFIFO2)をキューとして共有する際、あるプロセスが該FIFOバッファにパケットを書き込んでいる途中で、別のプロセスに実行権がスイッチされこの別のプロセスがFIFOバッファにパケットを書き込む場合があり得る。このような場合、上記機能を利用することにより、両プロセスがFIFOバッファに正しくパケットを書き込むことが可能になる。
図20及び図21は、上記機能を実現するプロセッサ100並びにキュー装置1000,2000もしくは3000の動作を説明するフローチャートである。図20のフローチャートは、プロセッサ100がプロセスAの実行中に該プロセスAの実行を中断し、他のプロセスBの実行に移行する場合の動作を説明するフローチャートである。
この場合、プロセッサ100はオーバーフロー制御部1030(2030もしくは3030)を介しFIFOバッファ1010(もしくは3010)の書き込みポインタの値を読み出す(ステップS101)。
次に、該書き込みポインタの指すアドレスのデータdataをオーバーフロー制御部1030(2030もしくは3030)を介しFIFOバッファ1010(もしくは3010)から読み出し(ステップS102)、該データがプロセスAが書き込み途中のデータdataであるか否か判別する(ステップS103)。そして、プロセスAが書き込み途中のデータdataであれば(S103,YES)、このデータdataをメモリ300上の退避領域に退避する。そして、このデータの退避に伴ってFIFOバッファ1010(もしくは3010)の書き込みポインタを修正する(ステップS104)。
上記ステップS101〜S104の処理を、プロセスAが書き込み途中の全てのデータdataをFIFOバッファ1010(もしくは3010)からメモリ300の上記退避領域に退避するまで繰り返し、FIFOバッファ1010(もしくは3010)内にプロセスAが書き込み途中のパケットのデータdataが無くなると(S103,NO)、処理を終了する。
以上の処理によって、プロセスAがその実行中にFIFOバッファ1010(もしくは3010)に書き込んでいた未完結のパケットがメモリ300の特定領域に退避される。
次に、図21はプロセッサ100がプロセスBの実行を終了して再びプロセスAの実行を再開する前に行う動作を説明するフローチャートである。
プロセッサ100は、上記メモリ300上の上記退避領域を調べ、該退避領域にプロセスAの退避データdataが存在するか否か調べる(ステップS201)。
そして、該退避データdataが存在すれば(S201,YES)、これをオーバーフロー制御部1030(2030または3030)を介してFIFOバッファ1010(もしくは3010)に転送する。そして、該転送したデータ長に応じてFIFOバッファ1010(もしくは3010)の書き込みポインタを更新する(S202)。
以上の処理により、FIFOバッファ1010(もしくは3010)にはプロセスBが書き込んだパケットに続いて、プロセスAが中断させられる前に書き込んでいた未完結のパケットのデータdataが格納される。そして、これにより、プロセスAは実行再開後、残りのパケットデータdataを該格納済のパケットデータdataに続いて書き込み、FIFOバッファ1010(もしくは3010)に完結したパケットを書き込むことが可能になる。
前記図20のステップS103におけるプロセスAが書き込み途中のデータがFIFOバッファ1010(もしくは3010)内に存在するか否かの判別は、パケット完結検出部3060の検出結果を利用する以外には、例えば、以下のような方法により行う。
(1)前記図14に示すように、FIFOバッファ1010(もしくは3010)に格納する各パケットデータにend bit を付加する構成を採用する場合、FIFOバッファ1010(もしくは3010)に最後に書き込まれたパケットデータに付加されているend bit の値を調べる。そして、該end bit に“0”(パケットの末尾データではないことを示す情報)が設定されていた場合には、プロセスAが書き込み途中のデータがFIFOバッファ1010(もしくは3010)内に在ると判断する。そして、この場合には、図22に示すようにend bit が“1”(パケットの末尾データであることを示す情報)に設定されている前パケットの末尾データの直前に格納されているパケットデータ(data) をメモリ300上に設けられた退避領域に退避させる。
(2)バスインタフェース400にFIFOバッファ1010(もしくは3010)に書き込まれるパケットのデータ数を計数するカウンタを設ける。このカウンタは、FIFOバッファ1010(もしくは3010)内に対するパケットの書き込み動作が開始される毎に計数を開始し、FIFOバッファ1010(もしくは3010)にパケットの最後のデータの書き込みを終了した時点で“0”にリセットされ計数を終了する。したがって、プロセスAからプロセスBへの切り換えが発生した場合、上記カウンタの値を調べることにより、プロセスAがパケットの書き込み途中であったか否かを判断できる。すなわち、上記カウンタの値が“0”であればパケットの書き込みは終了している。これに対し、該カウンタの値が“0”でない場合は、プロセスAが書き込み途中のデータが該カウンタ値に等しい個数だけ有ることが分かる。したがって、FIFOバッファ1010(もしくは3010)の末尾(一番最後に書かれたデータ)から、そのカウンタ値に等しい個数のデータをメモリ300上の退避領域に退避させる。
(3)前記図8または図16に示すアービタ1050または3050に対して、図23に示すように、入力信号pause と出力信号stopを付加する。入力信号pause はアービタ1050または3050に対して「停止」を指示する信号であり、出力信号stopはアービタ1050または3050がFIFOバッファ1010(もしくは3010)からのデータ出力を停止させている状態(停止状態)を示す信号である。
アービタ1050または3050は、pause 信号により「停止」が指示されると( 図24(a) )、FIFOバッファ1010(もしくは3010)からパケットAの出力途中のデータが最後まで出力されるまで、すなわち、パケット処理装置500からアクティブのdone信号が出力されるまでFIFOバッファ1010(もしくは3010)からデータを出力させる(図24(b) ,(c) )。そして、パケットAのデータが最後まで出力されると、FIFOバッファ1010(もしくは3010)からのデータ出力を停止させ、上記「停止状態」を示すstop信号をアクティブにする。したがって、stop信号がアクティブになっている状態においては、FIFOバッファ1010(もしくは3010)の先頭データは必ずパケットの先頭のデータとなっている。
マイクロプロセッサ100は、プロセスAからプロセスBへ実行プロセスを切り換える際、例えば、バスインタフェース400を介してアービタ1050または3050にアクティブのpause 信号を加える。そして、stop信号がアクティブに変化するのをバスインタフェース400を介して検出すると、FIFOバッファ1010(もしくは3010)の先頭からデータを順次読み出して、FIFOバッファ1010(もしくは3010)内の内容を解析することにより、不完全なパケットすなわちプロセスAが書き込み途中の未完結なパケットのデータがFIFOバッファ1010(もしくは3010)内にあるか否かを検出できる。