(57)【特許請求の範囲】
【請求項１】
送信データバッファを備えてデータを送信する送信側と、受信データバッファを備えて前記データを受信する受信側との間におけるＰＣＩ−Ｅｘｐｒｅｓｓに基づくフロー制御方法であって、
前記送信側において、前記送信データバッファで受け付けた送信データのクレジットの累計である第１のクレジットと、送信可能な累積データ量を示す第２のクレジットとを比較し、前記第２のクレジットが前記第１のクレジット以上である場合に、前記送信データバッファ内のデータを前記受信側に送信する段階と、
前記受信側において前記送信側から送られてきたデータを前記受信データバッファに格納する段階と、
前記受信データバッファからデータが取り出される都度、前記取り出されたデータ量に見合うクレジットを累算して第３のクレジットとして前記受信側から前記送信側に通知する段階と、
前記送信側において、通知された前記第３のクレジットを前記第２のクレジットとして前記第２のクレジットを更新する段階と、
前記受信側において前記送信側に対しデータ送信の制限または中止を要求するために、前記第２のクレジットの値を小さくする第４のクレジットを前記受信側から前記送信側に通知し、前記送信側において前記第４のクレジットを前記第２のクレジットとして前記第２のクレジットを更新する段階と、
を有する、フロー制御方法。
【請求項２】
前記第４のクレジットを通知した後、前記送信可能クレジットの値を元の値に復帰させるための前記第３のクレジットを前記受信側から前記送信側に通知する段階をさらに有する、請求項１に記載のフロー制御方法。
【請求項３】
前記第４のクレジットとして、前記送信側から前記受信データバッファに受け入れたデータのクレジットの累計を表わすクレジットを用いる、請求項１または２に記載のフロー制御方法。
【請求項４】
受信データバッファを備え、ＰＣＩ−Ｅｘｐｒｅｓｓに基づいて送信側からデータを受信する受信側におけるフロー制御方法であって、
前記送信側から送られてきたデータを前記受信データバッファに格納する段階と、
前記受信データバッファからデータが取り出される都度、前記取り出されたデータ量に見合うクレジットを累算して第１のクレジットとして前記受信側から前記送信側に通知する段階と、
前記受信側において前記送信側に対しデータ送信の制限または中止を要求するために、前記第１のクレジットよりも値が小さい第２のクレジットを前記受信側から前記送信側に通知する段階と、
を有する、フロー制御方法。
【請求項５】
前記第２のクレジットを通知した後、前記データ送信の制限または中止を解除するために、前記第１のクレジットを前記受信側から前記送信側に通知する段階をさらに有する、請求項４に記載のフロー制御方法。
【請求項６】
前記第２のクレジットとして、前記送信側から前記受信データバッファに受け入れたデータのクレジットの累計を表わすクレジットを用いる、請求項４または５に記載のフロー制御方法。
【請求項７】
データを送信する送信側と、前記送信側から送信されたデータを受信する受信側との間におけるＰＣＩ−Ｅｘｐｒｅｓｓに基づくフロー制御システムであって、
前記送信側は、
送信データバッファと、
前記送信データバッファで受け付けた送信データのクレジットの累計である第１のクレジットを保持する第１のレジスタと、
送信可能な累積データ量を示す第２のクレジットを保持する第２のレジスタと、
前記第１のクレジットと前記第２のクレジットとを比較し、前記第２のクレジットが前記第１のクレジット以上である場合に、前記送信データバッファ内のデータが前記受信側に送信されるようにフロー制御を行うフロー制御回路と、
を有し、
前記受信側は、
前記送信側から送られてきたデータを一時格納する受信データバッファと、
前記受信データバッファからデータが取り出される都度、前記取り出されたデータ量に見合うクレジットを累算して得られる第３のクレジットを保持する第３のレジスタと、
通常時には前記第３のクレジットを前記送信側に通知し、前記送信側に対しデータ送信の制限または中止を要求する場合には、前記第３のクレジットよりも値の小さな第４のクレジットを前記送信側に通知する、セレクタと、
を有し、
前記第２のレジスタは、前記受信側から通知されたクレジットを前記第２のクレジットとして保持する、フロー制御システム。
【請求項８】
前記第４のクレジットとして、前記送信側から前記受信データバッファに受け入れたデータのクレジットの累計を表わすクレジットを用いる、請求項７に記載のフロー制御システム。
【請求項９】
ＰＣＩ−Ｅｘｐｒｅｓｓに基づき、送信側からデータを受信するとともにクレジットによるフロー制御を行うフロー制御システムであって、
前記送信側から送られてきたデータを一時格納する受信データバッファと、
前記受信データバッファからデータが取り出される都度、前記取り出されたデータ量に見合うクレジットを累算して得られる第１のクレジットを保持する第１のレジスタと、
通常時には前記第１のクレジットを前記送信側に通知し、前記送信側に対しデータ送信の制限または中止を要求する場合には、前記第１のクレジットよりも値の小さな第２のクレジットを前記送信側に通知する、セレクタと、
を有するフロー制御システム。
【請求項１０】
前記第２のクレジットとして、前記送信側から前記受信データバッファに受け入れたデータのクレジットの累計を表わすクレジットを用いる、請求項９に記載のフロー制御システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、送信側と受信側との間でデータ転送を行う技術に関し、特に、クレジットに基づいたフロー制御を行う方法及びシステムに関する。
【背景技術】
【０００２】
送信側と受信側との間でデータ転送を行う場合、受信側に設けられるバッファ（受信データバッファ）が満杯にならないように、送信側からのデータ転送を規制するフロー制御を行う必要がある。古くは、特開昭６１−６３１４０号公報（特許文献１）などに見られるように、受信側から送信側に対して、送信の可否を伝える特殊文字を送信することにより、送信側からのデータ転送を制御するフロー制御方法が行われていた。しかしながら特殊文字の送信によるフロー制御は、データ転送速度が高くなった場合に対応できない、確実な制御を行うことができない、トランザクション処理などへの対応が難しい、などの問題点を有している。
【０００３】
そこで、送信側と受信側との間でデータ転送を行う際のフロー制御の方式の一つとして、受信側はクレジットを送信側に伝え、送信側は受け取ったクレジット分だけデータを送信するというクレジット方式のフロー制御が用いられるようになってきている。クレジット方式のフロー制御すなわちクレジットに基づくフロー制御では、受信側は、受信データバッファで処理したデータ量、または受信データバッファの空き容量からクレジットを生成し、そのクレジットを受信クレジットとして送信側に送信する。この際、受信側は、通知した送信クレジット分のデータは必ず受信しなければならない。送信側は、受信側から受信クレジットを受信し、自分の保持している送信可能クレジットに加算する。そして送信側は、送信可能クレジットが、これから送信しようとするデータのクレジット（送信クレジット）と等しい、もしくはそれ以上である場合に、受信側に対してデータを送信する。クレジットとは、データ量を表わすものである。データ転送のフロー制御の技術分野では、バイトやキロバイト単位でデータ量を直接表わすのではなく、あらかじめ所定のデータ量を１クレジットと定めた上で、クレジットを単位として用いてデータ量やデータ転送量を表わすことが多い。クレジットに基づくフロー制御の例として、特開２００４−２３５７２８号公報（特許文献２）に開示されたものがある。
【０００４】
図７は、クレジット方式に基づくフロー制御によってデータ転送が制御される従来のフロー制御システムの構成の一例を示している。このフロー制御システムは、送信装置と受信装置との間でデータ転送を行う場合のフロー制御を行うものであり、大別すると、データを送信する送信側１０１と、送信側１０１から送信されたデータを受信する受信側１０２とから構成されている。ここで示す送信側１０１は、送信装置において受信装置側に対するインタフェースとなる部分であり、同様に受信側１０２は、受信装置において送信装置側に対するインタフェースとなる部分である。送信側１０１と受信側１０２との間には、データ用信号１０９としてデータ本体が送受信されるデータ線と、クレジット通知信号１１０として受信側１０２から送信側１０１へのクレジット通知が行われる信号線が設けられている。
【０００５】
受信側１０２は、送信側１０１から受信したデータを一時保持するＦＩＦＯ（First-in First-out；先入れ先出し）形式の受信データバッファ１０７と、送信側１０１へ通知すべきクレジット（受信クレジット）を計算するクレジット通知制御回路１０８と、を備えている。受信データバッファ１０７に格納されたデータは、受信装置の内部にある他の回路（不図示）によって取り出されるようになっている。そして受信側１０２では、受信データバッファ１０７に格納された受信データを処理するためにその受信データが受信データバッファ１０７から受信装置の内部にある他の回路へ送出された場合、受信データバッファ１０７からクレジット通知制御回路１０８に対し、その受信データ量に見合うクレジットを通知する受信データクレジット信号１１１が送られるようになっている。クレジット通知制御回路１０８は、受信データクレジット信号１１１に基づいて、送信側１０１へ通知すべき受信クレジットを計算し、計算された受信クレジットを送信側１０１に通知する。
【０００６】
送信側１０１は、送信データが格納される送信データバッファ１０３と、送信データバッファ１０３に格納されたデータが有するクレジットを送信クレジットとして計算して保持する送信クレジット計算回路１０４と、送信側１０１における送信可能クレジットを計算して保持する送信可能クレジット算出保持回路１０５と、フロー制御を行うフロー制御回路１０６と、を備えている。送信データバッファ１０３には、送信装置内部に設けられデータ送信元となる回路（不図示）から送信データが伝送されるようになっており、伝送されてきた送信データは、送信データバッファ１０３に一時的に格納される。送信データバッファ１０３は、格納している送信データを、フロー制御回路１０６の制御によって受信側１０２に送信する。
【０００７】
送信クレジット計算回路１０４は、送信データバッファ１０３から実際にデータが受信側１０２に対して送信された場合には、その送信されたデータのデータ量に見合うクレジットを送信可能クレジット算出保持回路１０５に通知する。送信可能クレジット算出保持回路１０５は、送信データバッファ１０３が受信側１０２に対してデータを送信した際には、その送信可能クレジット算出保持回路１０５が保持している送信可能クレジットから、送信クレジット計算回路１０４により通知されたクレジットを差し引く。また、送信可能クレジット算出保持回路１０５は、受信側１０２からの受信クレジットを受信すると、その送信可能クレジットに受信した受信クレジットを加えて、送信可能クレジットを更新する。なお、このフロー制御システムの初期化時には、一般に、送信可能クレジットとして、受信データバッファ１０７が空であるときの受信データバッファ１０７の容量に対応するクレジットが設定される。
【０００８】
フロー制御回路１０６は、送信可能クレジット算出保持回路１０５に保持されている送信可能クレジットと送信クレジット計算回路１０４に保持されている送信クレジットとを比較し、その比較結果に応じてフロー制御を実行する。すなわち、送信可能クレジットの方が送信クレジットより大きいか等しい場合には、フロー制御回路１０６は、送信データバッファ１０３に格納されているデータが受信側１０２に送信されるようにする。逆に、送信可能クレジットが送信クレジットよりも小さい場合には、フロー制御回路は、受信側１０２から受信クレジットを受信することによって送信可能クレジットの方が送信クレジットより大きいか等しくなるまで、データ送信を一時中断させる。
【０００９】
次に、図８に示すフローチャートを利用して、図７に示した従来のフロー制御システムの動作について説明する。図８（ａ）は、送信側１０１におけるデータ送信の処理および送信可能クレジット算出保持回路１０５での送信可能クレジット更新の処理を示し、図８（ｂ）は、受信側１０２におけるデータ受信の処理およびクレジット通知回路１０８のクレジット更新の処理を示し、図８（ｃ）は、送信側１０１における、受信クレジットを受信したことによる送信可能クレジットの更新の処理を示している。上述したように、送信データを送信するための処理が開始される前の段階において、送信可能クレジット算出保持回路１０５が保持する送信可能クレジットと、受信データバッファ１０７のクレジットは同じであり、これは受信データバッファ１０７の空き容量に対応するものであって、クレジット“Ｂ”とする。
【００１０】
まず、送信側１０１が、送信装置内の送信元の回路あるいは他のシステムからクレジット“Ａ”のデータ（データ量がクレジット“Ａ”で表わされるデータ）を受信した場合の処理を説明する。
【００１１】
図８（ａ）を参照すると、ステップ２０１において、送信データバッファ１０３にクレジット“Ａ”の送信データが格納され、これにより、ステップ２０２において、送信クレジット計算回路１０４が保持する送信クレジットが“Ａ”に更新される。次に、ステップ２０３において、送信可能クレジット算出保持回路１０５が保持する送信可能クレジット“Ｂ”と、送信クレジット“Ａ”とが比較される。この比較の結果、“Ａ”≦“Ｂ”であれば、送信可能クレジットの方が等しいか大きい、すなわち、送信データバッファ１０３に格納されたデータのデータ量よりも受信データバッファ１０７の空き容量が等しいか大きいので、フロー制御回路１０６により、ステップ２０４において、送信データバッファ１０３から受信側１０２に対し、クレジット“Ａ”のデータが送信される。データを送信した結果、送信データバッファ１０３内は空となるが、クレジット“Ａ”のデータを送信したことにより、ステップ２０５において、送信可能クレジット算出保持回路１０５内の送信可能クレジットが“（Ｂ−Ａ）”に更新される。一方、ステップ２０３において“Ａ”＞“Ｂ”であれば、“Ａ”≦“送信可能クレジット”となるまでデータが送信せずに、ステップ２０３で待ち続けることになる。なお、クレジットを用いたフロー制御の場合、クレジット“Ａ”の送信データはそれ自体をひとかたまりのものとして受信側１０２に送信することを前提としている。したがって、受信データバッファ１０７の空き具合いに応じてその送信データを分割し、そのように分割された生成した複数の部分データのうちの一部を受信側１０２に送信することは行われない。
【００１２】
このように送信側１０１がクレジット“Ａ”のデータを送信すると、受信側１０２は、図８（ｂ）に示すように、ステップ２０６において、クレジット“Ａ”のデータを受信し、受信したデータは受信データバッファ１０７に格納される。その後、受信装置内の回路が受信データバッファ１０７からクレジット“Ａ”のデータを取り出したことにより、ステップ２０７において、クレジット通知制御回路１０８が保持するクレジットが“Ａ”に更新される。クレジット通知制御回路１０８は、ステップ２０８において、クレジット通知信号１１０を使用して、送信側１０１に受信クレジット“Ａ”の通知を行う。
【００１３】
受信側１０２がクレジット通知信号１１０を送り出すと、図８（ｃ）に示すように、送信側１０１の送信可能クレジット算出保持回路１０５は、ステップ２０９において、受信側１０２から受信クレジットとしてクレジット“Ａ”を受信する。そして送信可能クレジット算出保持回路１０５は、ステップ２１０において、その保持する送信可能クレジット（直前の時点で“（Ｂ−Ａ）”）に対して“Ａ”を加算することにより、送信可能クレジットを“Ｂ”（＝（Ｂ−Ａ）＋Ａ）に更新する。その後、ステップ２０１に戻って、次の送信データを送信するために、上述する処理を繰り返す。
【００１４】
以上説明したフロー制御では、送信可能クレジットは、その時点で受信データバッファ１０７が受け入れ可能なクレジットを表わしており、送信可能クレジットと送信データのクレジットとを比較してから送信データの送信を行っているので、受信データバッファ１０７がバッファオーバーフローなどとなることが防止される。なお、このフロー制御システムでは、受信データバッファ１０７から受信データが取り出されたが、それに対応する受信クレジットの処理が送信側１０１の送信可能クレジット算出保持回路１０５において終了していない場合を除き、通常は、送信可能クレジットが示すクレジットは、その時点での受信データバッファ１０７の空き容量に対応したクレジットと一致する。
【００１５】
ところで、上述したようなフロー制御を実行している途中において、受信側１０２に都合により、受信データバッファ１０７の空き具合によらず、送信側１０１からのデータ送信を停止させたい場合がある。例えば、受信側１０２におけるシステム構成の変更（例えば、『クロスバの経路変更を実施してデータのルーティング先を変更する』など）を行いたい場合である。しかしながら、クレジットに基づく上述した従来のフロー制御システムでは、データ送出の判断が送信側１０１で行われるため、受信データバッファ１０７に空きがある状態では、受信側１０２からの指示によっては、送信側１０１からのデータの送出を停止させることができない。また、送信側１０１からテストデータを送信させ、そのテストデータを受信して評価するために、受信データバッファ１０７の空き容量（＝送信可能クレジット）よりもかなり小さなクレジットのデータのみを受信したい場合もあるが、受信側から指示を行えないために、テストデータではなく、よりデータ量の大きなデータが送信されてきてしまうこともある。
【００１６】
受信側から停止指示を行うことなく送信側の通信を停止させるための手法として、受信側がデータを受信した際に、受信データバッファからデータを取り出したか否かに関わらず、受信側から送信側に対して受信クレジットを送信しないようにする、という手法がある。この手法によれば、送信データの送信ごとに送信側の送信可能クレジットは減少する一方であり、いずれ、ゼロまたはゼロに近い値になる。その結果、どのような送信データもそのクレジットが送信可能クレジット以上となって、送信側から受信側へのデータ送信が行われないこととなる。このような手法は、例えば、特開２００４−７２５４７（特許文献３）に開示されている。しかしながら、この手法では、受信側からの受信クレジットの送信が停止した後、どの程度経過すれば送信側からのデータ送信が停止するのかを受信側では適切に評価できない、という問題点がある。また、トランザクションデータを転送させる場合には、送信側から受信側にデータ本体が送信された後、受信クレジットを含む形でリプライが受信側から送信側に返却（すなわち送信）されることになっているが、受信クレジットの送信側への送出を停止した場合には、当然にリプライの返却も行われないので、タイムアウトの概念があるトランザクション処理の場合には、送信側でリプライタイムアウトが検出され、システム障害発生とみなされる場合がある。例えば、コンピュータシステムにおける内部バスやコンピュータシステムと拡張ボードなどを接続するバスに使用できるものとして最近注目を浴びているＰＣＩ−Ｅｘｐｒｅｓｓでは、クレジットに基づくフロー制御を実施しているが、タイムアウトの概念を有し、送信側が発行したトランザクションのリプライを受信側は一定時間内に送信側に返却する必要があるので、ＰＣＩ−Ｅｘｐｒｅｓｓの場合には、受信クレジットを送信側に送らないことで送信側からのデータ転送を抑止する、という手法を使うことができないことになる。
【００１７】
特開平９−２００２９０号公報（特許文献４）には、クレジットを用いたフロー制御において、送信側が保持するクレジットを更新するための情報を受信側から送信しないようにすることによって、送信側からのデータ送信を停止させることが開示されている。
【００１８】
なお、受信側から送信停止指示を送信側に伝達するための信号線を新たに設ければ、受信側から送信停止を送信側に指示できるようになるので、上述した問題は解決される。しかしながら、送信停止指示を伝達するための信号線を新たに設けることは、大幅なコストアップ要因となり得る上に、そのような信号線を別途設けることが困難な場合がある。また、送信側、受信側ともそのような信号線の存在を前提としたハードウェア構成としなければならないので、特に既存のフロー制御システムや異なるベンダーの機器を用いる環境下では実現が困難である。
【特許文献１】特開昭６１−６３１４０号公報
【特許文献２】特開２００４−２３５７２８号公報
【特許文献３】特開２００４−７２５４７号公報
【特許文献４】特開平９−２００２９０号公報
【発明の開示】
【発明が解決しようとする課題】
【００１９】
上述したように、クレジットに基づく従来のフロー制御システムでは、受信側からの指示によって送信側からのデータ送信を停止させたり制限したりすることができない、という問題点を有する。この問題点は、受信データバッファの空き容量あるいは空き容量の増加に対応したクレジットを受信側から送信側に常時通知するようにしているために生じるが、ここで、受信側から送信側へのクレジットを送信を抑止したとしても、受信側では送信側からのデータ送信がどの時点で終了となるかを予想することができず、また、リプライの返却を必要とするトランザクションをデータ通信の内容としている場合には、リプライタイムアウトが起きてしまう、という問題点を生じる。専用線を設けて受信側から送信側に対して送信停止を指示する場合には、コスト高につながるともに、ハードウェアの改造が必須であって実現が困難である、という問題点がある。
【００２０】
そこで本発明の目的は、クレジットに基づくフロー制御であって、専用の信号線を設けることなく、受信側からの指示で送信側からのデータ送信を停止させ、あるいは制限させることができるフロー制御方法を提供することにある。
【００２１】
本発明の別の目的は、クレジットに基づくフロー制御を行うシステムであって、専用の信号線を設けることなく、受信側からの指示で送信側からのデータ送信を停止させ、あるいは制限させることができるフロー制御システムを提供することにある。
【課題を解決するための手段】
【００２２】
本発明のフロー制御方法は、データを送信する送信側と、受信データバッファを備えてデータを受信する受信側との間におけるデータ送信を制御するフロー制御方法であって、送信側において、送信すべきデータに関するクレジットである送信クレジットと送信可能なデータ量を示す送信可能クレジットとを比較し、送信可能クレジットが送信クレジット未満である場合にはデータ送信を一時中断し、送信可能クレジットが送信クレジット以上である場合には、送信すべきデータを受信側に送信するとともに送信クレジットに基づいて送信可能クレジットを更新する段階と、受信側において送信側から送られてきたデータを受信データバッファに格納する段階と、受信データバッファからデータが取り出される都度、取り出されたデータ量に対応するクレジットを受信クレジットとして受信側から送信側に通知する段階と、送信側において、通知された受信クレジットに基づいて送信可能クレジットを更新する段階と、受信側において送信側に対しデータ送信の制限または中止を要求するために、送信可能クレジットの値を小さくする受信クレジットを受信側から送信側に通知する段階と、を有する。
【００２３】
このフロー制御方法では、送信可能クレジットの値を小さくする受信クレジットを通知した後、送信可能クレジットの値を元の値に復帰させるための受信クレジットを受信側から送信側に通知する段階をさらに設けることが好ましい。
【００２５】
本発明のフロー制御方法は、ＰＣＩ−Ｅｘｐｒｅｓｓに基づくフロー制御にも好ましく用いることができる。その場合には、送信側において、送信データバッファで受け付けた送信データのクレジットの累計である第１のクレジット（ＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ）と、送信可能な累積データ量を示す第２のクレジット（ＣＲＥＤＩＴ  Ｌｉｍｉｔｅｄ）とを比較し、第２のクレジットが第１のクレジット以上である場合に、送信データバッファ内のデータを受信側に送信する段階と、受信側において送信側から送られてきたデータを受信データバッファに格納する段階と、受信データバッファからデータが取り出される都度、取り出されたデータ量に見合うクレジットを累算して第３のクレジット（ＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ）として受信側から送信側に通知する段階と、送信側において、通知された第３のクレジットを第２のクレジットとして第２のクレジットを更新する段階と、受信側において送信側に対しデータ送信の制限または中止を要求するために、第２のクレジットの値を小さくする第４のクレジットを受信側から送信側に通知し、送信側において第４のクレジットを第２のクレジットとして第２のクレジットを更新する段階と、を設ければよい。その場合、第４のクレジットとして、送信側から受信データバッファに受け入れたデータのクレジットの累計を表わすクレジット（ＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ）を用いることが好ましい。
【００２６】
本発明のフロー制御システムは、データを送信する送信側と、送信側から送信されたデータを受信する受信側との間におけるデータ送信を制御するフロー制御システムであって、送信側は、送信データバッファと、送信すべきデータに関するクレジットである送信クレジットを求める送信クレジット算出手段と、送信可能クレジットを保持する送信可能クレジット保持手段と、送信クレジットと送信可能クレジットとを比較して送信可能クレジットが送信クレジット以上である場合に、送信データバッファに格納されているデータを受信側に送信させ、送信可能クレジットが送信クレジット未満であれば、送信可能クレジットクレジットが送信クレジット以上となるまで送信を一時中断させるフロー制御手段と、を有し、受信側は、送信側から送られてきたデータを一時格納する受信データバッファと、受信データバッファからデータが取り出される都度、取り出したデータ量に対応するクレジットを受信クレジットとして送信側に通知し、送信側に対しデータ送信の制限または中止を要求する場合に、送信可能クレジットの値を小さくする受信クレジットを送信側に通知する制御手段と、を有し、送信可能クレジット保持手段は、送信データバッファから受信側にデータが転送されるたびに、送信されたデータのクレジットに応じて送信可能クレジットを更新し、受信クレジットが通知されるたびに通知された受信クレジットに応じて送信可能クレジットを更新する。
【００２７】
本発明のフロー制御システムは、ＰＣＩ−Ｅｘｐｒｅｓｓに基づくシステムに好ましく適用できる。その場合、送信側には、送信データバッファと、送信データバッファで受け付けた送信データのクレジットの累計である第１のクレジットを保持する第１のレジスタと、送信可能な累積データ量を示す第２のクレジットを保持する第２のレジスタと、第１のクレジットと第２のクレジットとを比較し、第２のクレジットが第１のクレジット以上である場合に、送信データバッファ内のデータが受信側に送信されるようにフロー制御を行うフロー制御回路と、を設け、受信側には、送信側から送られてきたデータを一時格納する受信データバッファと、受信データバッファからデータが取り出される都度、取り出されたデータ量に見合うクレジットを累算して得られる第３のクレジットを保持する第３のレジスタと、通常時には第３のクレジットを送信側に通知し、送信側に対しデータ送信の制限または中止を要求する場合には、第３のクレジットよりも値の小さな第４のクレジットを送信側に通知する、セレクタと、を設け、第２のレジスタは、受信側から通知されたクレジットを第２のクレジットとして保持するようにすればよい。第４のクレジットとして、送信側から受信データバッファに受け入れたデータのクレジットの累計を表わすクレジットが好ましく用いられる。
【発明の効果】
【００２８】
本発明では、受信側において送信側からのデータ送信を停止させあるいは制限したい場合に、受信側から、送信側の送信可能クレジット（ＰＣＩ−ＥｘｐｒｅｓｓであればＣＲＥＤＩＴ  Ｌｉｍｉｔ）の値を小さくするようなクレジットを送信側に通知する。その結果、送信側におけるクレジットに基づいた通常のフロー制御プロセスによって、送信側から受信側へのデータ転送が抑止され、あるいは制限される。したがって発明に基づけば、送信停止を通知するための別途の信号線などを設けることなく、また、受信データバッファの空き容量などに関係なく、任意のタイミングで、受信側からの指示に基づき、送信側からのデータ転送を停止させることができるようになるという効果が得られる。
【００２９】
また、本発明は、本来送るべきリプライを送らないことによって送信を停止させるものではないので、リプライタイムアウトの問題が生じず、したがって、確実なデータ転送、フロー制御を行うことができる、という効果も有する。
【００３０】
さらに、送信側と受信側とを有する既存のシステムへの適用を考えた場合、受信側のみを変更すれば本発明のフロー制御方法を実現できるので、本発明は、実装のための手間やコストが小さい、という効果も有する。
【発明を実施するための最良の形態】
【００３１】
次に、本発明の好ましい実施の形態について、図面を参照して説明する。
【００３２】
参考実施形態：
図１は、参考実施形態による、クレジットに基づいたフロー制御システムの全体構成を示している。参考実施形態のフロー制御システムは、図７に示した従来のフロー制御システムと同様に、受信側から送信側に受信クレジットを送信することによってフロー制御が行われるようにしたものである。ただし本参考実施形態のフロー制御システムは、図７に示したものと異なり、受信クレジットとして、送信側に保持されている送信可能クレジットの値を増加させるもののほか、送信可能クレジットの値を減少させることができるものも受信側から送信側に転送できるようにしている。具体的には、負の値を有するクレジットを受信側から送信側に送ることによって、例えば送信可能クレジットの値をゼロとし、どのようなクレジットの送信データが送信データバッファに格納されたとしても、送信側からのデータ送信を抑止することができる。データ送信の抑止を解除するためには、適切な正の値を有するクレジットを受信側から送信側に送ればよい。以下、図１に示したフロー制御システムの詳細を説明する。
【００３３】
図１に示したフロー制御システムは、図７に示したものと同様に、送信装置に設けられてデータを送信する送信側３０１と、受信装置に設けられて送信側３０１から送信されたデータを受信する受信側３０２とを備えており、送信側３０１と受信側３０２との間には、インタフェースとして、データ用信号３０９としてデータ本体が送受信される１または複数本のデータ線と、クレジット通知信号３１０として受信側３０２から送信側３０１へのクレジット通知が行われる複数本の信号線が設けられている。
【００３４】
受信側３０２は、受信したデータを一時保持するＦＩＦＯ形式の受信データバッファ３０７と、送信側３０２に通知すべきクレジットを計算するクレジット通知制御回路３０８と、を備えている。受信データバッファ３０７に格納された受信データを処理するためにその受信データが受信データバッファ３０７から受信装置の内部の回路（不図示）へと転送された場合、受信データバッファ３０７からクレジット通知制御回路３０８に対し、転送された受信データのクレジットを通知する受信データクレジット信号３０８１が送られるようになっている。また受信データバッファ３０７は、受信データバッファ３０７自体の現在の空き容量を示すクレジット（受信バッファクレジット）を通知する受信バッファクレジット信号３０８０をクレジット通知制御回路１０８に送る。クレジット通知制御回路３０８には、受信装置の内部の回路（不図示）から、送信側３０１との通信停止を指示するための通信停止指示信号３１１が供給されるようになっている。
【００３５】
クレジット通知制御回路３０８は、図２に示すように、受信バッファクレジット信号３０８０と受信データクレジット信号３０８１のいずれかを通信停止指示信号３１１に応じて選択するクレジットセレクタ３０８２と、クレジットセレクタ３０８２で選択された方のクレジットを格納するクレジット格納レジスタ３０８３と、通信停止指示信号３１１から通信停止指示を受信した場合は“１”を格納する符号格納レジスタ３０８４とを備えている。本参考実施形態では、クレジットは、絶対値表現による符号付き２進整数で表わすものとしているので、負のクレジットは、その最上位ビット（ＭＳＢ）が“１”となり、正のクレジットはその最上位ビットが“０”となる。そこで、クレジット通知制御回路３０８は、符号格納レジスタ３０８４の内容を最上位ビットとし、クレジット格納レジスタ３０８３に格納されている内容を下位ビットとしてクレジットを生成し、生成されたクレジットを受信クレジットとして送信側３０１に通知する。
【００３６】
送信側３０１は、送信データが格納される送信データバッファ３０３と、送信データバッファ３０３に格納されたデータが有するクレジットを送信クレジットとして計算する送信クレジット計算回路３０４と、送信可能クレジットを計算して保持する送信可能クレジット算出保持回路３０５と、フロー制御を行うフロー制御回路３０６と、を備えている。送信データバッファ３０３に一時格納される送信データは、送信装置の内部の回路あるいは他のシステムから送られてきたものである。送信データバッファ３０３は、格納している送信データを、フロー制御回路３０６の制御によって受信側３０２に送信する。送信クレジット計算回路３０４は、送信クレジットを計算するとともに、送信データバッファ３０３からデータが送信された際に、その送信データのクレジットを通知する送信データクレジット信号３０５３を送信可能クレジット算出保持回路３０５に出力する。フロー制御回路３０６は、送信可能クレジット算出保持回路３０５が保持する送信可能クレジットと送信クレジット計算回路３０４が保持する送信クレジットとを比べることにより、送信可能クレジットの方が大きいか等しい場合は、送信データバッファ３０３に格納されているデータが受信側３０２に送信され、小さい場合には、送信可能クレジットが送信クレジットよりも大きくなるか等しくなるまでデータ送信が一時中断されるフロー制御を実行する。
【００３７】
送信可能クレジット算出保持回路３０５は、図３に示すように、クレジット通知信号３１０より受信したクレジットを、符号信号３０５１（クレジットのＭＳＢ）とクレジット信号３０５２（クレジットのうちＭＳＢを除いた下位ビット）に分割するクレジット分割回路３０５０と、送信可能クレジットを格納する送信可能クレジット格納レジスタ３０５４と、送信可能クレジットを計算する送信可能クレジット計算回路３０５５と、送信可能クレジット計算回路３０５５での計算の結果、送信可能クレジットが負の値になった場合に、“１”が格納される符号格納レジスタ３０５６と、を備えている。送信可能クレジット格納レジスタ３０５４が保持する送信可能クレジットは、送信可能クレジット通知信号３０５７により、フロー制御回路３０６に伝えられるようになっている。
【００３８】
送信可能クレジット計算回路３０５５は、送信データバッファ３０３が受信側３０２に対してデータを送信すると、送信可能クレジット格納レジスタ３０５４が保持している送信可能クレジットから送信データクレジット信号３０５３で通知されたクレジットを差し引き、また、受信側３０２から、符号信号３０５１が“０”のクレジット通知信号３１０を受信すると、送信クレジット格納レジスタ３０５４に格納されている送信可能クレジットにクレジット信号３０５２のクレジットを加えることで、送信可能クレジットを計算し更新する。さらに送信可能クレジット計算回路３０５５は、受信側３０２から、符号信号３０５１が“１”のクレジット通知信号３１０を受信すると、送信可能クレジット格納レジスタ３０５４に格納された送信可能クレジットからクレジット信号３０５２のクレジットを引いて、送信可能クレジットを計算し更新する。
【００３９】
本参考実施形態では、クレジット通知信号３１０用の複数の信号線のうちの１本が、クレジット符号信号を受信側３０２から送信側３０１に送信するために使用される。
【００４０】
次に、このフロー制御システムの動作について説明する。このフロー制御システムにおいて、送信側３０１が送信データを受信する前には、送信可能クレジット算出保持回路３０５内の送信可能クレジット格納レジスタ３０５４には、送信可能クレジットとして、受信データバッファ３０７自体のクレジット（受信バッファクレジット）と同じものが格納され、ここでは、このクレジットは“Ｂ”であるとする。
【００４１】
まず、受信側３０２において通信停止指示信号３１１がクレジット通知制御回路３０８に入力していない場合の処理を説明する。この場合、符号格納レジスタ３０８４の内容は“０”であり、クレジットセレクタ３０８２は受信データクレジット信号３０８１を選択しているので、クレジット格納レジスタ３０８３には受信データクレジット信号３０８１がそのまま格納される。その結果、受信側３０２からは、最上位ビットが“０”であり、受信データバッファ３０７から取り出された受信データのデータ量に対応する正のクレジットが、受信クレジットとして送信側３０１に送られる。送信側３０１においても符号信号３０５１は“０”であり、クレジット分割回路３０５０で分割されたクレジット信号３０５２が示すクレジットが、送信可能クレジットに加算されることになる。したがって、上述した図８に説明したものと同様の動作が行われることになる。
【００４２】
次に、受信側３０２が、通信指示停止信号３１１により『送信側との通信停止指示』を受信した場合、あるいは『送信側との通信停止解除指示』を受信した場合のクレジット通知回路３０８のクレジット更新の動作について、図４を用いて説明する。図４（ａ）は、通信指示停止信号３１１により『送信側との通信停止指示』あるいは『送信側との通信停止解除指示』を受信した場合の受信側３０２の処理を示しており、図４（ｂ）は、送信側３０１における、クレジット受信による送信可能クレジット算出保持回路３０５の送信可能クレジット更新の動作を示している。
【００４３】
図４（ａ）に示すように、受信側３０２は、ステップ２１１において、通信停止指示信号３１１により、『送信側との通信停止指示』を受信する。すると、ステップ２１２において、クレジット通知制御回路３０８の符号格納レジスタ３０８４が“１”に更新され、ステップ２１３において、クレジットセレクタ３０８２により受信バッファクレジット信号３０８０が選択され、クレジット格納レジスタ３０８３には、受信バッファクレジット（ここでは“Ｂ”）が格納される。符号格納レジスタ３０８４の内容とクレジット格納レジスタ３０８３の内容とが組み合わされることにより、ステップ２１４において、最上位ビットが“１”であり残りの下位ビットが“Ｂ”であるクレジット“１Ｂ”が、送信側３０１に通知される。最上位ビットの“１”は、符号格納レジスタ３０８４の格納値が“１”であることに由来する。最上位ビットが“１”であることにより、このクレジットは、絶対値は“Ｂ”であるが値は負である。
【００４４】
このように受信側３０２がクレジット“１Ｂ”のクレジット通知信号３１０を受信クレジットとして送り出すと、図４（ｂ）に示すように、ステップ２１５において、送信側３０１の送信可能クレジット算出保持回路３０５は、受信側３０２からのクレジット“１Ｂ”を受信する。受信されたクレジットは、ステップ２１６において、送信可能クレジット算出保持回路３０５のクレジット分割回路３０５０により、符号信号３０５１とクレジット信号３０５２とに分割される。この例では、符号信号３０５１は“１”、クレジット信号３０５２は“Ｂ”である。符号信号３０５１が“１”であるクレジットを受信すると、送信可能クレジット計算回路３０５５は、送信可能クレジット格納レジスタ３０５４に格納されている値から、クレジット信号３０５２が表わすクレジット（“Ｂ”）を差し引いて送信可能クレジットを計算するので、送信可能クレジットは“０”（＝“Ｂ”−“Ｂ”）となる。その結果、ステップ２１７において、送信可能クレジット計算回路３０５５は、送信可能クレジット“０”を、送信クレジット格納レジスタ３０５４に格納する。ステップ２１８において、送信可能クレジット算出保持回路３０５は、送信可能クレジット通知信号３０５７を使用して、フロー制御回路３０６に送信可能クレジット“０”を通知する。
【００４５】
このようにして送信可能クレジットとして“０”が設定された場合に、送信側３０１において、送信装置の内部の回路あるいは他のシステムから、クレジット“Ｄ”のデータが受信されたとする。すると、前述の図８（ａ）に示すフローチャートを参照して、ステップ２０１において、送信データバッファ３０３にクレジット“Ｄ”のデータが格納され、ステップ２０２において、送信クレジット計算回路３０４が保持する送信クレジットが“Ｄ”に更新される。そしてフロー制御回路３０６は、ステップ２０３において、送信可能クレジット（ここでは“０”）と送信クレジット（ここでは“Ｄ”）を比較し、“Ｄ”＞“０”なので、“Ｄ”≦“送信可能クレジット”となるまでデータを送信せずにステップ２０３で待ち続けるようにフロー制御を行う。
【００４６】
以上説明したようにして、受信側３０２が通信停止指示信号３１１により『送信側との通信停止指示』を受信すると、送信側の通信が停止することになる。
【００４７】
次に、送信側でのデータ送信が停止した状態からの通信再開の手順について説明する。
【００４８】
図４（ａ）に示すフローチャートにおいて、受信側３０２は、ステップ２１１において、通信停止指示信号３１１により『送信側との通信停止解除指示』を受信する。その結果、ステップ２１２において、クレジット通知制御回路３０８の符号格納レジスタ３０８４の内容が“０”に更新され、ステップ２１３において、クレジットセレクタ３０８２により受信バッファクレジット信号３０８０が選択され、クレジット格納レジスタ３０８３には、受信バッファクレジット信号３０８０が示すクレジット（ここでは“Ｂ”）が格納される。ステップ２１４において、送信側３０１にクレジット“０Ｂ”が通知される。クレジット“０Ｂ”のうちの最上位桁の“０”は、符号格納レジスタ３０８４の格納値が“０”であることに対応する。
【００４９】
このように受信側３０２がクレジット“０Ｂ”のクレジット通知信号３１０を受信クレジットとして送り出すと、図４（ｂ）に示すフローチャートにおいて、ステップ２１５において、送信側３０１の送信可能クレジット算出保持回路３０５は、受信側３０２からクレジット“０Ｂ”を受信し、ステップ２１６において、受信されたクレジット“０Ｂ”は、送信可能クレジット算出保持回路３０５内のクレジット分割回路３０５０により、符号信号３０５１（ここでは“０”）とクレジット信号３０５２（ここでは“Ｂ”）に分割される。符号信号３０５１が“０”であるクレジットを受信した場合には、送信可能クレジット計算回路３０５５は、送信可能クレジット格納レジスタ３０５４に格納されているクレジットにクレジット信号３０５２によるクレジットを加えて送信可能クレジットを計算するので、送信可能クレジットは“Ｂ”（＝０＋“Ｂ”）となる。その後、ステップ２１７において、送信可能クレジット計算回路３０５５は、送信可能クレジット“Ｂ”を送信クレジット格納レジスタ３０５４に格納する。ステップ２１８において、送信可能クレジット通知信号３０５７を使用して、フロー制御回路３０６に対して送信可能クレジット“Ｂ”が通知される。フロー制御回路３０６に送信可能クレジット“Ｂ”が通知されることにより、前述の図８（ａ）に示した手順にしたがって、送信データバッファ３０３から受信側３０２へのデータ通信が開始される。
【００５０】
なお、送信側が通信停止となっている間に受信データバッファ３０７からデータが取り出されて受信データバッファ３０７の空き容量が変化する場合があるが、その場合も、ステップ２１３においては、先に通信停止を指示したときに用いた受信バッファクレジットがクレジット格納レジスタ３０８３に格納されるようにする。受信データバッファ３０７からデータが取り出されたことに受信データバッファ３０７の空き容量が変化したことへの対応としては、上述した場合と同様に、別途、取り出されたデータに対応する受信データクレジットを受信クレジットとして送信側３０１に送信するようにする。
【００５１】
以上、通信指示停止信号３１１により『送信側との通信停止指示』を受信した場合、あるいは『送信側との通信停止解除指示』を受信した場合の動作について、送信可能クレジットと受信バッファクレジットがともに“Ｂ”である場合について説明した。システムの初期化時に受信データバッファ３０７の容量に対応するクレジットを送信可能クレジットに設定していれば、このフロー制御システムにおいては、送信停止を指示した場合などを除き、送信側と受信側との間でデータやクレジットの行き違いが生じない限り、送信可能クレジットと受信バッファクレジットは等しい。しかしながら、データやクレジットの行き違いが生じた場合には、両方のクレジットが異なることがある。
【００５２】
例えば、受信データバッファ３０７からデータが取り出されたことにより、受信データクレジットを送信側３０１に送信しなければならないが、その受信データクレジットの送信が完了していない場合には、送信可能クレジット格納レジスタ３０５４に格納されている送信可能クレジット（ここでは“Ｃ”とする）が、受信データバッファのクレジット（“Ｂ”）より小さくなる。このように“Ｃ”＜“Ｂ”の場合には、上述したステップ２１５において送信側３０１は受信側３０２からクレジット“１Ｂ”を受信し、ステップ２１６において送信可能クレジット計算回路３０５５が計算することにより、送信可能クレジットは“（Ｃ−Ｂ）”となり、送信可能クレジットの値は負となる。その結果、ステップ２１７において、符号格納レジスタ３０５６に“１”が格納され、送信可能クレジット“（Ｃ−Ｂ）”が送信可能クレジット格納レジスタ３０５４に格納される。ステップ２１８で、送信可能クレジット算出保持回路３０５は、送信クレジット通知信号３０５７を使用して、フロー制御回路３０６に送信可能クレジット“（Ｃ−Ｂ）”を通知する。この場合も、送信データのクレジットは送信可能クレジットよりも必ず大きいので、送信データの送出が抑止されることになる。
【００５３】
この状態でデータ送信の停止を解除する場合を説明する。送信クレジット格納レジスタ３０５４に格納されている送信可能クレジットが“（Ｃ−Ｂ）”（負の値）で、符号格納レジスタ３０５６に“１”が格納されている場合、ステップ２１５において送信側３０１は受信側３０２からクレジット“０Ｂ”を受信し、ステップ２１６において送信可能クレジット計算回路３０５５での計算の結果によって送信可能クレジットは“Ｃ”（＝（Ｃ−Ｂ＋Ｂ））となるので、送信可能クレジットがプラスになる。したがって、ステップ２１７において、符号格納レジスタ３０５６に“０”が格納され、送信可能クレジット“Ｃ”が送信可能クレジット格納レジスタ３０５４に格納される。ステップ２１８において、送信可能クレジット算出保持回路３０５は、送信クレジット通知信号３０５７を使用して、フロー制御回路３０６に送信可能クレジット“Ｃ”（＞０）を通知する。これにより、送信側は、受信側に対してデータを送信できる状態となる。ただし、この時点では、受信データバッファ３０７からデータが取り出されたことに対応する受信データクレジットの送信処理が済んでいないので、送信可能クレジット“Ｃ”は、受信データバッファ３０７の空き容量に対応するクレジット“Ｂ”よりも小さくなっている。その後、受信データクレジットの受信クレジットとしての送信処理を行うことにより、上述した図８に示した手順にしたがって送信側３０１において受信データクレジットの処理が行われ、送信可能クレジットは、受信データバッファ３０７の空き容量に対応するクレジットに一致するようになる。なお、トランザクション処理におけるリプライタイムアウトのことを考慮すれば、送信側からの送信を停止させる場合であっても、まず、受信データバッファ３０７からデータを取り出したことに伴う受信データクレジットを送信側３０１に送信して、送信可能クレジットと受信バッファクレジットの不一致が起こらないようにすることが好ましい。
【００５４】
送信データバッファ３０３から受信側３０１にデータが送信されて送信可能クレジットの値が小さくなったが、そのデータがまだ受信データバッファ３０７で受け付けられていない場合にも、送信可能クレジットが受信バッファクレジットよりも小さくなる場合がある。この場合も、上述したものと同様にして処理することにより、送信側からのデータ送信を停止したり、それを解除したりすることができる。
【００５５】
本参考実施形態では、受信側からの指示によって送信側からの送信を停止するだけでなく、送信側から送信されるデータの大きさを制限することもできる。その場合には、受信側において受け取りたいデータ量に対応するクレジットを“Ｅ”として、送信制限を指示する場合には、値が負であって絶対値が“（Ｂ−Ｅ）”であるクレジットを送信側に送信し、送信制限を解除する場合には、値が正であって絶対値が“（Ｂ−Ｅ）”であるクレジットを送信側に送信すればよい。
【００５６】
以上の説明では、受信側から送信側に送られるクレジットとして、絶対値表現による符号付き２進整数を用いているが、コンピュータにおける通常の演算で一般に用いられている補数表現による符号付き２進整数を用いるようにしてもよい。どちらの形式を整数表現を用いるかは、特に既存のフロー制御システムにおいて本参考実施形態のフロー制御方法を適用する場合には、送信側において受信クレジットを送信可能クレジットに加算する送信可能クレジット算出保持回路３０５内の加算ロジックの実装によって決めればよい。補数表現の符号付き２進整数を用いる場合には、クレジット通知制御回路３０８内において、受信データクレジット信号２０８１の補数を求める補数算出回路を設け、受信データクレジット信号３０８１の補数がクレジットセレクタ３０８３に入力するようにすればよい。
【００５７】
既存システムに本参考実施形態に基づくフロー制御を適用する場合、負の値を有するクレジットを受け付けたときにその値に応じて送信可能クレジットの値を減らすことができる送信側を既に用いているのであれば、受信側のみを上述した構成のものとすることによい。整数演算に関する一般的な実装を考えれば、負の値を有するクレジットを受け付けたときにその値に応じて送信可能クレジットの値を減らすことができる送信側は、広く普及しているものと考えられるので、結局、本参考実施形態のフロー制御システムを構築するためには、受信側だけに手を入れればよいことになる。
【００５８】
本発明の実施形態：
次に、本発明の一実施形態のフロー制御システムを説明する。本実施形態は、本発明に基づくフロー制御方法をＰＣＩ−Ｅｘｐｒｅｓｓインターフェースに対して適用したものである。図５は、本発明の一実施形態のフロー制御システムを示している。
【００５９】
図５に示すフロー制御システムは、参考実施形態のものと同様に、データを送信する送信側７０１と、送信側７０１から送信されたデータを受信する受信側７０２から構成されている。送信側７０１と受信側７０２との間には、インタフェースとして、データ用信号７１１としてデータ本体が送受信される複数本のデータ線と、クレジット通知信号７１０として受信側７０２から送信側７０１へのクレジット通知が行われる複数本の信号線が設けられている。
【００６０】
受信側７０２は、受信したデータを一時保持するＦＩＦＯ形式の受信データバッファ７０７と、データを受信するたびに受信データのクレジットを累算する累算器７２２と、累算器７２２での累算結果を保持するレジスタであるＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９と、受信データバッファ７０７から受信装置の内部回路に受信データが取り出されるたびにその取り出されたデータのクレジットを累算する累算器７２３と、累算器の累算結果を保持するレジスタであるＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８と、ＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８に保持されているクレジットとＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９に保持されているクレジットのいずれかを選択するクレジットセレクタ７１２と、を備えている。クレジットセレクタ７１２には、送信側７０１との通信停止を指示するための通信停止指示信号７１３が、受信装置の内部の回路から供給されている。クレジットセレクタ７１２は、通信停止指示信号７１３に基づいていずれかのクレジットを選択し、受信クレジットを示すクレジット通知信号７１０として送信側７０１に送信する。このような受信側７０２において、ＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８に格納されるクレジットは、ＰＣＩ−Ｅｘｐｒｅｓｓの規格に基づいて、通常時に送信側７０２に通知されるべきクレジットである。
【００６１】
送信側７０１は、送信装置の内部の回路あるいは外部システムなどから送られてきた送信データを一時格納する送信データバッファ７０３と、送信データが送信データバッファ７０３に格納されるたびにその送信データのクレジットを累算する累算器７２１と、累算器７２１の累算結果を保持するレジスタであるＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４と、受信側７０２から受信したクレジットを格納するレジスタであるＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５と、フロー制御を行うフロー制御回路７０６と、を備えている。この場合、受信側から７０２からは常時、その時点でのクレジットが通知されており、受信側から通知されるクレジットが変化すれば、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５に保持されるクレジットも即座に変化する。
【００６２】
ＰＣＩ−Ｅｘｐｒｅｓｓでは、各累算器７２１〜７２３において、オーバーフローを無視した循環形式の演算によって、各クレジットが累算される。フロー制御回路７０６は、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５が保持するクレジットとＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４が保持するクレジットとを比べ、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５が保持するクレジットが大きいか等しい場合は、送信データバッファ７０３に格納されているデータが送信され、そうでない場合には、データ送信が一時中断されるように、フロー制御を実行する。データ送信の一時中断は、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５が保持するクレジットがＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４が保持するクレジットより大きいか等しくなるまで続行する。
【００６３】
累算方式でクレジットを表示する本実施形態のシステムと、出入りするデータ量に応じてクレジットを加減算する図１に示したフロー制御システムとは、クレジットの算出過程では大きく異なっているが、本実施形態における各クレジットは、図１に示したフロー制御システムにおけるクレジットと対応している。すなわち、ＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４が保持するクレジットは送信クレジットに対応し、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５が保持するクレジットは送信可能クレジットに対応し、ＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８が保持するクレジットは受信データクレジットに対応し、ＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９が保持するクレジットは受信バッファクレジットに対応する。
【００６４】
次に、図５に示したフロー制御システムの動作について、図６を用いて説明する。図６（ａ）は、送信側７０１での、データ送信およびＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４のクレジット更新の動作を示し、図６（ｂ）は、受信側７０２での、データ受信およびＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９のクレジット更新の動作、ＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８のクレジット更新の動作を示し、図６（ｃ）は、送信側７０１での、クレジット通知によるＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５のクレジット更新の動作を示し、図６（ｄ）は、受信側７０２において通信停止指示信号７１３として『送信側との通信停止指示』もしくは『送信側との通信停止解除指示』を受信した場合の動作を示している。
【００６５】
データ転送中でなく、かつ、システム内で未処理のクレジットがない状態では、ＰＣＩ−Ｅｘｐｅｒｓｓでは、通常、ＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８が保持するクレジットと、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５が保持するクレジットとは一致する。そこでここでは、これらのクレジットが“Ａ”であるとする。したがって、このときの累算器７２３の値も“Ａ”である。また、これまでに送信データが送信データバッファ７０３に一度も送られてきていないとして、ＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４とＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９が保持するクレジットはいずれも“０”であり、したがって、累算器７２１，７２２の値も“０”である。
【００６６】
まず、送信側７０１が、送信装置の内部回路からクレジット“Ｃ”のデータを受信した場合の処理を説明する。
【００６７】
図６（ａ）のフローチャートに示すように、ステップ２２１において、送信データバッファ７０３にクレジット“Ｃ”の送信データが格納され、ステップ２２２において、累算器７２１がクレジット“Ｃ”を累算することにより、ＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４が保持するクレジットが更新される。ここでは累算器７２１の初期値が“０”であることにより、ＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４が保持するクレジットは“Ｃ”に更新される。フロー制御回路７０６は、ステップ２２３において、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５が保持するクレジット“Ａ”とＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４が保持するクレジット“Ｃ”を比較する。比較の結果、“Ｃ”≦“Ａ”であれば、フロー制御回路７０６によるフロー制御によって、ステップ２２４において、受信側７０２にクレジット“Ａ”のデータが送信される。一方、“Ｃ”＞“Ａ”であれば、“Ｃ”≦“ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５が示すクレジット”となるまで、データを送信せずにステップ２２３で待ち続ける。
【００６８】
このように送信側７０１がクレジット“Ｃ”のデータを送信すると、受信側７０２では、図６（ｂ）のフローチャートに示すように、ステップ２２５において、クレジット“Ｃ”のデータが受信され、ステップ２２６において、累算器７２２がクレジット“Ｃ”を累算することにより、ＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９が保持するクレジットが更新される。ここでは累算器７２２の初期値が“０”であることにより、ＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９のクレジットが“Ｃ”に更新される。そして、クレジット“Ｃ”の受信データが受信データバッファ７０７から受信装置の内部回路に転送されると、ステップ２２７において、累算器７２３においてクレジット“Ｃ”が累算され、ＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８のクレジットが“Ａ＋Ｃ”に更新される。ステップ２２８において、クレジットセレクタ７１２は、ＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８が保持するクレジットを選択し、その結果、クレジット通知信号７１０を使用して、送信側７０１に、ＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８が保持しているクレジット“Ａ＋Ｃ”が受信クレジットとして通知される。
【００６９】
受信側７０２がクレジット通知信号７１０を送り出すと、図６（ｃ）に示すように、ステップ２２９において、送信側７０１は、受信側７０２からクレジット“Ａ＋Ｃ”を受信し、ステップ２３０において、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５のクレジットが“Ａ＋Ｃ”に更新される。その後、ステップ２２１に戻って、次の送信データを送信するために、上述する処理を繰り返す。
【００７０】
ここで、図６（ｄ）のフローチャートに示すように、受信側７０２が、ステップ２３１において、通信停止指示信号７１３により、『送信側との通信停止指示』を受信したものとする。すると、ステップ２３２において、クレジットセレクタ７１２は、このような通信停止指示信号７１３により、ＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９が保持するクレジットを選択し、ＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９が保持するクレジット“Ｃ”が、クレジット通知信号７１０を使用して、受信クレジットとして送信側７０１に通知される。その場合、図６（ｃ）のフローチャートに戻って考えると、ステップ２２９において、送信側７０１は、受信側７０２からのクレジット“Ｃ”を受信し、ステップ２３０において、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５が保持するクレジットが“Ｃ”に更新される。このように、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５が保持するクレジットが“Ｃ”である場合に、送信側７０１が、クレジット“Ｄ”の送信データを受信したものとする。その場合は、図６（ａ）に示すフローチャートにおいて、ステップ２２１において、送信データバッファ７０３にクレジット“Ｄ”のデータが格納されるとともに、累算器７２１での累算の結果、ステップ２２２において、ＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４のクレジットが“Ｃ＋Ｄ”に更新される。ステップ２２３において、ステップ２２３で、フロー制御回路７０６は、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５のクレジット“Ｃ”と、ＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４のクレジット“Ｃ＋Ｄ”を比較する。“Ｃ＋Ｄ”＞“Ｃ”なので、フロー制御回路７０６のフロー制御により、送信側７０１は、“Ｃ＋Ｄ”≦“ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５が保持するクレジット”となるまで、データを送信せずにステップ２２３で待ち続ける。
【００７１】
以上のようにして、『送信側との通信停止指示』の通信停止指示信号７１３により、送信側の通信が停止することになる。この通信停止の処理は、言い換えれば、以下のようになる。
【００７２】
上記の処理において、ＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９が保持するクレジットは、受信データバッファ７０７が受信したデータのクレジットの総和、すなわち送信データバッファ７０３から送信されたはずの送信データのクレジットの総和であるから、これは、送信データバッファ７０３に格納されたデータのクレジットの総和（すなわちＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ７０４に保持されたクレジット）と等しいか小さいはずである。したがって、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５に保持されるクレジットを強制的にＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９に保持されているクレジットに一致させることにより、送信側７０１からのデータ転送が抑止されることになる。
【００７３】
次に、送信側の通信が停止した状態からの通信再開の手順について説明する。
【００７４】
図６（ｄ）に示すフローチャートにおいて、受信側７０２は、ステップ２３１において、通信停止指示信号７１３により、『送信側との通信停止解除指示』を受信する。その結果、ステップ２３２において、クレジットセレクタ７１２はＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８に保持されているクレジットを選択し、それにより、クレジット通知信号７１０を使用して、送信側７０１にＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８に保持されているクレジット“Ａ＋Ｃ”が通知される。このようにクレジット通知信号７１０が送り出されると、送信側７０１は、図６（ｃ）に示すフローチャートにおいて、ステップ２２９において、受信側７０２からクレジット“Ａ＋Ｃ”を受信し、その結果、ステップ２３０において、ＣＲＥＤＩＴ  Ｌｉｍｉｔ７０５が保持するクレジットが“Ａ＋Ｃ”に更新される。“Ａ＋Ｃ”は、送信データのクレジット“Ｃ”よりも大きいので、図６（ａ）のフローチャートにおいてステップ２２３からステップ２２４へと進むこととなり、送信データバッファ７０３から受信側７０２へのデータ通信が再開されることとなる。言い換えれば、送信側７０１に通知されるクレジットとして、本来のクレジットであるＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８に保持されているクレジットを用いることにより、フロー制御システムとして通常時の動作に戻り、送信が再開されることになるのである。
【００７５】
本実施形態のフロー制御システムにおいて、ＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９に保持されているクレジットではなく、このクレジットよりも所定数だけ大きいクレジットを送信側７０１に通知するようにすれば、受信データバッファ７０７における実際の空き容量によらず、その所定数のクレジット以下のクレジットを有する送信データのみが送信側から送信されるようにすることもできる。
【００７６】
既存のＰＣＩ−Ｅｘｐｒｅｓｓによるシステムに本実施形態に基づくフロー制御を適用する場合、送信側７０１としては既存のものをそのまま用いることができる。ＰＣＩ−Ｅｘｐｒｅｓｓ規格に基づき、受信側７０２は、一般に、ＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ７０８のレジスタのほかにＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ７０９のレジスタを備えているので、既存の受信側に対し、通信停止指示信号７１３に応じて切り替わるクレジットセレクタ７１２を付加するだけで、本実施形態に基づくフロー制御に適合できるようにすることができる。
【図面の簡単な説明】
【００７７】
【図１】参考実施形態のクレジットを用いるフロー制御システムの構成を示すブロック図である。
【図２】クレジット通知制御回路の構成を示すブロック図である。
【図３】送信可能クレジット算出保持回路の構成を示すブロック図である。
【図４】送信側の通信を停止させるための処理を説明するフローチャートである。
【図５】本発明の一実施形態のクレジットを用いるフロー制御システムの構成を示すブロック図である。
【図６】図５に示したシステムの動作を説明するフローチャートである。
【図７】クレジットに基づく従来のフロー制御システムの構成を示すブロック図である。
【図８】図７に示したフロー制御システムの動作を説明するフローチャートである。
【符号の説明】
【００７８】
１０１，３０１，７０１    送信側
１０２，３０３，７０２    受信側
１０３，３０３，７０３    送信データバッファ
１０４，３０４    送信クレジット計算回路
１０５，３０５    送信可能クレジット算出保持回路
１０６，３０６、７０６    フロー制御回路
１０７，３０７    受信データバッファ
１０８，３０８    クレジット通知制御回路
１０９，３０９，７１１    データ用信号
１１０，３１０，７１０    クレジット通知信号
１１１，３０８１    受信データクレジット信号
３１１，７１３    通信停止指示信号
７０４    レジスタ（ＣＲＥＤＩＴ  Ｃｏｎｓｕｍｅｄ）
７０５    レジスタ（ＣＲＥＤＩＴ  Ｌｉｍｉｔ）
７０８    レジスタ（ＣＲＥＤＩＴ  Ａｌｌｏｃａｔｅｄ）
７０９    レジスタ（ＣＲＥＤＩＴ  Ｒｅｃｅｉｖｅｄ）
７１２，３０８２    クレジットセレクタ
７２１，７２２，７２３    累算器
３０５０    クレジット分割回路
３０５１    符号信号
３０５２    クレジット信号
３０５３    送信データクレジット信号
３０５４    送信可能クレジット格納レジスタ
３０５５    送信可能クレジット計算回路
３０５６，３０８４    符号格納レジスタ
３０５７    送信可能クレジット通知信号
３０８０    受信バッファクレジット信号
３０８３    クレジット格納レジスタ
【図１】
0004394650.tif 000002
【図２】
0004394650.tif 000003
【図３】
0004394650.tif 000004
【図４】
0004394650.tif 000005
【図５】
0004394650.tif 000006
【図６】
0004394650.tif 000007
【図７】
0004394650.tif 000008
【図８】
0004394650.tif 000009