(57)【特許請求の範囲】
【請求項１】
固定長の記憶領域からなるブロックを複数有し、これらブロックごとにデータの書き込みおよび読み出しを行うメモリ部と、
少なくとも前記ブロック分のデータを保持する書込ブロックバッファと、
少なくとも前記ブロック分のデータを保持する読出ブロックバッファと、
入力された可変長のパケットのパケットデータを、前記書込ブロックバッファへ順次格納するとともに、当該書込ブロックバッファへ格納した各パケットデータの終端位置を示すパケット境界情報を含むブロック管理情報を当該書込ブロックバッファへ格納し、当該書込ブロックバッファの空き容量がなくなった場合に、当該書込ブロックバッファに格納されているデータを前記メモリ部へ書き込んだ後、残りのパケットデータを当該書込ブロックバッファへ格納し、入力された出力指示に応じて、前記メモリ部から前記データを読み出して前記読出ブロックバッファへ格納し、当該データに含まれる前記ブロック管理情報の前記パケット境界情報に基づいて、当該データに含まれる各パケットデータを読み出して出力するパケット制御部と
を備えることを特徴とするパケットバッファ装置。
【請求項２】
請求項１に記載のパケットバッファ装置において、
前記ブロックは、複数ビットの固定長からなるワードを単位として複数個に分割されてなり、
前記パケット制御部は、
前記書込ブロックバッファに前記ブロック管理情報を格納する際、前記書込ブロックバッファ内の先頭ワードから前記ブロック管理情報を格納し、
前記書込ブロックバッファに前記パケットデータを格納する際、前記ブロック管理情報を格納した次のワードから順に格納用のワードを選択し、該選択したワードの先頭バイトから順に当該パケットデータの各バイトを格納するとともに、当該パケットデータの末尾バイトを格納したバイトの次のバイトから所定のパケット終端パタンを格納し、
前記書込ブロックバッファに前記ブロック管理情報を格納する際、前記パケット境界情報に代えて、前記各ワードにおける前記パケットデータの末尾バイトの存在有無を示す境界判定ビット列を含む前記ブロック管理情報を格納する
ことを特徴とするパケットバッファ装置。
【請求項３】
請求項２に記載のパケットバッファ装置において、
前記パケット制御部は、
前記メモリ部内の前記ブロックから前記パケットデータを読み出す際、最初に当該ブロックの先頭ワードから前記ブロック管理情報を取得して、このブロック管理情報の前記境界判定ビット列に基づき、当該ブロックにおけるパケットデータの末尾バイトの存在有無を判定し、当該末尾バイトが存在しない場合には、前記メモリ部に対して次のブロックの読出要求を行う
ことを特徴とするパケットバッファ装置。  
【請求項４】
請求項１〜請求項３のいずれか１つに記載のパケットバッファ装置において、
前記バッファ制御部は、
前記メモリ部内の複数個の前記ブロックで構成された区画のうち、入力されたキュー入力指示情報で指定されたキューと対応する区画に対して、前記パケットデータを書き込むことにより、前記パケットデータを前記キュー入力指示情報で指定されたキューに蓄積し、前記区画のうち、入力されたキュー出力指示情報で指定されたキューと対応する区画から、前記パケットデータの読み出すことにより、前記パケットデータを前記キュー入力指示情報で指定されたキューから取り出し、
前記区画への前記パケットデータの書き込みが満了した場合、当該区画に対して空き区画を連結区画として連結した後、当該空き区画に対する前記パケットデータの書き込みを継続し、前記区画からの前記パケットデータの読み出しが満了した場合、当該区画を空き区画として解放するとともに、当該区画に連結されている連結区画からの前記パケットデータの読み出しを継続する
ことを特徴とするパケットバッファ装置。  
【請求項５】
入力されたパケットをメモリ部に格納するとともに、出力指示に応じて該メモリ部からパケットを取り出して出力するパケットバッファ装置で用いられるパケットバッファ制御方法であって、
前記パケットバッファ装置が、
固定長の記憶領域からなるブロックを複数有し、これらブロックごとにデータの書き込みおよび読み出しを行うメモリ部と、
少なくとも前記ブロック分のデータを保持する書込ブロックバッファと、
少なくとも前記ブロック分のデータを保持する読出ブロックバッファと、
パケット制御部とを備え、
前記パケット制御部が、
入力された可変長のパケットのパケットデータを、前記書込ブロックバッファへ順次格納するとともに、当該書込ブロックバッファへ格納した各パケットデータの終端位置を示すパケット境界情報を含むブロック管理情報を当該書込ブロックバッファへ格納し、当該書込ブロックバッファの空き容量がなくなった場合に、当該書込ブロックバッファに格納されているデータを前記メモリ部へ書き込んだ後、残りのパケットデータを当該書込ブロックバッファへ格納するステップと、
入力された出力指示に応じて、前記メモリ部から前記データを読み出して前記読出ブロックバッファへ格納し、当該データに含まれる前記ブロック管理情報の前記パケット境界情報に基づいて、当該データに含まれる各パケットデータを読み出して出力するステップとを実行する
ことを特徴とするパケットバッファ制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、パケット処理技術に関し、特に入力されたパケットをメモリに格納するとともに、出力指示に応じてメモリからパケットを取り出して出力するパケットバッファ制御技術に関するものである。
【背景技術】
【０００２】
ＦＴＴＨ（Fiber To The Home）を初めとする光通信網の普及により、データ通信回線における通信速度が大幅に高速化され、ネットワークアダプタなどのパケットを送受信するパケット通信装置、特にパケットをバッファリングして処理するパケットバッファ装置において、その処理能力の改善が検討されている。
従来、このようなパケットバッファ装置において、パケット処理をハードウェア化することにより、処理能力を改善したものが提案されている（例えば、非特許文献１など参照）。
【０００３】
図１５は、従来のパケットバッファ装置の構成を示すブロックである。図１６は、従来のパケットバッファ装置の動作を示す説明図である。
図１５のパケットバッファ装置５０は、バッファ制御部５１、データ用メモリ５２、およびジョブ用メモリ５３から構成される。
このパケットバッファ装置５０は、複数のキュー（ＦＩＦＯメモリ）を備え、入力された可変長のパケットを前記キューに格納し、入力された出力指示情報に応じて、前記キューに格納されていた前記パケットを前記キューから取り出して出力する機能を有している。
【０００４】
データ用メモリ５２は、キュー毎に異なるアドレス領域を有し、前記キューのパケットデータを、当該キューと対応する前記領域に蓄積する機能を有している。
ジョブ用メモリ５３は、キュー毎に異なるアドレス領域を有し、入力パケット毎に生成される固定長のパケットジョブ（ジョブ情報）を、前記キューに対応する前記領域に蓄積する機能を有している。パケットジョブは、前記データ用メモリ５２における各パケットの境界位置を特定するためのパケット境界情報を含んでいる。
これら前記データ用メモリ５２および前記ジョブ用メモリ５３は、バッファ制御部５１により、ＦＩＦＯバッファとして制御される。
【０００５】
バッファ制御部５１は、可変長のパケットの入力に応じて、当該パケットのパケットデータをデータ用メモリ５２に書き込む機能と、この書き込みに基づいてパケットジョブを生成してジョブ用メモリ５３に書き込む機能とを有している。パケットジョブは、データ用メモリに前記パケットデータの先頭が格納されたアドレス値を含む。
また、バッファ制御部５１は、出力指示情報の入力に応じて、ジョブ用メモリ５３からパケットジョブを読み出す機能と、このパケットジョブに基づいて、データ用メモリ５２から、対応するパケットのパケットデータを読み出して出力する機能とを有している。
【０００６】
このようなパケットバッファ装置５０では、例えば、バッファ制御部５１がＬＳＩチップ（ＲＥＮＡ−ＣＨＩＰ）で構成されており、データ用メモリ５２がＤＤＲ−ＳＤＲＡＭ（Double-Data-Rate Synchronous Dynamic Random Access Memory）で構成されており、各キューがバッファ制御部５１のＬＳＩ内に配置した内部メモリで構成されている。
したがって、入力されたパケットデータは、バッファ制御部５１により、ＤＤＲ−ＳＤＲＡＭに格納される。このとき、ＤＤＲ−ＳＤＲＡＭにおける前記パケットデータの格納位置を含むパケットジョブが、バッファ制御部５１により、内部メモリに格納される。また、出力指示情報に応じて、ＤＤＲ−ＳＤＲＡＭからパットデータが読み出されて出力される。
【先行技術文献】
【特許文献】
【０００７】
【非特許文献１】NTTジャーナル2006 vol. 18 No. 7 「ＲＥＮＡ−ＣＨＩＰのハードウェア構成技術」、http://www.ntt.co.jp/journal/0607/files/jn200607022.html
【発明の概要】
【発明が解決しようとする課題】
【０００８】
このような従来技術では、パケットを蓄積するためのデータ用メモリ５２に加えて、パケット毎に固定長のパケットジョブを蓄積するためのジョブ用メモリ５３が必要となる。パケットは可変長であるため、短いパケットが続けて入力される場合、データ用メモリの蓄積量は少なくとも、ジョブ用メモリの蓄積量は多くなる。
【０００９】
このため、データ用メモリ５２を、いかなる長さのパケットが入力された場合にも使い切ることを可能とするためには、最短パケットのみでデータ用メモリが充足された場合に蓄積されるパケット数分のパケットジョブを蓄積できるだけの容量を持ったジョブ用メモリ５３が必要となる。
また、データ用メモリ５２にはＳＤＲＡＭのように大容量のメモリを使用することが一般的であるが、ジョブ用メモリ５３は、データ用メモリほどの容量を必要としないことから、ジョブ用メモリ５３専用にＳＤＲＡＭを使用することは回路規模の増大を招くため、一般的にはＳＲＡＭが使用される。
【００１０】
データ用メモリ５２とジョブ用メモリ５３とでメモリを分ける理由は、データ用メモリ５２の帯域利用効率を上げるためである。ＳＤＲＡＭからの読み出しを行う場合は、読み出しコマンドを発行した後、一定の時間を待って、前記読み出しコマンドに対応したデータをＳＤＲＡＭから受け取る必要がある。したがって、前の読み出し結果を受けて、次の読み出しを行う、という動作をＳＤＲＡＭに対して行うと、前記待ち時間によって、ＳＤＲＡＭのインタフェースが持つ帯域を有効に利用できない。
【００１１】
すなわち、メモリに記憶されたパケットデータを読み出す前に、前記パケットデータの格納位置を知る必要があるため、格納位置を読み取った後にパケットデータを読み出すという順番になる。
このとき、格納位置の情報とパケットデータの両方が同一のＳＤＲＡＭに記憶されていると、格納位置の情報をメモリから読み出すために読み出しコマンドをメモリに発行し、一定の待ち時間の経過後に、前記格納位置の情報をメモリから受け取り、その後、前記格納位置の情報に基づいて、パケットデータを読み出すために読み出しコマンドをメモリに発行し、一定の待ち時間の経過後に、前記パケットデータをメモリから受け取る、という手順になる。
【００１２】
このため、１つのパケットのパケットデータをメモリから読み出すのに、待ち時間が２回もかかるため、メモリの帯域利用効率を下がる。したがって、帯域利用効率を上げるために、データ用メモリ５２であるＳＤＲＡＭとは別に、読み出し開始から完了までの時間が短いＳＲＡＭを用いたジョブ用メモリ５３が設けられている。
ＳＲＡＭは、１ビットあたりの面積がＳＤＲＡＭより大きいが、メモリからの読み出しを短時間に行うことができる、という特徴を備えている。ＳＲＡＭ上のジョブ用メモリ５３から短時間でパケットジョブを読み出し、このパケットジョブの情報に基づいて、ＳＤＲＡＭ上のデータ用メモリ５２からパケットデータを読み出すことにより、ＳＤＲＡＭの帯域利用効率を上げている。
【００１３】
しかしながら、ＳＲＡＭは、ビット当たりの面積がＳＤＲＡＭと比較して大きいため、回路規模の増加を招く。したがって、前述した従来技術によれば、ＳＤＲＡＭに加えてＳＲＡＭを用いる必要があるため、蓄積するパケット数の増大を目的として、データ用メモリ５２の容量を増大させた場合、これに伴ってＳＲＡＭからなるジョブ用メモリ５３の容量も増大し、結果として回路規模が余分に増加するという課題があった。
【００１４】
本発明はこのような課題を解決するためのものであり、蓄積するパケット数を増大させた場合でも、パケットを蓄積するデータ用メモリの増大に伴う余分な回路規模の増加を抑制できるパケットバッファ制御技術を提供することを目的としている。
【課題を解決するための手段】
【００１５】
このような目的を達成するために、本発明にかかるパケットバッファ装置は、固定長の記憶領域からなるブロックを複数有し、これらブロックごとにデータの書き込みおよび読み出しを行うメモリ部と、少なくとも前記ブロック分のデータを保持する書込ブロックバッファと、少なくとも前記ブロック分のデータを保持する読出ブロックバッファと、入力された可変長のパケットのパケットデータを、前記書込ブロックバッファへ順次格納するとともに、当該書込ブロックバッファへ格納した各パケットデータの終端位置を示すパケット境界情報を含むブロック管理情報を当該書込ブロックバッファへ格納し、当該書込ブロックバッファの空き容量がなくなった場合に、当該書込ブロックバッファに格納されているデータを前記メモリ部へ書き込んだ後、残りのパケットデータを当該書込ブロックバッファへ格納し、当該データに含まれる前記ブロック管理情報の前記パケット境界情報に基づいて、当該データに含まれる各パケットデータを読み出して出力するパケット制御部とを備えている。
【００１７】
また、本発明にかかるパケットバッファ装置の一構成例は、前記ブロックが、複数ビットの固定長からなるワードを単位として複数個に分割されてなり、前記パケット制御部が、前記書込ブロックバッファに前記ブロック管理情報を格納する際、前記書込ブロックバッファ内の先頭ワードから前記ブロック管理情報を格納し、前記書込ブロックバッファに前記パケットデータを格納する際、前記ブロック管理情報を格納した次のワードから順に格納用のワードを選択し、該選択したワードの先頭バイトから順に当該パケットデータの各バイトを格納するとともに、当該パケットデータの末尾バイトを格納したバイトの次のバイトから所定のパケット終端パタンを格納し、前記書込ブロックバッファに前記ブロック管理情報を格納する際、前記パケット境界情報に代えて、前記各ワードにおける前記パケットデータの末尾バイトの存在有無を示す境界判定ビット列を含む前記ブロック管理情報を格納するようにしたものである。
【００１８】
また、本発明にかかるパケットバッファ装置の一構成例は、前記パケット制御部が、前記メモリ部内の前記ブロックから前記パケットデータを読み出す際、最初に当該ブロックの先頭ワードから前記ブロック管理情報を取得して、このブロック管理情報の前記境界判定ビット列に基づき、当該ブロックにおけるパケットデータの末尾バイトの存在有無を判定し、当該末尾バイトが存在しない場合には、前記メモリ部に対して次のブロックの読出要求を行うようにしたものである。
【００１９】
また、本発明にかかるパケットバッファ装置の一構成例は、前記バッファ制御部が、前記メモリ部内の複数個の前記ブロックで構成された区画のうち、入力されたキュー入力指示情報で指定されたキューと対応する区画に対して、前記パケットデータを書き込むことにより、前記パケットデータを前記キュー入力指示情報で指定されたキューに蓄積し、前記区画のうち、入力されたキュー出力指示情報で指定されたキューと対応する区画から、前記パケットデータの読み出すことにより、前記パケットデータを前記キュー入力指示情報で指定されたキューから取り出し、前記区画への前記パケットデータの書き込みが満了した場合、当該区画に対して空き区画を連結区画として連結した後、当該空き区画に対する前記パケットデータの書き込みを継続し、前記区画からの前記パケットデータの読み出しが満了した場合、当該区画を空き区画として解放するとともに、当該区画に連結されている連結区画からの前記パケットデータの読み出しを継続するようにしたものである。
【００２０】
また、本発明にかかるパケットバッファ制御方法は、入力されたパケットをメモリ部に格納するとともに、出力指示に応じて該メモリ部からパケットを取り出して出力するパケットバッファ装置で用いられるパケットバッファ制御方法であって、前記パケットバッファ装置が、固定長の記憶領域からなるブロックを複数有し、これらブロックごとにデータの書き込みおよび読み出しを行うメモリ部と、少なくとも前記ブロック分のデータを保持する書込ブロックバッファと、少なくとも前記ブロック分のデータを保持する読出ブロックバッファと、パケット制御部とを備え、前記パケット制御部が、入力された可変長のパケットのパケットデータを、前記書込ブロックバッファへ順次格納するとともに、当該書込ブロックバッファへ格納した各パケットデータの終端位置を示すパケット境界情報を含むブロック管理情報を当該書込ブロックバッファへ格納し、当該書込ブロックバッファの空き容量がなくなった場合に、当該書込ブロックバッファに格納されているデータを前記メモリ部へ書き込んだ後、残りのパケットデータを当該書込ブロックバッファへ格納するステップと、入力された出力指示に応じて、前記メモリ部から前記データを読み出して前記読出ブロックバッファへ格納し、当該データに含まれる前記ブロック管理情報の前記パケット境界情報に基づいて、当該データに含まれる各パケットデータを読み出して出力するステップとを実行するようにしたものである。
【発明の効果】
【００２１】
本発明によれば、入力パケット毎に生成されるパケット境界情報含む固定長のブロック管理情報が、パケットデータと連結して、メモリ部のキューに格納される。このため、従来のように、キューとは別個に、固定長のパケットジョブ（ジョブ情報）を蓄積するための、ＳＲＡＭからなるジョブ用メモリを、設ける必要はない。したがって、蓄積するパケット数を増大させた場合でも、パケットを蓄積するデータ用メモリの増大に伴う余分な回路規模の増加を抑制することができる。
【図面の簡単な説明】
【００２２】
【図１】第１の実施の形態にかかるパケットバッファ装置の構成を示すブロック図である。
【図２】第１の実施の形態にかかるメモリ部におけるパケットデータ蓄積状態を示す説明図である。
【図３】第１の実施の形態にかかる書込動作を示す状態遷移図である。
【図４】第１の実施の形態にかかる読出動作を示す状態遷移図である。
【図５】第２の実施の形態にかかるメモリ部の構成例である。
【図６】第３の実施の形態にかかるパケットバッファ装置の構成を示すブロック図である。
【図７】メモリ部（ブロック分割）の構成例である。
【図８】第３の実施の形態にかかるメモリ部におけるパケットデータ蓄積状態を示す説明図である。
【図９】第３の実施の形態にかかる書込動作を示す状態遷移図である。
【図１０】第３の実施の形態にかかるブロック書込動作を示す状態遷移図である。
【図１１】第３の実施の形態にかかる読出動作を示す状態遷移図である。
【図１２】第３の実施の形態にかかるブロック読出動作を示す状態遷移図である。
【図１３】区画連結動作を示す状態遷移図である。
【図１４】区画解放動作を示す状態遷移図である。
【図１５】従来のパケットバッファ装置の構成を示すブロックである。
【図１６】従来のパケットバッファ装置の動作を示す説明図である。
【発明を実施するための形態】
【００２３】
次に、本発明の実施の形態について図面を参照して説明する。
［第１の実施の形態］
まず、図１を参照して、本発明の第１の実施の形態にかかるパケットバッファ装置１０について説明する。図１は、第１の実施の形態にかかるパケットバッファ装置の構成を示すブロック図である。
【００２４】
このパケットバッファ装置１０は、パケットを送受信するパケット通信装置で用いられて、入力されたパケットをキュー（ＦＩＦＯメモリ）に格納するとともに、出力指示に応じてキューからパケットを取り出して出力する機能を有している。
このパケットバッファ装置１０には、主な機能部として、バッファ制御部１１、メモリ部１２、書込バッファ部１３、および読出バッファ部１４が設けられている。
【００２５】
バッファ制御部１１は、入力されたパケットのパケットデータをメモリ部１２に書き込むことで、メモリ部１２にパケットを蓄積する機能と、蓄積されたパケットを取り出すタイミングを指定する出力指示情報に基づいて、メモリ部１２からパケットデータを読み出して出力する機能とを有している。なお、バッファ制御部１１に、外部装置（図示せず）から入力される出力指示情報を、前記外部装置が生成するための情報として、蓄積状態を表す蓄積状態情報を前記外部装置に対して出力する機能を設けてもよい。
【００２６】
メモリ部１２は、バッファ制御部１１から、パケットデータとこのパケットデータを書き込むアドレスを受け取って、前記アドレスに対応するメモリセルに前記パケットデータを書き込む機能と、バッファ制御部１１から、パケットデータを読み出すアドレスを受け取って、前記アドレスに対応するメモリセルが保持するパケットデータをバッファ制御部１１に出力する機能とを有している。
【００２７】
書込バッファ部１３は、少なくとも１ブロック分のデータ、すなわちブロックデータを保持する書込ブロックバッファ１３Ａを有し、バッファ制御部１１から、パケットデータとブロック管理情報を受け取って、書込ブロックバッファ１３Ａに前記パケットデータを格納する機能と、バッファ制御部１１からの出力指示に応じて、書込ブロックバッファ１３Ａに保持していたブロックデータをバッファ制御部１１に出力する機能とを有している。
【００２８】
読出バッファ部１４は、少なくとも１ブロック分のブロックデータを保持する読出ブロックバッファ１４Ａを有し、バッファ制御部１１からブロックデータを受け取って、読出ブロックバッファ１４Ａに格納する機能と、バッファ制御部１１からの出力指示に応じて、読出ブロックバッファ１４Ａで保持していたブロックデータをバッファ制御部１１に出力する機能とを有している。
【００２９】
図２は、第１の実施の形態にかかるメモリ部におけるパケットデータ蓄積状態を示す説明図である。
メモリ部１２は、バッファ制御部１１からの制御に基づき、固定長であるＫバイトのブロック単位でパケットをシーケンシャルで書き込み／読み出しする。本例では、アドレスが連続するメモリ領域を、Ｋバイトずつに区切って各々をブロックとし、パケットの入力順に、アドレスが小さい方のブロックから格納されている。
【００３０】
Ｋは１ブロックのバイト数であり、Ｋの値を、ブロックを記憶するメモリの１バーストでアクセスできるデータ量の整数倍とすることで、効率的なブロックの書き込み／読み出しが可能となる。１バーストあたりのデータ量は、一般的に２のべき乗の値をとるが、その値はメモリのデータ幅やバースト長に依存する。Ｋが大きくなると、１ブロック分のデータを保持するためのメモリ量が増大するため、書込バッファ部１３と読出バッファ部１４の回路規模が増大するという問題が生じる。
【００３１】
また、Ｋが最小パケット長よりも小さいと、パケット境界が含まれないブロックの割合が増大し、ブロック管理情報のために使用されるメモリが無駄になるという問題が生じる。
また、メモリが複数のバンクに分かれている場合は、マルチ・バンク・オペレーションによって、メモリの帯域利用効率を向上させることができるので、Ｋを、バーストあたりのデータ量×バンク数の整数倍とすると、１ブロックのアクセスを予め決めておいたメモリへのコマンド発行手順によって行うことで、簡単な回路でマルチ・バンク・オペレーションを実現することができる。Ｋの値の例は、１２８，２５６，５１２，１０２４である。
【００３２】
ブロックの境界は、パケットの境界とは無関係に定められているため、１個のブロックに１個のパケットのパケットデータが完全に収容される場合と、複数のブロックにまたがって収容される場合がある。
各ブロックには、パケットデータの他に、固定長（Ｈバイト）のブロック管理情報が含まれ、ブロック管理情報のブロック内での位置が定められている。本例では、ブロックの先頭側すなわちアドレス最小側に寄せて配置される。
【００３３】
また、本例では、ブロック管理情報は、パケット境界情報の他に、そのブロックのパケットデータ領域を使い切っているか否かを示す、パケットデータ継続フラグを持つ。前記パケットデータ継続フラグが「１」の場合は、パケットデータ領域を使い切っている場合であり、パケットデータ領域の最後まで有効なパケットデータが格納されていることを示す。
一方、前記パケットデータ継続フラグが「０」の場合は、前記領域内に含まれるパケットデータの末尾（１個のブロックに複数のパケットが収容されている場合は最後のパケットのデータ末尾）より後ろに、有効なパケットデータが格納されていないことを示す。
【００３４】
Ｈはブロック管理情報のバイト数である。ブロック内に入り得るパケット数分のパケット境界位置を示すパケット終端位置を含む必要がある。パケット終端位置をブロック先頭からのバイト数として表す場合は、１個のパケット終端位置は、ブロックのバイト数未満の値を表現するため、ｌｏｇ２（Ｋ−１）以上のビット数となる。また、ブロック内のデータをバイト単位ではなくワード単位で扱う場合には、ブロック管理情報を１ワードまたは予め決められた個数のワードに収めるよう規定することで、ワード単位での扱いに整合する。
【００３５】
さらに、ブロック管理情報がパケットデータ継続フラグを含む場合には、ブロック管理情報に加えて前記フラグ用に少なくとも１ビットを必要となる。最小パケット長が６４Ｂｙｔｅのとき、Ｈの値の例は、２，４，８，１６、であり、各々、Ｋ＝１２８，２５６，５１２，１０２４に対応する。
ただし、Ｋ＝５１２，１０２４の場合、パケット終端位置はブロック先頭からのバイト数ではなく、ブロック先頭からのワード数を表すと仮定している。前記により、パケット終端位置は、ブロック内のデータのバイト数を２進数として表現可能なビット数よりも少ないビット数で表現できるためである。例えば、Ｋ＝５１２のとき、ブロック先頭からのバイト数としてパケット終端位置を規定すると８ｂｉｔ長となるが、ブロック先頭からの４Ｂｙｔｅ長のワード数パケット終端位置を規定すると６ｂｉｔ長で済む。
【００３６】
パケット境界情報は、Ｍ個のパケット終端位置からなる。各パケット終端位置は、ブロックに含まれるパケットデータ末尾バイトのブロック内での位置、すなわち、パケットデータ領域の先頭バイトから前記パケットデータ末尾バイトまでのバイト数で表される。この際、パケット終端位置が「１」となる場合は、パケットデータ領域の先頭バイトがパケットデータ末尾バイトである場合である。なお、パケット終端位置が「０」の値である場合は、前記パケット終端位置が無効であることを意味し、１個のブロックに含まれるパケットデータ末尾バイトの数がＭ個より少ない場合に生じる。
【００３７】
Ｍはブロック内に入り得るパケット数の最大値である。したがって、Ｍ≧Ｋ／最小パケット長となる。最小パケット長が６４Ｂｙｔｅのとき、Ｍの値の例は、Ｍ＝２，４，８，１６、であり、各々、Ｋ＝１２８，２５６，５１２，１０２４に対応する。ただし、パケット境界位置情報はブロック先頭からのバイト数ではなくブロック先頭からのワード数を表すと仮定している。
【００３８】
［第１の実施の形態の書込動作］
次に、図３を参照して、本実施の形態にかかるパケットバッファ装置１０の書込動作について説明する。図３は、第１の実施の形態にかかる書込動作を示す状態遷移図である。
【００３９】
この書込動作において、次のような制御変数が用いられる。
パケット終端位置は、各パケットデータの末尾バイトの位置を示す変数であり、１個のブロックデータ内のパケットデータ領域の先頭バイトからのバイト数で表現される。
変数ｉは、１個のブロックデータ内に含まれるパケット末尾バイトの個数を計数するためのカウンタである。
変数Ｍは、１個のブロックデータ内に含みうるパケット数の最大値である。
格納位置は、パケットデータを１バイトずつ書込ブロックバッファ１３Ａ内のパケットデータ領域に格納するときの位置を指定する変数（バイトアドレス）である。
パケットデータ継続フラグは、パケットデータ領域を使い切っているか否かを示す変数である。
【００４０】
［初期化状態］
パケットバッファ装置１０は、電源投入後、パケットの入力を開始する前に、初期化状態（ステップ１００）に遷移して、初期化処理を実行する。また、パケットバッファ装置１０に正常な動作を維持することができない異常の発生をパケットバッファ装置１０自身が検出した場合や、外部からのリセット要求があった場合にも、初期化が行われる。
【００４１】
初期化状態（ステップ１００）において、バッファ制御部１１は、書込ブロックバッファ１３Ａを初期化する。この初期化処理において、バッファ制御部１１は、Ｍ個のパケット終端位置の値を「０」に初期化するとともに、変数ｉの値を「０」に初期化する。また、バッファ制御部１１は、書込バッファ部１３の格納位置を初期化する。これにより、格納位置は、パケットデータ領域の先頭位置にセットされる。
【００４２】
バッファ制御部１１は、初期化状態（ステップ１００）において、初期化が完了した時点で、パケットの入力を待つ、入力待ち状態（ステップ１０１）に遷移する。
【００４３】
［入力待ち状態］
入力待ち状態（ステップ１０１）において、パケットの入力があった時点、すなわち「入力あり」の場合、バッファ制御部１１は、前記パケットのパケットデータを書込ブロックバッファ１３Ａに格納する、データ格納状態（ステップ１０２）に遷移する。
【００４４】
また、入力待ち状態（ステップ１０１）において、パケットの入力がなく、メモリ部１２に蓄積されたブロックがあるか、または、書込バッファ部１３に保持されているパケットデータがない場合、すなわち「入力なし and（メモリ蓄積あり or データ保持なし）」の場合、バッファ制御部１１は、他の状態に遷移せずに、パケットの入力を待ち受ける入力待ち状態（ステップ１０１）に留まる。
【００４５】
書込バッファ部１３は、１ブロック分のパケットデータが揃うまで、書込ブロックバッファ１３Ａ内で前記パケットデータを保持する。例えば、初期状態（空の状態）の書込ブロックバッファ１３Ａに、３．５ブロック分の長さのパケットデータを持つ１個のパケットが入力された場合、このパケットデータは、先頭から３個のブロックに順に分割されて、メモリ部１２に書き込まれるが、ブロック１個分に満たない残り０．５ブロック分のパケットデータについては、書込ブロックバッファ１３Ａ内で、次のパケットが入力されることによって、ブロック１個分のデータが揃うのを待つことになる。
【００４６】
このような場合に、メモリ部１２から前記パケットデータを読み出すとき、メモリ部１２に蓄積された３個のブロックのデータについては読み出しが行われるが、書込ブロックバッファ１３Ａ内に残ったパケットデータについてはメモリ部１２に蓄積されていないので、このままでは、メモリ部１２から読み出した３個のブロックデータからパケットを再生することができない。
そこで、このような状況では、ブロック書き込み２状態（ステップ１０４）に遷移することによって、書込ブロックバッファ１３Ａ内に残された残りのデータを、１ブロック分のブロックデータが揃っていなくともメモリ部１２に書き込むことにより、メモリ部１２から１個のパケットデータを全て読み出せるようにしている。
【００４７】
すなわち、入力待ち状態（ステップ１０１）において、パケットの入力がなく、メモリ部１２に蓄積されたブロックがなく、かつ、書込バッファ部１３に保持されているデータがある場合、すなわち「入力なし and（メモリ蓄積なし and データ保持あり）」の場合、バッファ制御部１１は、１ブロック分のパケットデータが揃うのを待たずに、未満了状態のブロックをメモリ部１２に書き込むため、ブロック書き込み２状態（ステップ１０４）に遷移する。この遷移は、入力がなくメモリ部１２に蓄積されたパケットデータを出し尽くし、書込ブロックバッファ１３Ａに残った最後のデータが出力されない状況を回避するためのものである。
【００４８】
［データ格納状態］
データ格納状態（ステップ１０２）において、バッファ制御部１１は、書込ブロックバッファ１３Ａのうち、格納位置が示すパケットデータ領域内の位置に、入力されたパケットデータを１バイトずつ格納し、併せて、前記格納位置を１バイトずつ後ろに移動させる。
【００４９】
また、データ格納状態（ステップ１０２）において、パケットデータが後続し、かつ、書込ブロックバッファ１３Ａのパケットデータ領域に空きがある場合、すなわち「パケット継続 and ブロック未満了」の場合、バッファ制御部１１は、データ格納状態（ステップ１０２）に留まって、前記パケットデータの格納を継続する。
【００５０】
一方、データ格納状態（ステップ１０２）において、パケットデータが後続し、かつ、書込ブロックバッファ１３Ａのパケットデータ領域に空きがなくなった場合、すなわち「パケット継続 and ブロック満了」の場合、バッファ制御部１１は、書込ブロックバッファ１３Ａに保持されたブロックデータをメモリ部１２に書き込む、ブロック書き込み１状態（ステップ１０３）に遷移する。
【００５１】
また、データ格納状態（ステップ１０２）において、パケットデータをその末尾バイトまで書込ブロックバッファ１３Ａへ入力し終えた場合、すなわち「パケット終了」時、バッファ制御部１１は、書込ブロックバッファ１３Ａにパケット終端位置を格納する、パケット終端位置更新状態（ステップ１０５）に遷移する。
【００５２】
［データ終端位置更新状態］
データ終端位置更新状態（ステップ１０５）において、バッファ制御部１１は、変数ｉの値に「１」を加算する。
さらに、バッファ制御部１１は、直前のデータ格納状態（ステップ１０２）において、パケットデータの末尾バイトを書込ブロックバッファ１３Ａに格納した際、その格納位置に相当するバイト数、すなわち、前記書込ブロックバッファ１３Ａのパケットデータ領域先頭から前記末尾バイトまでのバイト数を、ブロック管理情報に含まれるパケット終端位置＃ｉとして、書込ブロックバッファ１３Ａに格納する。
【００５３】
データ終端位置更新状態（ステップ１０５）において、書込ブロックバッファ１３Ａのパケットデータ領域に空きがある場合、すなわち「ブロック未満了」時、バッファ制御部１１は、入力待ち状態（ステップ１０１）に遷移する。
また、データ終端位置更新状態（ステップ１０５）において、書込ブロックバッファ１３Ａのパケットデータ領域に空きがなくなった場合、すなわち「ブロック満了」時、バッファ制御部１１は、書込ブロックバッファ１３Ａに保持されたブロックをメモリ部１２に書き込む、ブロック書き込み２状態（ステップ１０４）に遷移する。
【００５４】
［ブロック書き込み１状態］
ブロック書き込み１状態（ステップ１０３）において、バッファ制御部１１は、書込ブロックバッファ１３Ａ内にブロック管理情報として保持されているパケットデータ継続フラグの値を「１」とし、書込ブロックバッファ１３Ａに保持されているブロックデータを、メモリ部１２内の所定のアドレスに書き込む。
【００５５】
さらに、バッファ制御部１１は、書込ブロックバッファ１３Ａを初期化する。この初期化では、Ｍ個のパケット終端位置の値を「０」に初期化するとともに、変数ｉを「０」に初期化する。また、書込バッファ部１３で保持する格納位置を初期化する。これにより、格納位置は、パケットデータ領域の先頭位置にセットされる。その後、バッファ制御部１１は、データ格納状態（ステップ１０２）に遷移する。
【００５６】
［ブロック書き込み２状態］
ブロック書き込み２状態（ステップ１０４）において、バッファ制御部１１は、書込ブロックバッファ１３Ａ内にブロック管理情報として保持されているパケットデータ継続フラグの値を「０」に初期化し、書込ブロックバッファ１３Ａに保持されたブロックデータを、メモリ部１２内の所定のアドレスに書き込む。
【００５７】
さらに、バッファ制御部１１は、書込ブロックバッファ１３Ａを初期化する。この初期化では、Ｍ個のパケット終端位置の値を「０」に初期化するとともに、変数ｉを「０」に初期化する。また、書込バッファ部１３の格納位置を「０」に初期化する。これにより、格納位置がパケットデータ領域の先頭位置にセットされる。その後、バッファ制御部１１は、入力待ち状態（ステップ１０１）に遷移する。
【００５８】
なお、以上で説明した書込動作において、ブロック書き込み１状態（ステップ１０３）またはブロック書き込み２状態（ステップ１０４）では、メモリ部１２に保持していたブロックデータを書き込む処理を行うが、メモリ部１２でのブロックの蓄積がなく、かつ、読出バッファ部１４にブロックの保持がない場合は、前記のようにメモリ部１２に書き込むのではなく、読出バッファ部１４に格納する処理を行ってもよい。これにより、入力されたパケットが蓄積されず出力される状況において、メモリ部１２への蓄積を省くことができるため、メモリ部１２での消費電力の削減が可能となる。
【００５９】
［第１の実施の形態の読出動作］
次に、図４を参照して、本実施の形態にかかるパケットバッファ装置１０の読出動作について説明する。図４は、第１の実施の形態にかかる読出動作を示す状態遷移図である。
【００６０】
この読出動作において、次のような制御変数が用いられる
データ保持有無は、読出ブロックバッファ１４Ａでのデータ保持あり／なしを示す変数である。
変数ｉは、１個のブロックデータ内に含まれるパケット末尾バイトの個数を計数するためのカウンタである。
変数Ｍは、１個のブロックデータ内に含みうるパケット数の最大値である。
パケット終端位置は、各パケットデータの末尾バイトの位置を示す変数であり、１個のブロックデータ内のパケットデータ領域の先頭バイトからのバイト数で表現される。
【００６１】
格納位置は、パケットデータを１バイトずつ読出ブロックバッファ１４Ａ内のパケットデータ領域に格納するときの位置を指定する変数（バイトアドレス）である。
取得位置は、パケットデータを１バイトずつ読出ブロックバッファ１４Ａ内のパケットデータ領域から取得するときの位置を指定する変数（バイトアドレス）である。
パケットデータ継続フラグは、パケットデータパケットデータ領域を使い切っているか否かを示す変数である。
【００６２】
［初期化状態］
パケットバッファ装置１０は、電源投入後、パケットの出力を開始する前に、初期化状態（ステップ１１０）に遷移して、初期化処理を実行する。また、パケットバッファ装置１０に正常な動作を維持することができない異常の発生をパケットバッファ装置１０自身が検出した場合や、外部からのリセット要求があった場合にも、初期化が行われる。
【００６３】
初期化状態（ステップ１１０）において、バッファ制御部１１は、読出ブロックバッファ１４Ａを初期化する。この初期化処理において、バッファ制御部１１は、データ保持有無の値をデータ保持なしに初期化する。
【００６４】
また、この初期化において、バッファ制御部１１は、Ｍ個のパケット終端位置の値を「０」に初期化するとともに、変数ｉの値を「０」に初期化する。また、バッファ制御部１１は、読出バッファ部１４の格納位置を初期化する。これにより、格納位置は、パケットデータ領域の先頭位置にセットされる。
バッファ制御部１１は、初期化状態（ステップ１１０）において、初期化が完了した時点で、出力指示情報の入力を待つ、入力待ち状態（ステップ１１１）に遷移する。
【００６５】
［入力待ち状態］
入力待ち状態（ステップ１１１）において、バッファ制御部１１は、出力指示情報の入力があるまで、他の状態に遷移せずに、出力指示情報の入力を待ち受ける入力待ち状態（ステップ１１１）に留まる。
また、入力待ち状態（ステップ１１１）において、出力指示情報の入力があった時点で、前記データ保持有無がデータ保持ありを示す場合、すなわち「入力あり and データ保持あり」の場合、バッファ制御部１１は、データ取得状態（ステップ１１２）に遷移する。
【００６６】
一方、入力待ち状態（ステップ１１１）において、出力指示情報の入力があった時点で、前記データ保持有無がデータ保持なしを示す場合、すなわち「入力あり and データ保持なし」の場合、バッファ制御部１１は、ブロック読み出し状態（ステップ１１３）に遷移する。
【００６７】
［データ取得状態］
データ取得状態（ステップ１１２）において、バッファ制御部１１は、読出ブロックバッファ１４Ａから、取得位置が示す位置から、パケットデータを１バイトずつ取得して出力し、併せて、前記取得位置を１バイトずつ後ろに移動させる。なお、パケットデータが１バイト単位で出力するのではなく、予め定められたバイト数単位で出力する場合には、前記バイト数単位で格納と格納位置の移動を行う。
【００６８】
また、データ取得状態（ステップ１１２）において、バッファ制御部１１は、パケット継続／終了と、残データあり／なし、すなわち読出ブロックバッファ１４Ａ内に取得前のパケットデータがあるか／ないかとを判定する。
この際、前記パケット終了は、読出ブロックバッファ１４Ａに格納されたパケット終端位置＃ｉが示す位置に前記取得位置が達したこと、すなわち、取得中のパケットデータの末尾バイトまで取得を終えたことを条件として判定する。なお、変数ｉは、読出ブロックバッファ１４Ａに含まれるＭ個のパケット終端位置のうち、取得対象のパケットに対するパケット終端位置を特定する変数としても用いられる。
【００６９】
また、パケット継続は、前記パケット終了の条件を満たさないことを条件として判定する。この際、パケット終端位置＃ｉの値が「０」の場合あるいはｉ＞Ｍの場合は、取得中のパケットの末尾バイトを読出ブロックバッファ１４Ａに含まれず後続ブロックに含まれることを意味するため、前記判定はパケット継続となる。
一方、前記残データありは、前記取得位置がパケットデータ領域の最終バイト位置に達していないことであり、残データなしの条件は、前記残データありの条件を満たさないことを条件として判定する。
【００７０】
また、データ取得状態（ステップ１１２）において、パケットデータの末尾バイトまでデータを取得し終えた場合、すなわち「パケット終了」時、バッファ制御部１１は、前記データ保持有無の値を、以下に示す判定に基づいて更新し、その後、入力待ち状態（ステップ１１１）に遷移する。
【００７１】
バッファ制御部１１は、上記判定において、まず、前記取得位置がパケットデータ領域の最終バイト位置に達した場合、データ保持有無の値を保持なしと設定する。
一方、前記取得位置がパケットデータ領域の最終バイト位置に達していない場合は、バッファ制御部１１は、変数ｉの値に「１」を加算する。
【００７２】
この際、変数ｉの更新後に、読出ブロックバッファ１４Ａに格納されたパケット終端位置＃ｉの値が「０」の場合あるいはｉ＞Ｍであり、かつ、パケットデータ継続フラグの値が「１」の場合、すなわち、「（ｉ＞Ｍ）or パケット終端位置[ｉ]==０）and パケットデータ継続フラグ==１」の場合、バッファ制御部１１は、データ保持有無の値を保持ありと設定する。
【００７３】
一方、前記パケット終端位置＃ｉの値が「０」の場合あるいはｉ＞Ｍであり、かつ、パケットデータ継続フラグの値が「０」の場合、すなわち、「（ｉ＞Ｍ）or パケット終端位置[ｉ]==０）and パケットデータ継続フラグ==０」の場合、バッファ制御部１１は、データ保持有無の値を保持なしと設定する。
また、前記以外、すなわち、前記パケット終端位置＃ｉの値が「０」以外、かつ、ｉ≦Ｍの場合、バッファ制御部１１は、データ保持有無の値を保持ありと設定する。
【００７４】
また、データ取得状態（ステップ１１２）において、パケット継続であり、かつ、残データなしの場合、すなわち「パケット継続 and 残データなし」時、バッファ制御部１１は、メモリ部１２が蓄積するブロックを読み出し、読出ブロックバッファ１４Ａに格納する、ブロック読み出し状態（ステップ１１３）に遷移する。
【００７５】
一方、データ取得状態（ステップ１１２）において、パケット継続であり、かつ、残データありの場合、すなわち「パケット継続 and 残データあり」時、バッファ制御部１１は、データ取得状態（ステップ１１２）に留まって、読出ブロックバッファ１４Ａからパケットデータを取得して出力する。
【００７６】
［ブロック読み出し状態］
ブロック読み出し状態（ステップ１１３）において、バッファ制御部１１は、メモリ部１２の所定アドレスから１個のブロックデータを読み出して、読出ブロックバッファ１４Ａに前記ブロックデータを格納する。また、バッファ制御部１１は、前記取得位置の値を、読出ブロックバッファ１４Ａ内のパケットデータ領域の先頭位置を示す値に初期化するとともに、前記データ保持有無の値を保持ありに初期化し、さらに、変数ｉの値を「１」に初期化する。
【００７７】
［第１の実施の形態の効果］
このように、本実施の形態にかかるパケットバッファ装置１０は、固定長の記憶領域であるブロックを単位としてデータの書き込みおよび読み出しを行うメモリ部１２と、少なくとも前記ブロック分のデータを保持する書込ブロックバッファ１３Ａと、少なくとも前記ブロック分のデータを保持する読出ブロックバッファ１４Ａとを備え、パケット制御部１１において、入力された可変長のパケットのパケットデータを、前記書込ブロックバッファ１３Ａへ順次格納するとともに、当該書込ブロックバッファ１３Ａ内における当該パケットデータの終端位置を示すパケット境界情報を当該書込ブロックバッファ１３Ａへ格納し、当該書込ブロックバッファ１３Ａ内に所定量のデータが格納された時点で、当該データをメモリ部１２へ書き込み、入力された出力指示に応じて、メモリ部１２から前記データを読み出して前記読出ブロックバッファ１４Ａへ格納し、当該データに含まれる前記パケット境界情報に基づいて、当該データに含まれる各パケットデータを読み出して出力するようにしたものである。
【００７８】
これにより、入力パケット毎に生成されるパケット境界情報含む固定長のブロック管理情報が、パケットデータと連結して、メモリ部１２のキューに格納される。このため、本実施の形態にかかるパケットバッファ装置１０によれば、従来のような固定長のパケットジョブ（ジョブ情報）を蓄積するため、ＳＲＡＭからなるジョブ用メモリを、キューとは別個に設ける必要はない。したがって、蓄積するパケット数を増大させた場合でも、パケットを蓄積するデータ用メモリの増大に伴う余分な回路規模の増加を抑制することができる。
【００７９】
また、本実施の形態によれば、ブロック単位でメモリ部１２にアクセスするため、ブロック長を、メモリをバーストアクセスするときの１度のアクセスで書き込み／読み出しするデータ量の、整数倍とすることにより、メモリを効率よくアクセスすることができる。
これにより、メモリのデータバス幅やクロック周波数を低減することができるため、回路規模および消費電力を削減することができる。
【００８０】
また、本実施の形態によれば、ブロック管理情報はブロック内の予め定められた位置に配置され、前記ブロックは固定長であるため、ブロック管理情報とパケットデータを、それらが格納されているメモリのアドレス値によって、確実に識別することができる。
したがって、メモリにソフトエラー等が発生し、前記エラーが発生したブロックに格納されているパケットデータを正常に読み出すことができなくなったとしても、続く正常なブロックとブロック管理情報を読み出すことができるため、後続のパケットについては、正常にそのパケットデータを読み出すことができる。これにより、ブロック管理情報にエラーがないことを確認するためのパリティを付加やチェックは不要であり、前記パリティ演算や保持のための回路を削減することができる。また、エラーが発生した場合にも、メモリ部１２の初期化といった正常なパケットまでも廃棄される深刻な影響をもたらすエラー回復処理を必要としない。
【００８１】
また、パケット境界情報は、ブロック内でのパケット境界の位置を示す情報であるため、メモリ全体でのパケット境界の位置を示す情報よりも、少ないビット数で済む。これにより、パケット境界情報によってメモリが占有される割合を低減することができるため、前記メモリに、多くのパケットデータを蓄積することが可能となる。
【００８２】
以下、本実施の形態と従来技術とを対比することにより、本実施の形態にかかる効果について説明する。
本実施の形態にかかるパケットバッファ装置１０は、前述したように、ジョブ用メモリを必要としないため、蓄積されるパケット数の増大に伴う回路規模の増大を抑制することができる。
【００８３】
従来のパケットバッファ装置では、パケットデータのみをデータ用メモリに蓄積していたのに対して、本発明のパケットバッファ装置１０では、パケットデータに加えてブロック管理情報を蓄積するため、蓄積量は増大するが、ＳＤＲＡＭといった大容量のメモリを用いることで、前記蓄積量の増大によって生じる回路規模の増大を抑制可能である。
本発明は、ブロックとしてパケットデータをメモリ（ＳＤＲＡＭ）に記憶するが、前記ブロックのブロック管理情報を記憶したメモリ領域に連接するメモリ領域に前記ブロックのデータを記憶する。
【００８４】
ブロック管理情報とブロックのデータの少なくとも一部を、１つのバースト読み出しコマンドをメモリに対して発行することで、メモリから効率的に読み出すことができる。
一方、ブロック管理情報とブロックのデータを、メモリの異なる領域に分離して記憶した場合は、ブロックを読み出すとき、管理情報を読み出すための読み出しコマンドと、データを読み出すための読み出しコマンドの、少なくとも２回のコマンドをメモリに対して発行する必要がある。
【００８５】
このとき、コマンドを発行してから、次のコマンドを発行できるようになるまでの時間を待つ必要がある。この待ち時間によって、メモリの帯域利用効率が下がる。
また、ブロック単位でメモリにアクセスするため、ブロック長を、メモリをバーストアクセスするときの１度のアクセスで書き込み／読み出しするデータ量の、整数倍とすることにより、メモリを効率よくアクセスすることができる。
これにより、メモリのデータバス幅やクロック周波数を低減することができるため、回路規模と消費電力を削減することができる。
【００８６】
また、ブロック管理情報はブロック内の予め定められた位置に配置され、前記ブロックは固定長であるため、ブロック管理情報とパケットデータを、それらが格納されているメモリのアドレス値によって、確実に識別することができる。
したがって、メモリにソフトエラー等が発生し、前記エラーが発生したブロックに格納されているパケットデータを正常に読み出すことができなくなったとしても、続く正常なブロックとブロック管理情報を読み出すことができるため、後続のパケットについては、正常にそのパケットデータを読み出すことができる。
【００８７】
これにより、ブロック管理情報にエラーがないことを確認するためのパリティを付加やチェックは不要であり、前記パリティ演算や保持のための回路を削減することができる。また、エラーが発生した場合にも、メモリ部１２の初期化といった正常なパケットまでも廃棄される深刻な影響をもたらすエラー回復処理を必要としない。
【００８８】
本発明では、メモリにソフトエラー等が発生し、誤りがある管理情報を含むブロックを読み取った場合にも、後続のブロックを読み取ることが可能であり、パケット境界を含んだ後続ブロックを読み取ることで、前記エラーを生じたパケット境界より後にバッファに蓄積されたパケットを、メモリから読み取ることが可能となる。これは、ブロックが固定長（全てのブロックは同一長）であり、メモリはブロックを単位としたＦＩＦＯバッファとして管理され、ブロック管理情報はブロック内の予め定められた位置に配置されていることによって、ブロック管理情報の値とは関係なく、ブロック管理情報やブロックのメモリ上の位置が定められているため、ブロック管理情報の値の誤りが、その後のブロックやブロック管理情報の読み取り位置に誤りを与えないためである。
【００８９】
一方、ブロックを可変長とし、前記ブロックは、パケット長などのパケット境界位置情報を含むブロック管理情報と１個のパケットの全データを含むとした場合は、メモリから読み取ったパケット長に誤りがあると、次のブロックが格納されているメモリ上の位置を誤ることになり、前記読み取り位置が誤ったブロックのパケット長にも誤りが発生し、その次のブロックの読み取りも誤る、といったように、誤りの連鎖が発生し、誤りが発生したパケットより後にバッファに蓄積されたパケット全てに誤りを生じることになる。
【００９０】
なお、ジョブ用メモリを別に設け、パケットジョブとしてパケットの格納位置を前記ジョブ用メモリに記憶する場合は、本発明と同様、上記の問題は発生しないが、ジョブ用メモリからパケットジョブを読み出した後にデータ用メモリからパケットデータを読み出すという手順が必要であり、ジョブ用メモリとデータ用メモリの両方をＳＤＲＡＭ上に配置する場合は、パケットジョブの読み出しまでの待ち時間によって、メモリの帯域利用効率が下がる。ジョブ用メモリの読み出しを高速に行うことができるＳＲＡＭ上に配置した場合、ＳＲＡＭのビット当たりの面積がデータ用メモリに利用されるＳＤＲＡＭのビット当たりの面積と比べると大きいため、本発明よりも回路面積が増大する。
【００９１】
また、パケット境界情報は、ブロック内でのパケット境界の位置を示す情報であるため、メモリ全体でのパケット境界の位置を示す情報よりも、少ないビット数で済む。これにより、パケット境界情報によってメモリが占有される割合を低減することができるため、前記メモリに、多くのパケットデータを蓄積することが可能となる。
【００９２】
本発明は、ブロックを蓄積単位とするＦＩＦＯバッファにより、バッファを構成する。例えば、ブロックａを読み出したとき、次に読み出すブロックｂの格納位置は、ブロックａの格納位置から１ブロック分移動した位置であるので、各ブロックの格納位置を記憶しておく必要はなく、１個前に読み出されたブロックの格納位置に基づいて計算できる。前記を実現するための構成として、例えば、メモリ上の各ブロックの配置において、各ブロックの領域が隣接するように配列されたリングバッファがある。前記構成では、前記リングバッファの書き込みブロック位置と読み出しブロック位置を示す２個のポインタにより、次に書き込むべきブロックのメモリ上の位置や、次に読み出すべきブロックの位置を知ることができる。したがって、各ブロックについてメモリ上での位置を記憶するテーブル等は不要である。
【００９３】
従来例において、ジョブ用メモリのメモリ量の具体例を示します。データ用メモリのメモリ量を８ＭＢ、フレームの最小長＝６４ｂｙｔｅ、とすると、データ用メモリには、最大８００００００／６４＝１２５０００個のフレームが蓄積できる。データ用メモリのデータ幅＝４ｂｙｔｅとすると、そのアドレス数は８００００００／４＝２００００００個になるので、前記アドレスを２進数表現するためのビット数は２１となる（ｌｏｇ２（２００００００）以上の整数）。
【００９４】
したがって、蓄積したパケット１個につき１個のパケットジョブをジョブ用メモリに格納しパケットジョブにパケットを格納したデータ用メモリのアドレスを格納する場合、各パケットジョブのビット数が２１ｂｉｔ、ジョブ用メモリへのパケットジョブの蓄積数は最大のフレーム蓄積数と同じく１２５０００個となり、ジョブ用メモリのメモリ量は、２１  ｂｉｔ×１２５０００＝２６２５０００ｂｉｔ＝３２８ｋＢｙｔｅとなる。
【００９５】
一方、本発明において、ブロック長＝２５６  Ｂｙｔｅ、ブロック管理情報＝４  Ｂｙｔｅとすると、８  ＭＢｙｔｅ分のデータを蓄積するためのブロック数は８  ＭＢｙｔｅ／（２５６Ｂｙｔｅ−４Ｂｙｔｅ）＝３１７４６個であり、パケットジョブに相当するブロック管理情報に必要となるメモリ量は、４ｂｙｔｅ×３１７４６個＝１２７ＫＢｙｔｅとなる。なお、ブロック内に入るパケット数は最大４個であるので、１個のブロック管理情報に、４個のパケットの境界位置を保持することができればよい。パケット境界位置をブロック先頭からのバイト数として表すと、各パケット境界情報のビット数は８ｂｉｔあれば足りるため、１個のブロック管理情報は４ｂｙｔｅ以上の長さがあればよい。
【００９６】
ジョブ用メモリのメモリ量３２８ｋＢｙｔｅをＳＲＡＭで実現したときのジョブ用メモリの面積は、製造プロセスにもよるが約ｍｍである。すなわち、ＤＲＡＭを回路の外部デバイスとして回路面積から除外する場合、本願によって、ジョブ用メモリ分の面積であるｍｍを、回路面積から削減できる。また、ＤＲＡＭの面積を合わせた場合の面積削減については、本願（ブロック長＝２５６  Ｂｙｔｅ、１ブロックの管理情報＝４Ｂｙｔｅの場合）を採用すると、ＤＲＡＭは管理情報分として１２７ＫＢｙｔｅの増加となるが、ジョブ用メモリは不要となる。ＤＲＡＭの１ビットあたりの面積はＳＲＡＭの１ビットあたりの面積の１／４とすると、管理情報分として０．８ｍｍ2のＤＲＡＭの面積増加となる。したがって、本願によって８−０．８＝７．４ｍｍ2の回路面積を削減することができる。
【００９７】
さらに、データ用メモリとして使用されるＤＲＡＭがメモリ量によらずその消費電力がほぼ一定であるのに対して、ジョブ用メモリとして使用されるＳＲＡＭはメモリ量によって増加する。本願で管理情報分の面積増加となったときも、ＤＲＡＭがメモリ量によらず一定電力であることから、ＤＲＡＭで消費される電力は、従来例も本願でも同じである。本願ではジョブ用メモリは不要であるため前記に相当する消費電力である、７００ｍＷが本願の採用によって削減できる効果がある。なお、メモリの面積・電力を計算は、例えば、文献http://www2.renesas.com/process/ja/edramadvantages.htmlを参考とした。
【００９８】
このように、従来例も少ない量のメモリ（上記具体例では従来例のジョブ用メモリサイズの３９％程度のメモリ量で）で、パケットジョブに相当するブロック管理情報を記憶することができる。
【００９９】
また、一般的には、固定長のブロックに複数のパケットデータを格納する場合、ブロック番号から当該ブロックの先頭アドレスを計算式で特定し、これら先頭アドレスに基づき、各ブロックにパケットデータを格納することができる。さらに、パケットデータが固定長であれば、ブロック内の決められたアドレスからパケットデータを格納することを前提として、ブロック内に格納したパケットデータの先頭アドレスをそれぞれ計算式で特定することも可能である。
【０１００】
しかしながら、本発明の課題とするパケットデータが可変長の場合、上記の方法では、ブロック内に格納したパケットデータの先頭アドレスを特定することはできない。したがって、前述したパケットジョブ（ジョブ情報）と同様の管理情報を、ブロックごとに別個のメモリで管理する必要があり、これらメモリの増大に伴う回路規模が大幅に増加する。
これに対して、本実施の形態にかかるパケットバッファ装置１０によれば、ブロックごとに設けたブロック管理情報に、ブロック内に格納されたパケットデータの終端位置を示すパケット境界情報が含まれている。このため、このパケット境界情報に基づき、ブロック内に格納されている各パケットデータの先頭アドレスを、極めて容易に特定することができ、メモリの増大に伴う余分な回路規模の増加を抑制することも可能となる。
【０１０１】
［第２の実施の形態］
次に、本発明の第２の実施の形態にかかるパケットバッファ装置１０について説明する。
本実施の形態にかかるパケットバッファ装置１０は、図１に示した第１の実施の形態と同様の構成を有しているが、図３および図４に示した状態遷移とは一部異なる処理を行うことで、メモリ部１２に蓄積されるブロックの内部構造が異なっている。
【０１０２】
図５は、第２の実施の形態にかかるメモリ部の構成例である。
本実施の形態にかかるパケットバッファ装置１０において、メモリ部１２は、図５に示すように、バッファ制御部１１によって、固定長（Ｋワード、各ワードはＫビット）のブロック単位でパケットを蓄積するよう制御される。
本例では、メモリ部１２内のアドレスが連続するメモリ領域を、Ｋワードずつに区切って各々をブロックを構成し、パケットデータが入力されるごとに、アドレスの小さいブロックから順に格納する。
【０１０３】
ブロックの境界は、パケットデータの境界とは無関係に定められているため、１個のパケットデータが１個のブロック内に完全に収容される場合と、複数のブロックにまたがって収容される場合がある。
各ブロックには、パケットデータの他に、例えば１ワード分からなる固定長のブロック管理情報が含まれ、このブロック管理情報の格納位置は、各ブロック内で固定された位置が定められている。本例において、ブロック管理情報はブロックの先頭側すなわちアドレス最小側に寄せて配置される。
【０１０４】
ブロック管理情報をブロックの中で最初に読み出される位置に配置してメモリに格納すると、複数ブロックに分割格納されていないパケットデータをメモリから読み出すときと比較して、複数のブロックに分割格納されているパケットデータの場合でも、パケットデータをメモリから読み取るときのメモリの帯域利用効率を低下を回避して、分割されたパケットデータを含む複数のブロックをメモリから中断なく読み取ることが可能となる。
【０１０５】
これは、以下の動作による。ブロックの読み出し時に最初に読み出されるブロック管理情報から、ブロック内にパケット終端が含まれるか否かを判断し、パケット終端が含まれない場合は、ブロックに継続するブロックを読み出すコマンドをメモリに発行する。すなわち、ブロック管理情報をブロックの中で最初に読み出される位置に格納することで、ブロックをメモリから読み出した直後に、前記ブロック内にパケット終端が含まれるか否かを判断することができるため、パケット終端が含まれない場合に早く次のブロックの読み出しを開始できる。このため、ブロックの読み出しと次のブロックの読み出しの間の時間を最小にすることができる。
【０１０６】
各ブロックのパケットデータ領域は、Ｋ−１個のワードで構成されたパケットデータを収容する。ここで、パケットデータの先頭バイトを含むワードにおいて、前記先頭バイトを前記ワードの先頭バイトに配置する。また、前記パケットデータの末尾バイトに続けて、所定のパケット終端パタンとする。
【０１０７】
本例において、パケット終端パタンは、パケット終端バイトとパケット終端パッドパタンとから構成されている。すなわち、前記パケットデータの末尾バイトの次のバイトを、値「０」のパケット終端バイトとし、前記パケット終端バイトと次のパケットデータの先頭バイトの間、すなわち、パケット終端バイトを含むワード内でパケット終端バイトの次から前記ワードの末尾までに、各バイト値が「２５５」のパケット終端パッドパタンが挿入される。なお、パケット終端バイトがワードの末尾に位置する場合は、終端パッドパタンは挿入されない。また、パケットデータの末尾バイトがワード末尾にくる場合は、続くパケット終端バイトは次のワードの先頭となり、そのワードの末尾まで終端パッドパタンが挿入される。
【０１０８】
前記ブロック管理情報は、パケットデータ継続フラグの１ビットと、パケットデータ領域を構成する各ワードがパケット終端バイトを含むか否かを示すＫ−１個の境界判定ビット列から構成される。
前記パケットデータ継続フラグは、そのブロックのパケットデータ領域を使い切っているか否かを示す。前記パケットデータ継続フラグが「１」の場合は、パケットデータ領域を使い切っている場合であり、パケットデータ領域の最後まで有効なパケットデータが格納されていることを示す。一方、前記パケットデータ継続フラグが「０」の場合は、前記領域内に含まれるパケットデータの末尾（１個のブロックに複数のパケットが収容されている場合は最後のパケットのデータ末尾）より後ろに、有効なパケットデータが格納されていないことを示す。
【０１０９】
なお、本例では、１ワードのビット数と１ブロックに含まれるワード数が一致しているため、ブロック管理情報の１ワードは、パケットデータ継続フラグと境界判定ビット列のみから構成されることになるが、１ワードのビット数＜１ブロックに含まれるワード数の場合は、ブロック管理情報を２ワード以上で構成することになる。また、１ワードのビット数＞１ブロックに含まれるワード数の場合は、ブロック管理情報として、パケットデータ継続フラグと境界判定ビット列の他に、ブロック毎に所定の方法により算出したパリティを含めることや、ブロック管理情報のワード数を、パケットデータ継続フラグと境界判定ビット列のみを含む場合のワード数より大きくし、前記パリティをブロック管理情報に含めることも可能である。
【０１１０】
［第２の実施の形態の書込動作］
次に、前述した図３を参照して、本実施の形態にかかるパケットバッファ装置１０の書込動作について説明する。なお、本実施の形態にかかる読出動作は、図３の状態遷移図の一部において相違しているところがある。
【０１１１】
この書込動作において、次のような制御変数が用いられる。
境界判定ビットは、ワードごとに、当該ワードにおけるパケット末尾バイトの存在有無を示す変数である。
変数ｉは、１個のブロックデータ内に含まれるパケット末尾バイトの個数を計数するためのカウンタである。
格納位置は、パケットデータを１ワードずつ書込ブロックバッファ１３Ａ内のパケットデータ領域に格納するときの位置を指定する変数（ワードアドレス）である。
パケットデータ継続フラグは、パケットデータパケットデータ領域を使い切っているか否かを示す変数である。
【０１１２】
［初期化状態］
初期化状態（ステップ１００）において、バッファ制御部１１は、書込ブロックバッファ１３Ａを初期化する。この初期化処理において、バッファ制御部１１は、書込ブロックバッファ１３Ａの全ての境界判定ビットの値を「０」とする。また、書込バッファ部１３の格納位置を初期化する。これにより、格納位置は、パケットデータ領域の先頭位置にセットされる。
バッファ制御部１１は、初期化状態（ステップ１００）において、初期化が完了した時点で、パケットの入力を待つ、入力待ち状態（ステップ１０１）に遷移する。
【０１１３】
［入力待ち状態］
入力待ち状態（ステップ１０１）において、パケットの入力があった時点、すなわち「入力あり」の場合、バッファ制御部１１は、前記パケットのパケットデータを書込ブロックバッファ１３Ａに格納する、データ格納状態（ステップ１０２）に遷移する。
【０１１４】
また、入力待ち状態（ステップ１０１）において、パケットの入力がなく、メモリ部１２に蓄積されたブロックがあるか、または、書込バッファ部１３に保持されているパケットデータがない場合、すなわち「入力なし and（メモリ蓄積あり or データ保持なし）」の場合、バッファ制御部１１は、他の状態に遷移せずに、パケットの入力を待ち受ける入力待ち状態（ステップ１０１）に留まる。
【０１１５】
また、入力待ち状態（ステップ１０１）において、パケットの入力がなく、メモリ部１２に蓄積されたブロックがなく、かつ、書込バッファ部１３に保持されているパケットデータがある場合、すなわち「入力なし and（メモリ蓄積なし and データ保持あり）」の場合、バッファ制御部１１は、１ブロック分のパケットデータが揃うのを待たずに、未満了状態のブロックをメモリ部１２に書き込むため、ブロック書き込み２状態（ステップ１０４）に遷移する。この遷移は、入力がなくメモリ部１２に蓄積されたパケットデータを出し尽くし、書込ブロックバッファ１３Ａに残った最後のパケットデータが出力されない状況を回避するためのものである。
【０１１６】
［データ格納状態］
データ格納状態（ステップ１０２）において、バッファ制御部１１は、書込ブロックバッファ１３Ａのうち、格納位置が示すパケットデータ領域内の位置に、入力されたパケットデータを１ワードずつ格納し、併せて、前記格納位置を１ワードずつ後ろに移動させる。なお、パケットデータの先頭バイトが、前記バイトを含むワードの先頭位置となるように、前記パケットデータをワード単位で分割する。
【０１１７】
また、データ格納状態（ステップ１０２）において、パケットデータが後続し、かつ、書込ブロックバッファ１３Ａのパケットデータ領域に空きがある場合、すなわち「パケット継続 and ブロック未満了」の場合、バッファ制御部１１は、データ格納状態（ステップ１０２）に留まって、前記データ格納を継続する。
【０１１８】
一方、データ格納状態（ステップ１０２）において、パケットデータが後続し、かつ、書込ブロックバッファ１３Ａのパケットデータ領域に空きがなくなった場合、すなわち「パケット継続 and ブロック満了」の場合、バッファ制御部１１は、書込ブロックバッファ１３Ａに保持されたブロックをメモリ部１２に書き込む、ブロック書き込み１状態（ステップ１０３）に遷移する。
【０１１９】
また、データ格納状態（ステップ１０２）において、パケットデータの末尾バイトまでデータを入力し終えた場合、すなわち「パケット終了」時、バッファ制御部１１は、書込ブロックバッファ１３Ａにパケット終端位置を格納する、パケット終端位置更新状態（ステップ１０５）に遷移する。
【０１２０】
［データ終端位置更新状態］
データ終端位置更新状態（ステップ１０５）において、バッファ制御部１１は、データ格納状態において格納した最後のワード内に含まれるパケットデータの末尾バイトに続けて、パケット終端パタンを格納する。本例では、前記パケットデータの末尾バイトの次のバイト位置に、値「０」のパケット終端バイトを格納し、さらに、前記パケット終端バイトを含むワード内において、前記パケット終端バイトの次のバイト位置から前記ワードの末尾バイト位置までに、各バイト値が「２５５」のパケット終端パッドパタンを格納する。さらに、データ終端位置更新状態（ステップ１０５）において、バッファ制御部１１は、パケット終端バイトを格納したワードに対応する境界判定ビットに「１」を格納する。
【０１２１】
また、データ終端位置更新状態（ステップ１０５）において、書込ブロックバッファ１３Ａのパケットデータ領域に空きがある場合、すなわち「ブロック未満了」時、バッファ制御部１１は、入力待ち状態（ステップ１０１）に遷移する。
一方、データ終端位置更新状態（ステップ１０５）において、書込ブロックバッファ１３Ａのパケットデータ領域に空きがなくなった場合、すなわち「ブロック満了」時、バッファ制御部１１は、書込ブロックバッファ１３Ａに保持されたブロックをメモリ部１２に書き込む、ブロック書き込み２状態（ステップ１０４）に遷移する。
【０１２２】
［ブロック書き込み１状態］
ブロック書き込み１状態（ステップ１０３）において、バッファ制御部１１は、書込ブロックバッファ１３Ａ内のブロック管理情報に保持されているパケットデータ継続フラグの値を「１」とし、書込ブロックバッファ１３Ａに保持されているブロックデータを、メモリ部１２内の所定のアドレスに書き込む。
【０１２３】
さらに、バッファ制御部１１は、書込ブロックバッファ１３Ａを初期化する。この初期化では、全ての境界判定ビットの値を「０」とする。また、書込バッファ部１３の格納位置を初期化する。これにより、格納位置は、パケットデータ領域の先頭ワードにセットされる。その後、バッファ制御部１１は、データ格納状態（ステップ１０２）に遷移する。
【０１２４】
［ブロック書き込み２状態］
ブロック書き込み２状態（ステップ１０４）において、バッファ制御部１１は、書込ブロックバッファ１３Ａ内に保持されているパケットデータ継続フラグの値を「０」に初期化し、書込ブロックバッファ１３Ａに保持されているブロックデータを、メモリ部１２内の所定のアドレスに書き込む。
【０１２５】
さらに、バッファ制御部１１は、書込ブロックバッファ１３Ａを初期化する。この初期化では、全ての境界判定ビットの値を「０」に初期化し、書込バッファ部１３の格納位置を「０」に初期化する。これにより、格納位置がパケットデータ領域の先頭ワードにセットされる。その後、バッファ制御部１１は、入力待ち状態（ステップ１０１）に遷移する。
【０１２６】
なお、以上で説明した書込動作において、ブロック書き込み１状態（ステップ１０３）またはブロック書き込み２状態（ステップ１０４）では、メモリ部１２に保持しているブロックデータを書き込む処理を行うが、メモリ部１２でのブロックの蓄積がなく、かつ、読出ブロックバッファ１４Ａにブロックの保持がない場合は、前記のようにメモリ部１２に書き込むのではなく、読出ブロックバッファ１４Ａに格納する処理を行ってもよい。これにより、入力されたパケットが蓄積されず出力される状況において、メモリ部１２への蓄積を省くことができるため、メモリ部１２での消費電力の削減が可能となる。
【０１２７】
［第２の実施の形態の読出動作］
次に、図４を参照して、本実施の形態にかかるパケットバッファ装置１０の読出動作について説明する。なお、本実施の形態にかかる読出動作は、図４の状態遷移図の一部において相違しているところがある。
【０１２８】
この読出動作において、次のような制御変数が用いられる
データ保持有無は、読出ブロックバッファ１４Ａでのデータ保持あり／なしを示す変数である。
変数ｉは、１個のブロックデータ内に含まれるパケット末尾バイトの個数を計数するためのカウンタである。
パケット終端位置は、各パケットデータの末尾バイトの位置を示す変数であり、１個のブロックデータ内のパケットデータ領域の先頭バイトからのバイト数で表現される。
【０１２９】
格納位置は、パケットデータを１ワードずつ読出ブロックバッファ１４Ａ内のパケットデータ領域に格納するときの位置を指定する変数（ワードアドレス）である。
取得位置は、パケットデータを１ワードずつ読出ブロックバッファ１４Ａ内のパケットデータ領域から取得するときの位置を指定する変数（ワードアドレス）である。
パケットデータ継続フラグは、パケットデータパケットデータ領域を使い切っているか否かを示す変数である。
【０１３０】
［初期化状態］
初期化状態（ステップ１１０）において、バッファ制御部１１は、読出ブロックバッファ１４Ａを初期化する。この初期化処理において、バッファ制御部１１は、データ保持有無の値をデータ保持なしに初期化する。
バッファ制御部１１は、初期化状態（ステップ１１０）において、初期化が完了した時点で、出力指示情報の入力を待つ、入力待ち状態（ステップ１１１）に遷移する。
【０１３１】
［入力待ち状態］
入力待ち状態（ステップ１１１）において、バッファ制御部１１は、出力指示情報の入力があるまで、他の状態に遷移せずに、出力指示情報の入力を待ち受ける入力待ち状態（ステップ１１１）に留まる。
また、入力待ち状態（ステップ１１１）において、出力指示情報の入力があった時点で、前記データ保持有無がデータ保持ありを示す場合、すなわち「入力あり and データ保持あり」の場合、バッファ制御部１１は、データ取得状態（ステップ１１２）に遷移する。
【０１３２】
一方、入力待ち状態（ステップ１１１）において、出力指示情報の入力があった時点で、前記データ保持有無がデータ保持なしを示す場合、すなわち「入力あり and データ保持あり」の場合、バッファ制御部１１は、ブロック読み出し状態（ステップ１１３）に遷移する。
【０１３３】
［データ取得状態］
データ取得状態（ステップ１１２）において、バッファ制御部１１は、読出ブロックバッファ１４Ａから、取得位置が示す位置から、パケットデータを１ワードずつ取得して出力し、併せて、前記取得位置を１ワードずつ後ろに移動させる。
【０１３４】
また、データ取得状態（ステップ１１２）において、バッファ制御部１１は、パケット継続／終了と、残データあり／なしを判定する。
この際、前記パケット終了は、読出ブロックバッファ１４Ａから取得したワードに対応した境界判定ビットが「１」となる（前記ワード内にパケット終端バイトを含む）こと、すなわち、取得中のパケットデータの末尾バイトまで取得を終えたことを条件として判定する。また、パケット継続は、前記パケット終了の条件を満たさないことを条件として判定する。
【０１３５】
一方、前記残データありは、前記取得位置がパケットデータ領域の最終ワード位置に達していないことであり、残データなしの条件は、前記残データありの条件を満たさないことを条件として判定する。
【０１３６】
また、データ取得状態（ステップ１１２）において、パケットデータの末尾バイトまでデータを取得し終えた場合、すなわち「パケット終了」時、バッファ制御部１１は、前記データ保持有無の値を、以下に示す判定に基づいて更新し、その後、入力待ち状態（ステップ１１１）に遷移する。
【０１３７】
バッファ制御部１１は、上記判定において、まず、前記取得位置がパケットデータ領域の最終ワード位置に達した場合、保持なしとする。
一方、前記取得位置がパケットデータ領域の最終ワード位置に達していない場合、かつ、パケットデータ継続フラグの値が「１」の場合は、保持ありとする。
【０１３８】
また、前記取得位置がパケットデータ領域の最終ワード位置に達していない場合、かつ、パケットデータ継続フラグの値が「０」の場合、かつ、前記パケットデータ領域内にある取得済みのワードより後のワードに対応する境界判定ビットの中に「１」の値をとるものが含まれる場合、保持ありとする。
また、前記以外は、保持なしとする。
【０１３９】
また、データ取得状態（ステップ１１２）において、パケット継続であり、かつ、残データなしの場合、すなわち「パケット継続 and 残データなし」時、バッファ制御部１１は、メモリ部１２が蓄積するブロックを読み出して、読出ブロックバッファ１４Ａに格納する、ブロック読み出し状態（ステップ１１３）に遷移する。
【０１４０】
一方、データ取得状態（ステップ１１２）において、パケット継続であり、かつ、残データありの場合、すなわち「パケット継続 and 残データあり」時、バッファ制御部１１は、データ取得状態（ステップ１１２）に留まって、読出ブロックバッファ１４Ａからパケットデータを取得して出力する。
【０１４１】
［ブロック読み出し状態］
ブロック読み出し状態（ステップ１１３）において、バッファ制御部１１は、メモリ部１２の所定アドレスから１個のブロックを読み出して、読出ブロックバッファ１４Ａに前記ブロックを格納する。また、バッファ制御部１１は、前記取得位置を示す変数値を、読出ブロックバッファ１４Ａ内のパケットデータ領域の先頭ワード位置を示す値に初期化するとともに、データ保持有無の値を保持ありに初期化する。
【０１４２】
［第２の実施の形態の効果］
このように、本実施の形態にかかるパケットバッファ装置１０は、メモリ部１２の前記ブロックが、複数バイトの固定長からなるワードを単位として複数個に分割されてなり、前記パケット制御部１１は、前記書込ブロックバッファ１３Ａに前記ブロック管理情報を格納する際、前記書込ブロックバッファ１３Ａ内の前記ワードの先頭ワードから前記ブロック管理情報を格納し、前記書込ブロックバッファ１３Ａに前記パケットデータを書き込む際、前記ブロック管理情報の末尾バイトを格納した前記先頭ワードの次のワードから順に格納用のワードを選択し、選択したワードに前記パケットデータを格納する際、当該ワードの先頭バイトから順に当該パケットデータの各バイトを格納するとともに、当該パケットデータの末尾バイトを格納したバイトの次のバイトから所定のパケット終端パタンを格納し、前記書込ブロックバッファ１３Ａに前記ブロック管理情報を格納する際、前記パケット境界情報に代えて、前記各ワードにおける前記パケットデータの末尾バイトの存在有無を示す境界判定ビット列を含む前記ブロック管理情報を格納するようにしたものである。
【０１４３】
これにより、本実施の形態にかかるパケットバッファ装置１０によれば、ブロック管理情報およびパケットデータを固定長のワードの整数倍とすることができ、バイト単位ではなく、より大きなワード単位での処理が可能となるため、書き込みバッファの回路を簡易化することができる。
また、境界判定ビット列をパケット境界情報としているため、ブロック先頭バイトからのバイト数を計数する必要がなくなり、パケット境界情報を生成するための回路を簡易化することができる。同様に、パケット境界情報に基づいてブロックから個々のパケットを抽出するための回路を簡易化することができる。
【０１４４】
上記の効果について、以下に説明する。
第２の実施の形態では、ブロック管理情報およびパケットデータを、固定長のワード単位で扱うが、第１の実施の形態ではバイト単位で扱う。
パケットの宛先や送信元など表す情報を含むヘッダは、パケットデータの先頭バイトを基準として決まった位置にあり、パケットに対する処理を行うとき、例えば、パケットを入出力する複数のポートを装置が備えるときパケットのヘッダの値に応じて、どのポートから出力するかを決める、複数のキューを備えるときパケットのヘッダの値に応じて、どのキューにパケットを蓄積するかを決める、など、パケットデータのヘッダの値を読み取る処理が行われる。
【０１４５】
また、前記の処理では、パケットデータをバイト列ではなく、ワードの列とし、前記ワード列に対する処理として回路を構成して回路のクロック周波数を低減することが、一般的に行われる。
ここで、パケット先頭バイトが、ワード内のどのバイトにも現れる可能性があるような回路では、パケットデータのワード列からヘッダの値を読み取るとき、前記パケット先頭バイトのワード内での位置を考慮した処理が必要となる。
【０１４６】
一方、パケット先頭バイトが、ワード内の第１バイトのみに現れるように、整列されたパケットデータである場合は、前記の考慮は不要となり、ヘッダを処理するための回路を簡易化することができる。このため、パケット先頭バイトが、ワード内の第１バイトのみに現れるよう整列させることが、一般的に行われている。
【０１４７】
第２の実施の形態では、上記のパケット先頭バイト位置をワード内の第１バイトのみに現れるように整列されたワード列として扱う回路に適合する。
すなわち、第２の実施の形態にかかるパケットバッファ装置１０が、パケット先頭バイト位置をワード内の第１バイトのみに現れるように整列されたワード列として扱う装置の後段あるいは前段にあり、装置間の信号形式が、パケット先頭バイト位置をワード内の第１バイトのみに現れるように整列されたワード列、という場合は、その信号形式を保ったまま、ブロック化してメモリに蓄積することができるので、バイト列としてパケットデータを扱う第１の実施の形態にかかるパケットバッファ装置１０では必要であった信号形式の変換が不要となる。
【０１４８】
なお、装置間の信号に上記信号形式を用いる場合、ワード列を通信する信号線の他に、前記ワード列がパケット境界を示すか否かを示す信号が必要となる。このパケット境界信号のビット値をブロック内に格納されたワードの順に配列すると、第２の実施の形態における境界判定ビット列とすることができる。このため、第２の実施の形態で境界判定ビット列を生成してブロック管理情報を生成するための回路は、第１の実施の形態のパケット終端位置を生成するためのブロック先頭位置からパケット末尾バイトまでのバイト数を計数し、さらに、書込ブロックバッファ１３Ａに保持されたデータに含まれるパケット末尾バイトの個数を計数する必要がないため、簡易化できる。
【０１４９】
［第３の実施の形態］
次に、図６を参照して、本発明の本実施の形態にかかるパケットバッファ装置１０について説明する。図６は、第３の実施の形態にかかるパケットバッファ装置の構成を示すブロック図である。
前述した第１の実施の形態では、固定長の記憶領域からなるブロックを単位として、入力された各パケットのパケットデータを、メモリ部１２で蓄積する場合を例として説明した。本実施の形態は、複数個のブロックで区画を構成し、入力された各パケットのパケットデータを、指定されたキューと対応する区画内のブロックで蓄積するようにしたものである。
【０１５０】
このパケットバッファ装置１０は、前述の図１に示した第１の実施の形態にある、バッファ制御部１１、メモリ部１２、書込バッファ部１３、読出バッファ部１４に加えて、書込位置情報保持部２１、読出位置情報保持部２２、連結区画情報保持部２３、空き区画情報保持部２４を備えている。
【０１５１】
書込位置情報保持部２１は、各キューについての、パケットのデータをメモリに書き込み始める区画を特定する区画識別子である書込区画識別子と、前記区画内での書き込み始める位置を示す書込区画内位置情報とを保持する機能と、バッファ制御部１１からキュー識別子の値を受け取って、前記キュー識別子によって特定されたキューの、書込区画識別子と書込区画内位置情報の値をバッファ制御部１１に出力する機能、あるいは、バッファ制御部１１からキュー識別子の値と、前記キュー識別子によって特定されたキューの、更新された書込区画識別子と書込区画内位置情報の値を受け取って、前記キューについて保持していた書込区画識別子と書込区画内位置情報の値を、前記更新された書込区画識別子と書込区画内位置情報の値に書き換える機能とを有している。これら機能は、キュー識別子の値をアドレスとし、前記アドレスによって特定されるワードに、対応する書込区画識別子の値と書込区画内位置情報の値とを保持するメモリ回路によって実現可能である。
【０１５２】
読出位置情報保持部２２は、各キューについての、パケットのデータをメモリから読み出し始める区画を特定する区画識別子である読出区画識別子と、前記区画内での読み出し始める位置を示す読出区画内位置情報とを保持する機能と、バッファ制御部１１からキュー識別子の値を受け取って、前記キュー識別子によって特定されたキューの、読出区画識別子と読出区画内位置情報の値をバッファ制御部１１に出力する機能、あるいは、バッファ制御部１１からキュー識別子の値と、前記キュー識別子によって特定されたキューの、更新された読出区画識別子と読出区画内位置情報の値を受け取って、前記キューについて保持していた読出区画識別子と読出区画内位置情報の値を、前記更新された読出区画識別子と読出区画内位置情報の値に書き換える機能とを有している。これら機能は、キュー識別子の値をアドレスとし、前記アドレスによって特定されるワードに、対応する読出区画識別子の値と読出区画内位置情報の値とを保持するメモリ回路によって実現可能である。
【０１５３】
連結区画情報保持部２３は、各区画についての、前記区画に連結される区画を特定する区画識別子である連結区画識別子を保持する機能と、バッファ制御部１１から区画識別子の値を受け取って、前記区画識別子によって特定された区画に連結される区画を特定する連結区画識別子の値を出力する機能、あるいは、バッファ制御部１１から区画識別子の値と、前記区画識別子によって特定された区画の、更新された連結区画識別子の値を受け取って、前記区画について保持していた連結区画識別子の値を、前記更新された読出区画識別子と読出区画内位置情報の値に書き換える機能とを有している。これら機能は、区画識別子の値をアドレスとし、前記アドレスによって特定されるワードに、対応する連結区画識別子の値を保持するメモリ回路によって実現可能である。
なお、本実施の形態では、連結区画情報保持部２３は、連結区画識別子の値としてＭを保持することが可能であり、前記値は連結された区画がないことを意味する。
【０１５４】
空き区画情報保持部２４は、バッファ制御部１１がパケットのデータが蓄積されていない区画を空き区画のリストとして管理するために、空き区画リストの最初の区画を特定する区画識別子である空き区画連結開始識別子と、空き区画リストの最後の区画を特定する区画識別子である空き区画連結終了識別子とを保持する機能と、バッファ制御部１１に、空き区画連結開始識別子と空き区画連結終了識別子の値を出力する機能、あるいは、バッファ制御部１１から、更新された空き区画連結開始識別子と空き区画連結終了識別子の値を受け取って、保持していた空き区画連結開始識別子と空き区画連結終了識別子の値を、前記更新された値に変更する機能とを有している。これら機能は、区画識別子の値をアドレスとし、前記アドレスによって特定されるワードに、対応する空き区画連結開始識別子と空き区画連結終了識別子の値を保持するメモリ回路によって実現可能である。
【０１５５】
図７は、メモリ部（ブロック分割）の構成例である。
メモリ部１２は、図７に示すように、バッファ制御部１１によって、複数の互いに重ならないアドレス範囲で区分けされ、前記区分けされた複数の区画として管理される。本実施の形態では、Ｍ個の区画に区分けされる。Ｍはキューの個数Ｎ以上の値をとる整数である。前記Ｍに対する制約は、すべてのキューに同時にパケットを蓄積可能とするために必要な制約であり、すべてのキューに同時にパケットを蓄積することが必要とされない実施形態では、前記制約は必要ない。また、メモリ部１２のアドレス順に区分けしたときの各区画に割り付けられた番号を、前記区画を特定するための区画識別子とし、その値は０からＭ−１までの整数のうち何れかの値をとる。
【０１５６】
また、各区画の内部は、複数の互いに重ならないアドレス範囲でさらに区分けされ、固定長であるＫバイトのブロックで管理されており、１個の区画に最大Ｂ個のブロックを蓄積することができる。これにより、メモリ部１２は、バッファ制御部１１からの制御に基づき、任意の区画についてパケットデータを書き込み／読み出しする際、ブロック単位で、パケットデータをシーケンシャルで書き込み／読み出しする。
【０１５７】
図８は、第３の実施の形態にかかるメモリ部におけるパケットデータ蓄積状態を示す説明図である。
本実施の形態では、メモリ部１２のうち、アドレスが連続するメモリ領域を、Ｋバイトずつに区切ってＢ個のブロックを設け、パケットの入力順に、アドレスが小さい方のブロックから格納される。
上記Ｂは、各区画に含まれるブロック数であるが、Ｂの値は自然数であり値に制限はない。ただし、Ｂ×Ｋ×Ｍの値は、パケットバッファが蓄積すべきデータの全バイト数より大きくすべき値なので、ＢやＫやＭの値の範囲に定めがあり、パケットバッファが蓄積すべきデータの全バイト数が規定されている場合には、Ｂの取りうる範囲が前記式によって実用上制約を受ける。
【０１５８】
なお、ある区画内のメモリ領域にデータ書き込みや読み出しを行うとき、前記区画内の位置、例えば区画先頭ワードからのワード数を、２進数として表現するポインタを使用するが、前記ポインタ値の演算（区画をＦＩＦＯとして使用するときのポインタ値更新など）において、Ｂを２のべき乗とすると、前記の演算回路を簡易に構成することができる。
【０１５９】
一方、上記Ｍの値は、キューの個数Ｎ以上の値とすべきである。Ｍ＝Ｎのとき、各キューに１個の区画を割り当てることができるが、Ｍ＜Ｎの場合は、区画が割り当てられないキューが生じる。
パケットバッファが蓄積すべきデータの全ビット数が規定されているとき、Ｍの値を大きくすれば、各区画のビット数を小さくすることができる。これにより、キューに対して割当済である区画のうち、データを記憶していない空き領域の大きさを小さくすることが可能である、これは、空き領域が、最悪で、１区画分のメモリ量程度になるためである。
【０１６０】
したがって、Ｍを大きくすると、メモリの利用効率が向上し、必要なメモリ量を、パケットバッファが蓄積すべきデータの全ビット数に近づけることができる。この場合、各キューに区画を割り当てたものの蓄積に利用されなかったという状況が最も空きが多い状況であるため、蓄積に使用された区画数／全区画数＝（Ｍ−Ｎ）／Ｍがメモリ利用効率に相当する値になる。
ただし、Ｍを大きくすると、バッファ制御部１１が管理すべき区画数が増えるので、各キューの区画連結の状態を保持する連結区画情報保持部２３や、空き区画を管理する空き区画情報保持部２４の回路規模が増大する。つまり、メモリ利用効率を１００％に近づけようとすると上記回路規模の増大が問題となるので、前記利用効率を８０％から９０％とする場合の指標である、Ｍ＝Ｎ×５〜Ｎ×１０程度が実用的な範囲である。
【０１６１】
Ｋは１ブロックのバイト数であり、Ｋの値を、ブロックを記憶するメモリの１バーストでアクセスできるデータ量の整数倍とすることで、効率的なブロックの書き込み／読み出しが可能となる。１バーストあたりのデータ量は、一般的に２のべき乗の値をとるが、その値はメモリのデータ幅やバースト長に依存する。Ｋが大きくなると、１ブロック分のデータを保持するためのメモリ量が増大するため、書込バッファ部１３と読出バッファ部１４の回路規模が増大するという問題が生じる。
【０１６２】
また、Ｋが最小パケット長よりも小さいと、パケット境界が含まれないブロックの割合が増大し、ブロック管理情報のために使用されるメモリが無駄になるという問題が生じる。
また、メモリが複数のバンクに分かれている場合は、マルチ・バンク・オペレーションによって、メモリの帯域利用効率を向上させることができるので、Ｋを、バーストあたりのデータ量×バンク数の整数倍とすると、１ブロックのアクセスを予め決めておいたメモリへのコマンド発行手順によって行うことで、簡単な回路でマルチ・バンク・オペレーションを実現することができる。Ｋの値の例は、１２８，２５６，５１２，１０２４である。
【０１６３】
ブロックの境界は、パケットの境界とは無関係に定められているため、１個のブロックに１個のパケットのパケットデータが完全に収容される場合と、複数のブロックにまたがって収容される場合がある。
各ブロックには、パケットデータの他に、固定長（Ｈバイト）のブロック管理情報が含まれ、ブロック管理情報のブロック内での位置が定められている。本例では、ブロックの先頭側すなわちアドレス最小側に寄せて配置される。
【０１６４】
また、本例では、ブロック管理情報は、パケット境界情報の他に、そのブロックのパケットデータ領域を使い切っているか否かを示す、パケットデータ継続フラグを持つ。前記パケットデータ継続フラグが「１」の場合は、パケットデータ領域を使い切っている場合であり、パケットデータ領域の最後まで有効なパケットデータが格納されていることを示す。
一方、前記パケットデータ継続フラグが「０」の場合は、前記領域内に含まれるパケットデータの末尾（１個のブロックに複数のパケットが収容されている場合は最後のパケットのデータ末尾）より後ろに、有効なパケットデータが格納されていないことを示す。
【０１６５】
Ｈはブロック管理情報のバイト数である。ブロック内に入り得るパケット数分のパケット境界位置を示すパケット終端位置を含む必要がある。パケット終端位置をブロック先頭からのバイト数として表す場合は、１個のパケット終端位置は、ブロックのバイト数未満の値を表現するため、ｌｏｇ２（Ｋ−１）以上のビット数となる。また、ブロック内のデータをバイト単位ではなくワード単位で扱う場合には、ブロック管理情報を１ワードまたは予め決められた個数のワードに収めるよう規定することで、ワード単位での扱いに整合する。
【０１６６】
さらに、ブロック管理情報がパケットデータ継続フラグを含む場合には、ブロック管理情報に加えて前記フラグ用に少なくとも１ビットを必要となる。最小パケット長が６４Ｂｙｔｅのとき、Ｈの値の例は、２，４，８，１６であり、各々、Ｋ＝１２８，２５６，５１２，１０２４に対応する。
ただし、Ｋ＝５１２，１０２４の場合、パケット終端位置はブロック先頭からのバイト数ではなく、ブロック先頭からのワード数を表すと仮定している。前記により、パケット終端位置は、ブロック内のデータのバイト数を２進数として表現可能なビット数よりも少ないビット数で表現できるためである。例えば、Ｋ＝５１２のとき、ブロック先頭からのバイト数としてパケット終端位置を規定すると８ｂｉｔ長となるが、ブロック先頭からの４Ｂｙｔｅ長のワード数パケット終端位置を規定すると６ｂｉｔ長で済む。
【０１６７】
パケット境界情報は、Ｐ個のパケット終端位置からなる。各パケット終端位置は、ブロックに含まれるパケットデータ末尾バイトのブロック内での位置、すなわち、パケットデータ領域の先頭バイトから前記パケットデータ末尾バイトまでのバイト数で表される。この際、パケット終端位置が「１」となる場合は、パケットデータ領域の先頭バイトがパケットデータ末尾バイトである場合である。なお、パケット終端位置が「０」の値である場合は、前記パケット終端位置が無効であることを意味し、１個のブロックに含まれるパケットデータ末尾バイトの数がＰ個より少ない場合に生じる。
【０１６８】
Ｐはブロック内に入り得るパケット数の最大値である。したがって、Ｐ≧Ｋ／最小パケット長となる。最小パケット長が６４Ｂｙｔｅのとき、Ｐの値の例は、Ｐ＝２，４，８，１６、であり、各々、Ｋ＝１２８，２５６，５１２，１０２４に対応する。ただし、パケット境界位置情報はブロック先頭からのバイト数ではなくブロック先頭からのワード数を表すと仮定している。
【０１６９】
［第３の実施の形態の書込動作］
次に、図９を参照して、本実施の形態にかかるパケットバッファ装置１０において、キュー入力指示情報の入力に応じて、入力されたパケットのパケットデータを、書込ブロックバッファ１３Ａへワード単位で順次格納した後、ブロック単位で、メモリ部１２内の対応する区画へ書き込む書込動作について説明する。図９は、第３の実施の形態にかかる書込動作を示す状態遷移図である。なお、書込動作動作のうち、ブロック書き込み１状態（ステップ２０３）およびブロック書き込み２状態（ステップ２０４）におけるブロック書込動作の詳細については、図１０を参照して後述する。
【０１７０】
この書込動作において、次のような制御変数が用いられる。
パケット終端位置は、各パケットデータの末尾バイトの位置を示す変数であり、１個のブロックデータ内のパケットデータ領域の先頭バイトからのバイト数で表現される。
変数Ｐは、１個のブロックデータ内に含みうるパケット数の最大値である。
変数ｉは、１個のブロックデータ内に含まれるパケット末尾バイトの個数を計数するためのカウンタであり、最大値Ｐ個以下の値をとる。
格納位置は、パケットデータを１バイトずつ書込ブロックバッファ１３Ａ内のパケットデータ領域に格納するときの位置を指定する変数（バイトアドレス）である。
パケットデータ継続フラグは、パケットデータ領域を使い切っているか否かを示す変数である。
【０１７１】
［初期化状態］
パケットバッファ装置１０は、電源投入後、パケットの入力を開始する前に、初期化状態（ステップ２００）に遷移して、初期化処理を実行する。また、パケットバッファ装置１０に正常な動作を維持することができない異常の発生をパケットバッファ装置１０自身が検出した場合や、外部からのリセット要求があった場合にも、初期化が行われる。
【０１７２】
初期化状態（ステップ２００）において、バッファ制御部１１は、書込ブロックバッファ１３Ａを初期化する。この初期化処理において、バッファ制御部１１は、Ｍ個のパケット終端位置の値を「０」に初期化するとともに、変数ｉの値を「０」に初期化する。また、バッファ制御部１１は、書込バッファ部１３の格納位置を初期化する。これにより、格納位置は、パケットデータ領域の先頭位置にセットされる。
【０１７３】
バッファ制御部１１は、初期化状態（ステップ２００）において、初期化が完了した時点で、パケットの入力を待つ、入力待ち状態（ステップ２０１）に遷移する。
【０１７４】
［入力待ち状態］
入力待ち状態（ステップ２０１）において、パケットの入力があった時点で、バッファ制御部１１は、パケットデータを蓄積可能か否かを判定する。この際、蓄積可否は、現在の書込区画内での書込区画内位置（ブロック）が満了であり、かつ、連結区画が連結されていない状態を蓄積不可と判定し、他の状態を蓄積可と判定する。
したがって、パケットの入力があって、パケットの蓄積が可能であった場合、すなわち「入力あり and メモリ蓄積可」の場合、バッファ制御部１１は、前記パケットのパケットデータを書込ブロックバッファ１３Ａに格納する、データ格納状態（ステップ２０２）に遷移する。
【０１７５】
また、入力待ち状態（ステップ２０１）において、パケットの入力がなく、メモリ部１２に蓄積されたブロックがあるか、または、書込バッファ部１３に保持されているパケットデータがない場合、すなわち「入力なし and（メモリ蓄積あり or データ保持なし）」の場合、バッファ制御部１１は、他の状態に遷移せずに、パケットの入力を待ち受ける入力待ち状態（ステップ２０１）に留まる。
【０１７６】
書込バッファ部１３は、１ブロック分のパケットデータが揃うまで、書込ブロックバッファ１３Ａ内で前記パケットデータを保持する。例えば、初期状態（空の状態）の書込ブロックバッファ１３Ａに、３．５ブロック分の長さのパケットデータを持つ１個のパケットが入力された場合、このパケットデータは、先頭から３個のブロックに順に分割されて、メモリ部１２に書き込まれるが、ブロック１個分に満たない残り０．５ブロック分のパケットデータについては、書込ブロックバッファ１３Ａ内で、次のパケットが入力されることによって、ブロック１個分のデータが揃うのを待つことになる。
【０１７７】
このような場合に、メモリ部１２から前記パケットデータを読み出すとき、メモリ部１２に蓄積された３個のブロックのデータについては読み出しが行われるが、書込ブロックバッファ１３Ａ内に残ったパケットデータについてはメモリ部１２に蓄積されていないので、このままでは、メモリ部１２から読み出した３個のブロックデータからパケットを再生することができない。
そこで、このような状況では、ブロック書き込み２状態（ステップ２０４）に遷移することによって、書込ブロックバッファ１３Ａ内に残された残りのデータを、１ブロック分のブロックデータが揃っていなくともメモリ部１２に書き込むことにより、メモリ部１２から１個のパケットデータを全て読み出せるようにしている。
【０１７８】
すなわち、入力待ち状態（ステップ２０１）において、パケットの入力がなく、メモリ部１２に蓄積されたブロックがなく、かつ、書込バッファ部１３に保持されているデータがある場合、すなわち「入力なし and（メモリ蓄積なし and データ保持あり）」の場合、バッファ制御部１１は、１ブロック分のパケットデータが揃うのを待たずに、未満了状態のブロックをメモリ部１２に書き込むため、ブロック書き込み２状態（ステップ２０４）に遷移する。この遷移は、入力がなくメモリ部１２に蓄積されたパケットデータを出し尽くし、書込ブロックバッファ１３Ａに残った最後のデータが出力されない状況を回避するためのものである。
【０１７９】
一方、入力待ち状態（ステップ２０１）において、パケットの入力があって、パケットの蓄積が不可能であった場合、すなわち「入力あり and メモリ蓄積不可」の場合、バッファ制御部１１は、入力パケット廃棄状態（ステップ２０６）に遷移し、前記パケットを蓄積せず廃棄する。
【０１８０】
［入力パケット廃棄状態］
入力パケット廃棄状態（ステップ２０６）において、バッファ制御部１１は、パケットデータの入力が終了するまで、前記状態に留まり、前記パケットデータの入力終了に応じて、入力待ち状態（ステップ２０１）に遷移する。これにより、パケット単位で、パケットデータを廃棄することができる。したがって、パケットデータが途中まで書き込まれた後、その後半だけが廃棄されるという不連続パケットデータの発生を回避でき、不連続パケットデータに起因するパケット読み出し時の不具合発生を抑止することが可能となる。
【０１８１】
［データ格納状態］
データ格納状態（ステップ２０２）において、バッファ制御部１１は、書込ブロックバッファ１３Ａのうち、格納位置が示すパケットデータ領域内の位置に、入力されたパケットデータを１バイトずつ格納し、併せて、前記格納位置を１バイトずつ後ろに移動させる。なお、パケットデータが１バイト単位で入力されるのではなく、予め定められたバイト数単位で入力される場合には、前記バイト数単位で格納と格納位置の移動を行う。
【０１８２】
また、データ格納状態（ステップ２０２）において、パケットデータが後続し、かつ、書込ブロックバッファ１３Ａのパケットデータ領域に空きがある場合、すなわち「パケット継続 and ブロック未満了」の場合、バッファ制御部１１は、データ格納状態（ステップ２０２）に留まって、前記パケットデータの格納を継続する。
【０１８３】
一方、データ格納状態（ステップ２０２）において、パケットデータが後続し、かつ、書込ブロックバッファ１３Ａのパケットデータ領域に空きがなくなった場合、すなわち「パケット継続 and ブロック満了」の場合、バッファ制御部１１は、書込ブロックバッファ１３Ａに保持されたブロックデータをメモリ部１２に書き込む、ブロック書き込み１状態（ステップ２０３）に遷移する。
【０１８４】
また、データ格納状態（ステップ２０２）において、パケットデータをその末尾バイトまで書込ブロックバッファ１３Ａへ入力し終えた場合、すなわち「パケット終了」時、バッファ制御部１１は、書込ブロックバッファ１３Ａにパケット終端位置を格納する、パケット終端位置更新状態（ステップ２０５）に遷移する。
【０１８５】
［データ終端位置更新状態］
データ終端位置更新状態（ステップ２０５）において、バッファ制御部１１は、変数ｉの値に「１」を加算する。
さらに、バッファ制御部１１は、直前のデータ格納状態（ステップ２０２）において、パケットデータの末尾バイトを書込ブロックバッファ１３Ａに格納した際、その格納位置に相当するバイト数、すなわち、前記書込ブロックバッファ１３Ａのパケットデータ領域先頭から前記末尾バイトまでのバイト数を、ブロック管理情報に含まれるパケット終端位置＃ｉとして、書込ブロックバッファ１３Ａに格納する。
【０１８６】
データ終端位置更新状態（ステップ２０５）において、書込ブロックバッファ１３Ａのパケットデータ領域に空きがある場合、すなわち「ブロック未満了」時、バッファ制御部１１は、入力待ち状態（ステップ２０１）に遷移する。
また、データ終端位置更新状態（ステップ２０５）において、書込ブロックバッファ１３Ａのパケットデータ領域に空きがなくなった場合、すなわち「ブロック満了」時、バッファ制御部１１は、書込ブロックバッファ１３Ａに保持されたブロックをメモリ部１２に書き込む、ブロック書き込み２状態（ステップ２０４）に遷移する。
【０１８７】
［ブロック書き込み１状態］
ブロック書き込み１状態（ステップ２０３）において、バッファ制御部１１は、書込ブロックバッファ１３Ａ内にブロック管理情報として保持されているパケットデータ継続フラグの値を「１」とし、書込ブロックバッファ１３Ａに保持されているブロックデータを、メモリ部１２内の所定のアドレスに書き込む。
【０１８８】
さらに、バッファ制御部１１は、書込ブロックバッファ１３Ａを初期化する。この初期化では、Ｐ個のパケット終端位置の値を「０」に初期化するとともに、変数ｉを「０」に初期化する。また、書込バッファ部１３で保持する格納位置を初期化する。これにより、格納位置は、パケットデータ領域の先頭位置にセットされる。その後、バッファ制御部１１は、データ格納状態（ステップ２０２）に遷移する。
【０１８９】
［ブロック書き込み２状態］
ブロック書き込み２状態（ステップ２０４）において、バッファ制御部１１は、書込ブロックバッファ１３Ａ内にブロック管理情報として保持されているパケットデータ継続フラグの値を「０」に初期化し、書込ブロックバッファ１３Ａに保持されたブロックデータを、メモリ部１２内の所定のアドレスに書き込む。
【０１９０】
さらに、バッファ制御部１１は、書込ブロックバッファ１３Ａを初期化する。この初期化では、Ｐ個のパケット終端位置の値を「０」に初期化するとともに、変数ｉを「０」に初期化する。また、書込バッファ部１３の格納位置を「０」に初期化する。これにより、格納位置がパケットデータ領域の先頭位置にセットされる。その後、バッファ制御部１１は、入力待ち状態（ステップ２０１）に遷移する。
【０１９１】
なお、以上で説明した書込動作において、ブロック書き込み１状態（ステップ２０３）またはブロック書き込み２状態（ステップ２０４）では、メモリ部１２に保持していたブロックデータを書き込む処理を行うが、メモリ部１２でのブロックの蓄積がなく、かつ、読出バッファ部１４にブロックの保持がない場合は、前記のようにメモリ部１２に書き込むのではなく、読出バッファ部１４に格納する処理を行ってもよい。これにより、入力されたパケットが蓄積されず出力される状況において、メモリ部１２への蓄積を省くことができるため、メモリ部１２での消費電力の削減が可能となる。
【０１９２】
［第３の実施の形態のブロック書込動作］
次に、図１０を参照して、前述した図９のブロック書き込み１状態（ステップ２０３）およびブロック書き込み２状態（ステップ２０４）において、書込ブロックバッファ１３Ａ内のブロックデータを、ブロックデータ単位で、メモリ部１２内の対応する区画へ書き込むブロック書込動作について説明する。図１０は、第３の実施の形態にかかるブロック書込動作を示す状態遷移図である。
【０１９３】
このブロック書込動作において、次のような制御変数が用いられる。
書込区画識別子は、前記キューごと設けられて、当該キューと対応する前記パケットデータを書き込む区画を特定するための識別子である。
書込区画内位置情報は、前記キューごと設けられて、当該キューの書込区画識別子で特定される区画内における書込開始ブロック位置を示す情報である。
アドレスは、書込区画内位置情報と対応する記憶場所を示す、メモリ部１２におけるアドレス値である。
変数Ｂは、区画内に設けられたブロックの全ブロック数である。
変数Ｋは、ブロック内の記憶領域の大きさを示すバイト数である。
【０１９４】
連結区画識別子は、前記区画ごと設けられて、当該区画に連結された区画を特定するための識別子である。
区画連結位置は、区画に対するパケットデータの書き込み処理中に、当該区画に対して新たな区画を連結をするための区画連結信号を出力するタイミングを特定するための、区画内における書込位置情報である。
変数Ｍは、メモリ部１２に設けられた区画の全区画数であり、書込区画識別子の最大値に相当する。
【０１９５】
［初期化状態］
パケットバッファ装置１０は、電源投入後、パケットの入力を開始する前に、初期化状態（ステップ２１０）に遷移して、初期化処理を実行する。また、パケットバッファ装置１０に正常な動作を維持することができない異常の発生をパケットバッファ装置１０自身が検出した場合や、外部からのリセット要求があった場合にも、初期化が行われる。
【０１９６】
バッファ制御部１１は、初期化状態（ステップ２１０）において、初期化が完了した時点で、パケットとキュー入力指示情報の入力を待つ、入力待ち状態（ステップ２１１）に遷移する。
【０１９７】
［入力待ち状態］
入力待ち状態（ステップ２１１）において、パケットとキュー入力指示情報の入力があった時点で、書込位置情報取得状態（ステップ２１２）に遷移する。前記入力がない間、バッファ制御部１１は、他の状態に遷移せずに、パケットの入力を待ち受ける入力待ち状態（ステップ２１１）に留まる。
【０１９８】
［書込位置情報取得状態］
書込位置情報取得状態（ステップ２１２）において、バッファ制御部１１は、書込位置情報保持部２１に対して、入力されたキュー入力指示情報に含まれるキュー識別子の値を出力し、パケットを蓄積するキューの、書込区画識別子（区画単位）と書込区画内位置情報（ブロック単位）の値を書込位置情報保持部２１から受け取って、アドレス算出状態（ステップ２１３）に遷移する。
【０１９９】
［アドレス算出状態］
アドレス算出状態（ステップ２１３）において、バッファ制御部１１は、書込区画識別子と書込区画内位置情報との値に基づいて、パケットデータをワード単位で書き込むときのメモリのアドレスを算出する。本実施の形態では、アドレス＝書込区画識別子値×Ｂ×Ｋ＋書込区画内位置情報値×Ｋ、で算出する。前記算出後、バッファ制御部１１は、ブロックデータ書き込み状態（ステップ２１４）に遷移する。
【０２００】
［ブロックデータ書き込み状態］
ブロックデータ書き込み状態（ステップ２１４）において、バッファ制御部１１は、算出されたアドレスと、書込ブロックバッファ１３Ａ内の１ブロック分のデータを、メモリ部１２に出力する。
これにより、メモリ部１２では、前記アドレスのメモリセルに１ブロックデータが保持される。前記出力後、以下の条件に応じて、書込区画内位置更新状態（ステップ２１５）、あるいは、連結区画情報取得状態（ステップ２１６）のいずれかに一方に遷移する。
【０２０１】
上記書込区画内位置更新状態（ステップ２１５）への遷移条件は、書込区画内位置が未満了の場合、すなわち、書き込み中の区画への書き込みを継続して行うことができる場合であり、本実施の形態では書込区画内位置情報値＜Ｂ−１が、前記条件となる。
なお、書込区画内位置情報は、書き込みを行う区画内のワードの番号にあたる。実施例では、区画先頭のブロックの番号を０としており、区画内のワード数はＢなので、区画最後のワードの番号はＢ−１になる。また、書込区画内位置が未満了とは、書込区画内位置情報値が区画最後のブロックより手前（区画先頭側にある）ということであり、書込区画内位置情報値＜Ｂ−１が、前記条件を表す式となる。
【０２０２】
一方、上記連結区画情報取得状態（ステップ２１６）への遷移条件は、書込区画内位置が満了の場合、すなわち、書込区画内位置が最大値を超えた場合であり、本実施の形態では書込区画内位置値≧Ｂ−１が、前記条件となる。なお、書込区画内位置値はＢ−１が最大値となり、書込区画内位置情報値＞Ｂ−１には通常ならない。
なお、区画先頭のワードの位置における書込区画内位置情報値を０と規定したとき、区画最後のブロックの位置における書込画内位置情報値はＢ−１となる。区画内のワード数はＢであり、書込区画内位置情報値が区画内のワードを指す場合には、書込区画内位置情報値がＢ以上となることや負の値をとることは発生しない。
【０２０３】
［書込区画内位置更新状態］
書込区画内位置更新状態（ステップ２１５）において、バッファ制御部１１は、書込区画内位置を書き込みを終えた位置から次の位置に更新する。本実施の形態では、書込区画内位置情報の値を＋１する。この後、書込位置情報更新状態（ステップ２１８）に遷移する。
【０２０４】
また、書込区画内位置更新状態（ステップ２１５）において、バッファ制御部１１は、書込区画内位置情報の値が、区画連結位置の値に一致したとき、区画連結信号を生成する。前記区画連結信号を契機として、後述する区画連結に関わる状態遷移の処理により、空き区画のリストから空き区画の１つを外して、書き込み中の区画に対して保持された連結区画識別子を前記空き区画を示す値とする区画連結が行われる。
【０２０５】
［連結区画情報取得状態］
連結区画情報取得状態（ステップ２１６）において、バッファ制御部１１は、連結区画情報保持部２３に対して、書込区画識別子の値を出力し、連結区画情報保持部２３から、書き込み中の区画に連結されている区画を特定する連結区画識別子の値を入力する。その後、書込区画情報更新状態（ステップ２１７）へ遷移する。なお、本実施の形態では、前記連結区画識別子値としてＭを入力した場合、連結されている区画がないことを意味する。
【０２０６】
［書込区画情報更新状態］
書込区画情報更新状態（ステップ２１７）において、バッファ制御部１１は、書込区画識別子の値を連結区画識別子の値に更新する。併せて、書込区画内位置の値を初期化する。本実施の形態では書込区画内位置の値を０に更新する。すなわち、書き込みを行う位置を、連結された区画の先頭位置に変更する。その後、書込位置情報更新状態（ステップ２１８）に遷移する。
【０２０７】
［書込位置情報更新状態］
書込位置情報更新状態（ステップ２１８）において、バッファ制御部１１は、入力されたキュー入力指示情報に含まれるキュー識別子の値と、更新された書込区画識別子と書込区画内位置情報の値とを、書込位置情報保持部２１に出力し、書込位置情報保持部２１が保持している値を更新する。すなわち、パケットデータのメモリ部１２への書き込みによって、書込区画識別子と書込区画内位置情報が更新されるが、これらの値を前記パケットデータの書き込みを完了した時点で、書込位置情報保持部２１での保持値に反映させ、入力待ち状態（ステップ２１１）に遷移する。
【０２０８】
［第３の実施の形態の読出動作］
次に、図１１参照して、本実施の形態にかかるパケットバッファ装置１０において、キュー出力指示情報の入力に応じて、指定されたキューのパケットデータを、メモリ部１２内の対応する区画から、ブロック単位で読み出して読出ブロックバッファ１４Ａへ格納した後、読出ブロックバッファ１４Ａから該当するパケットデータを読み出す際の読出動作について説明する。図１１は、第３の実施の形態にかかる読出動作を示す状態遷移図である。なお、読出動作のうち、ブロック読出状態（ステップ２２３）におけるブロック読出動作の詳細については、図１２を参照して後述する。
【０２０９】
この読出動作において、次のような制御変数が用いられる
データ保持有無は、読出ブロックバッファ１４Ａでのデータ保持あり／なしを示す変数である。
変数ｉは、１個のブロックデータ内に含まれるパケット末尾バイトの個数を計数するためのカウンタである。
変数Ｐは、１個のブロックデータ内に含みうるパケット数の最大値である。
パケット終端位置は、各パケットデータの末尾バイトの位置を示す変数であり、１個のブロックデータ内のパケットデータ領域の先頭バイトからのバイト数で表現される。
【０２１０】
格納位置は、パケットデータを１バイトずつ読出ブロックバッファ１４Ａ内のパケットデータ領域に格納するときの位置を指定する変数（バイトアドレス）である。
取得位置は、パケットデータを１バイトずつ読出ブロックバッファ１４Ａ内のパケットデータ領域から取得するときの位置を指定する変数（バイトアドレス）である。
パケットデータ継続フラグは、パケットデータパケットデータ領域を使い切っているか否かを示す変数である。
【０２１１】
［初期化状態］
パケットバッファ装置１０は、電源投入後、パケットの出力を開始する前に、初期化状態（ステップ２２０）に遷移して、初期化処理を実行する。また、パケットバッファ装置１０に正常な動作を維持することができない異常の発生をパケットバッファ装置１０自身が検出した場合や、外部からのリセット要求があった場合にも、初期化が行われる。
【０２１２】
初期化状態（ステップ２２０）において、バッファ制御部１１は、読出ブロックバッファ１４Ａを初期化する。この初期化処理において、バッファ制御部１１は、データ保持有無の値をデータ保持なしに初期化する。
【０２１３】
また、この初期化において、バッファ制御部１１は、Ｍ個のパケット終端位置の値を「０」に初期化するとともに、変数ｉの値を「０」に初期化する。また、バッファ制御部１１は、読出バッファ部１４の格納位置を初期化する。これにより、格納位置は、パケットデータ領域の先頭位置にセットされる。
バッファ制御部１１は、初期化状態（ステップ２２０）において、初期化が完了した時点で、キュー出力指示情報の入力を待つ、入力待ち状態（ステップ２２１）に遷移する。
【０２１４】
［入力待ち状態］
入力待ち状態（ステップ２２１）において、バッファ制御部１１は、キュー出力指示情報の入力があるまで、他の状態に遷移せずに、キュー出力指示情報の入力を待ち受ける入力待ち状態（ステップ２２１）に留まる。
また、入力待ち状態（ステップ２２１）において、キュー出力指示情報の入力があった時点で、前記データ保持有無がデータ保持ありを示す場合、すなわち「入力あり and データ保持あり」の場合、バッファ制御部１１は、データ取得状態（ステップ２２２）に遷移する。
【０２１５】
一方、入力待ち状態（ステップ２２１）において、キュー出力指示情報の入力があった時点で、前記データ保持有無がデータ保持なしを示す場合、すなわち「入力あり and データ保持なし」の場合、バッファ制御部１１は、ブロック読み出し状態（ステップ２２３）に遷移する。
【０２１６】
［データ取得状態］
データ取得状態（ステップ２２２）において、バッファ制御部１１は、読出ブロックバッファ１４Ａから、取得位置が示す位置から、パケットデータを１バイトずつ取得して出力し、併せて、前記取得位置を１バイトずつ後ろに移動させる。なお、パケットデータが１バイト単位で出力するのではなく、予め定められたバイト数単位で出力する場合には、前記バイト数単位で格納と格納位置の移動を行う。
【０２１７】
また、データ取得状態（ステップ２２２）において、バッファ制御部１１は、パケット継続／終了と、残データあり／なし、すなわち読出ブロックバッファ１４Ａ内に取得前のパケットデータがあるか／ないかとを判定する。
この際、前記パケット終了は、読出ブロックバッファ１４Ａに格納されたパケット終端位置＃ｉが示す位置に前記取得位置が達したこと、すなわち、取得中のパケットデータの末尾バイトまで取得を終えたことを条件として判定する。なお、変数ｉは、読出ブロックバッファ１４Ａに含まれるＰ個のパケット終端位置のうち、取得対象のパケットに対するパケット終端位置を特定する変数としても用いられる。
【０２１８】
また、パケット継続は、前記パケット終了の条件を満たさないことを条件として判定する。この際、パケット終端位置＃ｉの値が「０」の場合あるいはｉ＞Ｐの場合は、取得中のパケットの末尾バイトを読出ブロックバッファ１４Ａに含まれず後続ブロックに含まれることを意味するため、前記判定はパケット継続となる。
一方、前記残データありは、前記取得位置がパケットデータ領域の最終バイト位置に達していないことであり、残データなしの条件は、前記残データありの条件を満たさないことを条件として判定する。
【０２１９】
また、データ取得状態（ステップ２２２）において、パケットデータの最終バイトまでデータを取得し終えた場合、すなわち「パケット終了」時、バッファ制御部１１は、前記データ保持有無の値を、以下に示す判定に基づいて更新し、その後、入力待ち状態（ステップ２２１）に遷移する。
【０２２０】
バッファ制御部１１は、上記判定において、まず、前記取得位置がパケットデータ領域の最終バイト位置に達した場合、データ保持有無の値を保持なしと設定する。
一方、前記取得位置がパケットデータ領域の最終バイト位置に達していない場合は、バッファ制御部１１は、変数ｉの値に「１」を加算する。
【０２２１】
この際、変数ｉの更新後に、読出ブロックバッファ１４Ａに格納されたパケット終端位置＃ｉの値が「０」の場合あるいはｉ＞Ｐであり、かつ、パケットデータ継続フラグの値が「１」の場合、すなわち、「（ｉ＞Ｐ）or パケット終端位置[ｉ]==０）and パケットデータ継続フラグ==１」の場合、バッファ制御部１１は、データ保持有無の値を保持ありと設定する。
【０２２２】
一方、前記パケット終端位置＃ｉの値が「０」の場合あるいはｉ＞Ｐであり、かつ、パケットデータ継続フラグの値が「０」の場合、すなわち、「（ｉ＞Ｐ）or パケット終端位置[ｉ]==０）and パケットデータ継続フラグ==０」の場合、バッファ制御部１１は、データ保持有無の値を保持なしと設定する。
また、前記以外、すなわち、前記パケット終端位置＃ｉの値が「０」以外、かつ、ｉ≦Ｐの場合、バッファ制御部１１は、データ保持有無の値を保持ありと設定する。
【０２２３】
また、データ取得状態（ステップ２２２）において、パケット継続であり、かつ、残データなしの場合、すなわち「パケット継続 and 残データなし」時、バッファ制御部１１は、メモリ部１２が蓄積するブロックを読み出し、読出ブロックバッファ１４Ａに格納する、ブロック読み出し状態（ステップ２２３）に遷移する。
【０２２４】
一方、データ取得状態（ステップ２２２）において、パケット継続であり、かつ、残データありの場合、すなわち「パケット継続 and 残データあり」時、バッファ制御部１１は、データ取得状態（ステップ２２２）に留まって、読出ブロックバッファ１４Ａからパケットデータを取得して出力する。
【０２２５】
［ブロック読み出し状態］
ブロック読み出し状態（ステップ２２３）において、バッファ制御部１１は、メモリ部１２の所定アドレスから１個のブロックデータを読み出して、読出ブロックバッファ１４Ａに前記ブロックデータを格納する。また、バッファ制御部１１は、前記取得位置の値を、読出ブロックバッファ１４Ａ内のパケットデータ領域の先頭位置を示す値に初期化するとともに、前記データ保持有無の値を保持ありに初期化し、さらに、変数ｉの値を「１」に初期化する。
【０２２６】
［第３の実施の形態のブロック読出動作］
次に、図１２を参照して、前述した図１１のブロック読み出し状態（ステップ２２３）において、メモリ部１２内の対応する区画から、ブロックデータを読み出して、読出ブロックバッファ１４Ａへ格納するブロック読出動作について説明する。図１２は、第３の実施の形態にかかるブロック読出動作を示す状態遷移図である。
【０２２７】
このブロック読出動作において、次のような制御変数が用いられる。
読出区画識別子は、前記キューごと設けられて、当該キューと対応する前記パケットデータを読み出す区画を特定するための識別子である。
読出区画内位置情報は、前記キューごと設けられて、当該キューの読出区画識別子で特定される区画内における読出開始ブロック位置を示す情報である。
アドレスは、読出区画内位置情報と対応する記憶場所を示す、メモリ部１２におけるアドレス値である。
【０２２８】
変数Ｂは、区画内に設けられたブロックの全ブロック数である。
変数Ｋは、ブロック内の記憶領域の大きさを示すバイト数である。
連結区画識別子は、前記区画ごと設けられて、当該区画に連結された区画を特定するための識別子である。
【０２２９】
［初期化状態］
パケットバッファ装置１０は、電源投入後、パケットの出力を開始する前に、初期化状態（ステップ２３０）に遷移して、初期化処理を実行する。また、パケットバッファ装置１０に正常な動作を維持することができない異常の発生をパケットバッファ装置１０自身が検出した場合や、外部からのリセット要求があった場合にも、初期化が行われる。
バッファ制御部１１は、初期化状態（ステップ２３０）において、初期化が完了した時点で、パケットとキュー入力指示情報の入力を待つ、入力待ち状態（ステップ２３１）に遷移する。
【０２３０】
［入力待ち状態］
入力待ち状態（ステップ２３１）において、バッファ制御部１１は、キュー出力指示情報の入力があった時点で、読出位置情報取得状態（ステップ２３２）に遷移する。前記入力がない間は、他の状態に遷移せずに、キュー出力指示情報の入力を待ち受ける入力待ち状態（ステップ２３１）に留まる。
【０２３１】
［読出位置情報取得状態］
読出位置情報取得状態（ステップ２３２）において、バッファ制御部１１は、読出位置情報保持部２２に対して、入力されたキュー出力指示情報に含まれるキュー識別子の値を出力し、パケットを蓄積するキューの、読出区画識別子と読出区画内位置情報の値を読出位置情報保持部２２から受け取って、アドレス算出状態（ステップ２３３）に遷移する。
【０２３２】
［アドレス算出状態］
アドレス算出状態（ステップ２３３）では、読出区画識別子と読出位置情報との値に基づいて、パケットのデータをワード単位で書き込むときのメモリのアドレスを算出する。本実施の形態では、アドレス＝読出区画識別子値×Ｂ×Ｋ＋読出位置情報値×Ｋ、で算出する。前記算出後、ブロックデータ読み出し状態（ステップ２３４）に遷移する。
【０２３３】
［ブロックデータ読み出し状態］
ブロックデータ読み出し状態（ステップ２３４）において、バッファ制御部１１は、算出されたアドレスをメモリ部１２に出力し、前記アドレスに対応するメモリ部１２内のメモリセルに保持された１ブロック分のデータをメモリ部１２から読み出す。前記読み出し後、以下の条件に応じて、読出区画内位置更新状態（ステップ２３５）、あるいは、連結区画情報取得状態（ステップ２３６）のいずれかに一方に遷移する。
【０２３４】
上記読出区画内位置更新状態（ステップ２３５）への遷移条件は、読出区画内位置が未満了の場合、すなわち、読み出し中の区画からの読み出しを継続して行うことができる場合であり、本実施の形態では読出区画内位置情報値＜Ｂ−１が、前記条件となる。なお、読出区画内位置情報は、読み出しを行う区画内のブロックの番号にあたる。本実施の形態では、区画先頭のブロックの番号を０としており、区画内のブロック数はＢなので、区画最後のブロックの番号はＢ−１になる。また、読出区画内位置が未満了とは、読出区画内位置情報値が区画最後のブロックより手前（区画先頭側にある）ということであり、読出区画内位置情報値＜Ｂ−１が、前記条件を表す式となる。
【０２３５】
一方、上記連結区画情報取得状態（ステップ２３６）への遷移条件は、読出区画内位置が満了の場合、すなわち、読出区画内位置が最大値を超えた場合であり、本実施の形態では、読出区画内位置情報値≧Ｂ−１が、前記条件となる。なお、読出区画内位置情報値はＢ−１が最大値となり、読出区画内位置情報値＞Ｂ−１には通常ならない。なお、区画先頭のブロックの位置における読出区画内位置情報値を０と規定したとき、区画最後のブロックの位置における読出画内位置情報値はＢ−１となる。区画内のブロック数はＢであり、読出区画内位置情報値が区画内のブロックを指す場合には、読出区画内位置情報値がＢ以上となることや負の値をとることは発生しない。
【０２３６】
前記異常値を発生させないようにするための方法は、読出区画内位置情報値を監視しておき、値に異常が生じた場合に、装置異常等の処理（リセットなど）を行うことである。また、読出区画内位置情報値を表現する全ビットが１となるとき、読出区画内位置情報値＝Ｂ−１であるように、Ｂの値を決める（Ｂを２のべき乗とすることで可能）ことで、異常値は発生しなくなる。これは、読出区画内位置情報値としてどのような値をとったとしても正常範囲に入るためである。また、読出区画内位置情報値がＢ−１となるときは、読出位置が区画最後のブロックに到達したことを意味する。
【０２３７】
［読出区画内位置更新状態］
読出区画内位置更新状態（ステップ２３５）において、バッファ制御部１１は、読出区画内位置を読み出しを終えた位置から次の位置に更新する。本実施の形態で読出区画内位置の値を＋１する。その後、読出位置情報更新状態（ステップ２３７）に遷移する。
【０２３８】
［連結区画情報取得状態］
連結区画情報取得状態（ステップ２３６）において、バッファ制御部１１は、連結区画情報保持部２３に対して、読出区画識別子の値を出力し、連結区画情報保持部２３から、読み出し中の区画に連結されている区画を特定する連結区画識別子の値を受け取って、読出区画情報更新状態（ステップ２３８）に遷移する。
また、連結区画情報取得状態（ステップ２３６）において、バッファ制御部１１は、区画解放信号を生成する。前記区画解放信号を契機として、後述する区画解放に関わる状態遷移の処理により区画を空き区画のリストに戻す区画解放が行われる。
【０２３９】
［読出区画情報更新状態］
読出区画情報更新状態（ステップ２３８）において、バッファ制御部１１は、読出区画識別子の値を連結区画識別子の値に更新する。併せて、読出区画内位置の値を初期化する。本実施の形態では読出区画内位置の値を０に更新する。すなわち、読み出しを行う位置を、連結された区画の先頭位置に変更する。この後、読出位置情報更新状態（ステップ２３７）へ遷移する。
【０２４０】
［読出位置情報更新状態］
読出位置情報更新状態（ステップ２３７）において、バッファ制御部１１は、バッファ制御部１１は、読出位置情報保持部２２に対して、入力されたキュー出力指示情報に含まれるキュー識別子の値と、更新された読出区画識別子と読出区画内位置情報の値とを、読出位置情報保持部２２に出力し、読出位置情報保持部２２が保持している値を更新する。すなわち、ブロックデータをメモリ部１２から読み出すことによって、読出区画識別子と読出区画内位置情報が更新されるが、これらの値を前記ブロックデータの読み出しを完了した時点で、読出位置情報保持部２２での保持値に反映させ、入力待ち状態（ステップ２３１）に遷移する。
【０２４１】
［第３の実施の形態の区画連結動作］
次に、図１３を参照して、本実施の形態にかかるパケットバッファ装置１０の区画連結動作について説明する。図１３は、区画連結動作を示す状態遷移図である。前述した図１０の書込区画内位置更新状態（ステップ２１５）において、区画連結信号が生成された場合、バッファ制御部１１は、図１３の状態遷移に基づいて、区画連結動作を実行する。
【０２４２】
［初期化状態］
パケットバッファ装置１０は、電源投入後、パケットの出力を開始する前に、初期化状態（ステップ２４０）に遷移して、初期化処理を実行する。また、パケットバッファ装置１０に正常な動作を維持することができない異常の発生をパケットバッファ装置１０自身が検出した場合や、外部からのリセット要求があった場合にも、初期化が行われる。
【０２４３】
初期化状態（ステップ２４０）において、バッファ制御部１１は、連結区画情報保持部２３と空き区画情報保持部２４に対して、全区画を空き区画リストに加える初期化を行う。本実施の形態では、空き区画情報保持部２４に空き区画連結開始識別子の値として「０」を、空き区画連結終了識別子の値としてＭ−１を出力することで、空き区画情報保持部２４が保持する空き区画連結開始識別子と空き区画連結終了識別子を初期化する。
【０２４４】
さらに、バッファ制御部１１は、連結区画情報保持部２３に、全区画識別子について、連結区画識別子の値として前記区画識別子＋１を出力することで、連結区画情報保持部２３が保持する各区画識別子（０〜Ｍ−１）に対する連結区画識別子［ｍ］（ｍ＝０〜Ｍ−１）の値を初期化する。
バッファ制御部１１は、初期化状態（ステップ２４０）において、初期化が完了した時点で、区画連結信号を待つ、区画連結信号待ち状態（ステップ２４１）に遷移する。
【０２４５】
［区画連結信号待ち状態］
区画連結信号待ち状態（ステップ２４１）において、バッファ制御部１１は、区画連結信号があった時点で、空き区画情報取得状態（ステップ２４２）に遷移する。前記信号がない間は遷移しない。なお、区画連結信号があった時点での、バッファ制御部１１のパケットデータ書込の対象となっている区画を特定する書込区画識別子の値を保持しておく。
【０２４６】
［空き区画情報取得状態］
空き区画情報取得状態（ステップ２４２）において、バッファ制御部１１は、空き区画情報保持部２４から、空き区画連結開始識別子の値を入力する。前記入力後、以下の条件に応じて、未連結状態（ステップ２４３）、あるいは、空き区画取得状態（ステップ２４４）のいずれかに一方に遷移する。
【０２４７】
上記未連結状態（ステップ２４３）への遷移条件は空き区画なしの場合であり、本実施の形態では上記取得した空き区画連結開始識別子の値がＭの場合である。
一方、上記空き区画取得状態（ステップ２４４）への遷移条件は空き区画ありの場合であり、本実施の形態では、上記取得した空き区画連結開始識別子の値が有効な区画識別子の範囲（０からＭ−１までの整数）にある場合である。
【０２４８】
［空き区画取得状態］
空き区画取得状態（ステップ２４４）において、バッファ制御部１１は、連結区画情報保持部２３に対して、空き区画情報取得状態（ステップ２４２）で空き区画情報保持部２４から取得した空き区画連結開始識別子の値を区画識別子として出力し、連結区画情報保持部２３から、前記区画識別子に連結されている区画を特定する連結区画識別子の値を入力する。さらに、空き区画情報保持部２４に対して、空き区画連結開始識別子の値を、前記入力した連結区画識別子の値に更新する。
【０２４９】
なお、前記入力した連結区画識別子の値が、連結されている区画がないことを意味する連結区画識別子の値である場合は、さらに、空き区画情報保持部２４に対して、空き区画連結終了識別子の値を、連結されている区画がないことを意味する連結区画識別子の値に更新する。本実施の形態では、前記連結されている区画がないことを意味する連結区画識別子の値はＭである。その後、連結更新状態（ステップ２４５）に遷移する。これにより、空き区画のリストから１つの区画を取り外したことになる。
【０２５０】
［連結更新状態］
連結更新状態（ステップ２４５）において、バッファ制御部１１は、連結区画情報保持部２３に対して、区画連結信号があった時点で保持した書込区画識別子の値と、空き区画情報取得状態（ステップ２４２）で空き区画情報保持部２４から取得した空き区画連結開始識別子の値とを出力することで、前記書込区画の連結区画識別子の値を、前記空き区画連結開始識別子の値へと書き換える。
これにより、書込が満了を向える（書込区画内位置が満了する予定の）区画に、空き区画のリストから取り外した１つの区画を連結したことになる。その後、区画連結信号待ち状態（ステップ２４１）に遷移する。
【０２５１】
［未連結状態］
未連結状態（ステップ２４３）において、バッファ制御部１１は、連結区画情報保持部２３に対して、区画連結信号があった時点で保持した書込区画識別子の値と、連結されている区画がないことを意味する連結区画識別子の値を出力し、前記書込区画の連結区画識別子の値を、連結されている区画がないことを意味する連結区画識別子の値へと書き換え、区画連結信号待ち状態（ステップ２４１）に遷移する。本実施の形態では、前記連結されている区画がないことを意味する連結区画識別子の値はＭである。
【０２５２】
［第３の実施の形態の区画解放動作］
次に、図１４を参照して、本実施の形態にかかるパケットバッファ装置１０の区画解放動作について説明する。図１４は、区画解放動作を示す状態遷移図である。前述した図１２の連結区画情報取得状態（ステップ２３６）において、区画解放信号が生成された場合、バッファ制御部１１は、図１４の状態遷移に基づいて、区画解放動作を実行する。
【０２５３】
［初期化状態］
パケットバッファ装置１０は、電源投入後、パケットの出力を開始する前に、初期化状態（ステップ２５０）に遷移して、初期化処理を実行する。また、パケットバッファ装置１０に正常な動作を維持することができない異常の発生をパケットバッファ装置１０自身が検出した場合や、外部からのリセット要求があった場合にも、初期化が行われる。
バッファ制御部１１は、初期化状態（ステップ２５０）において、初期化が完了した時点で、区画解放信号を待つ、区画解放信号待ち状態（ステップ２５１）に遷移する。
【０２５４】
［区画解放信号待ち状態］
区画解放信号待ち状態（ステップ２５１）において、区画解放信号があった時点で、空き区画情報取得状態（ステップ２５２）に遷移する。前記信号がない間は遷移しない。なお、区画解放信号があった時点での、バッファ制御部１１のパケットデータ読出の対象となっている区画を特定する読出区画識別子の値を保持しておく。
【０２５５】
［空き区画情報取得状態］
空き区画情報取得状態（ステップ２５２）において、バッファ制御部１１は、空き区画情報保持部２４から、空き区画連結終了識別子の値を受け取って、空き区画返却状態（ステップ２５３）に遷移する。
【０２５６】
［空き区画返却状態］
空き区画返却状態（ステップ２５３）において、バッファ制御部１１は、連結区画情報保持部２３に対して、区画解放信号があった時点で保持した読出区画識別子の値と、連結されている区画がないことを意味する連結区画識別子の値を出力し、前記読出区画識別子の値によって特定される区画の連結区画識別子の値を、連結されている区画がないことを意味する連結区画識別子の値へと書き換える。本実施の形態では、前記連結されている区画がないことを意味する連結区画識別子の値はＭである。さらに、連結区画情報保持部２３に対して、空き区画情報取得状態（ステップ２５２）で入力した空き区画連結終了識別子の値と、区画解放信号があった時点で保持した読出区画識別子の値とを出力し、前記空き区画連結終了識別子によって特定される
【０２５７】
区画の連結区画識別子の値を、前記読出区画識別子の値へと書き換える。ただし、空き区画連結終了識別子の値が、連結されている区画がないことを意味する連結区画識別子の値であった場合は、前記書き換えを行わない。これらにより、読出が満了した区画を空き区画のリストの最後の区画に連結したことになる。前記の後、空き区画更新状態（ステップ２５４）に遷移する。
【０２５８】
［空き区画更新状態］
空き区画更新状態（ステップ２５４）では、バッファ制御部１１は、空き区画情報保持部２４に対して、空き区画連結終了識別子の値を、区画解放信号があった時点で保持した読出区画識別子の値に更新する。ただし、空き区画情報取得状態（ステップ２５２）で入力した空き区画連結終了識別子の値が、連結されている区画がないことを意味する連結区画識別子の値であった場合は、前記に加えて、空き区画情報保持部２４に対して、空き区画連結開始識別子の値を、区画解放信号があった時点で保持した読出区画識別子の値に更新する。その後、区画解放信号待ち状態（ステップ２５１）に遷移する。
【０２５９】
［第３の実施の形態の効果］
このように、本実施の形態は、第１の実施の形態において、複数個のブロックで区画を構成し、入力された各パケットのパケットデータを、指定されたキューと対応する区画内のブロックで蓄積するようにしたものである。
【０２６０】
より具体的には、前記バッファ制御部１１が、複数個の前記ブロックで構成された区画のうち、前記キュー入力指示情報で指定されたキューと対応する区画に対して、前記パケットデータを書き込むことにより、前記パケットデータを前記キューに蓄積し、前記メモリ部１２のうち、前記キュー出力指示情報で指定されたキューと対応する区画から、前記パケットデータの読み出すことにより、前記パケットデータを前記キューから取り出し、前記区画への前記パケットデータの書き込みが満了した場合、当該区画に対して空き区画を連結区画として連結した後、当該空き区画に対する前記パケットデータの書き込みを継続し、前記区画からの前記パケットデータの読み出しが満了した場合、当該区画を空き区画として解放するとともに、当該区画に連結されている連結区画からの前記パケットデータの読み出しを継続するようにしたものである。
【０２６１】
これにより、第１の実施の形態と同様に、入力パケット毎に生成されるパケット境界情報含む固定長のブロック管理情報が、パケットデータと連結して、メモリ部１２のキューに格納される。このため、本実施の形態にかかるパケットバッファ装置１０によれば、従来のような固定長のパケットジョブ（ジョブ情報）を蓄積するため、ＳＲＡＭからなるジョブ用メモリを、キューとは別個に設ける必要はない。したがって、蓄積するパケット数を増大させた場合でも、パケットを蓄積するデータ用メモリの増大に伴う余分な回路規模の増加を抑制することができる。
【０２６２】
これに加えて、特定のキューにパケットの蓄積が集中する場合に、そのキューがオーバーフローする前に区画の連結を行うとともに、パケットの蓄積が少ないキューに対しては、そのキューへの区画の連結を行わず、また、パケットの出力による蓄積量の減少に応じて区画を解放することになる。したがって、キューごとに必要な容量がばらついた場合や、蓄積量が時間経過に伴って変動した場合にも、各キューに対して容量の配分が適切に行われるので、従来技術を適用したパケットバッファ装置と比較して、メモリの必要容量を小さくすることができる。
【０２６３】
この効果を従来技術の説明で用いた例により説明する。本実施の形態では、パケットがキューに蓄積される過程で、既にキューに割り当てていたメモリ量のうち空きが少なくなってきたとき追加の割り当てを行う。例えば、メモリを６４ＫＢｙｔｅの容量を持つ区画に分割しておき、キューに割り当て済みの区画の空きが２ＫＢｙｔｅとなった時点で、新たな区画をそのキューに追加する場合、各キューに割り当て済みの区画に生じる空き容量の最大値は、新たな区画を割り当てる条件である２ＫＢｙｔｅ＋新たな１個の区画の容量である６４ＫＢｙｔｅであるため、６６ＫＢｙｔｅとなる。
【０２６４】
したがって、すべてのキューで前記空き容量が生じた状況が、最もメモリの使用率が低い状況であるため、蓄積に必要となる１２．５ＭＢｙｔｅに、前記空き容量の合計値６６ＫＢｙｔｅ×８を加えた値である１３ＭＢｙｔｅが、本実施の形態での必要なメモリ量となる。この例で示されるように、従来は１００ＭＢｙｔｅのメモリ量を必要としていたのに対して１３ＭＢｙｔｅで済むため、メモリ量を８７％削減することができるという効果が、本実施の形態にある。
【０２６５】
また、本実施の形態は、各キューに蓄積するパケットのデータを保持するメモリの領域を、区画が連結された仮想的なＦＩＦＯバッファとして管理するため、従来技術を適用したパケットバッファ装置と同じく、複雑なバッファ制御が不要である。
また、本実施の形態は、１つの区画内ではメモリにアクセスするときのアドレスを連続させることができ、従来技術を適用したパケットバッファ装置と同じく、メモリに対するバーストアクセスを可能とする。これにより、１つのキューからの出力が連続して行われるような用途で使用される場合、メモリからの読み出しを高速に行うことができるため、キューからのパケット取り出しが速い。
【０２６６】
メモリアクセスするときのアドレスを連続させることが可能であるのは、具体的には、メモリ部１２が複数の互いに重ならないアドレス範囲で区分けして、これらを各区画とすることによって行う。すなわち、各区画にアドレスの範囲を定めておくことにとって、ある区画にアクセスしたときのアドレスの次のアドレスが、前記区画に定められたアドレスの範囲内であれば、前記次のアドレスにアクセスすると、前記区画内のメモリ領域にアクセスしたことになるからである。
【０２６７】
また、本実施の形態は、区画内の書き込み位置に所定の位置に達したことを条件に次に書き込みを行う区画の連結を行うため、書き込み中の区画が満杯になる前に、次の区画を準備することができるため、区画をまたぐ書き込みを行う場合にも、書き込みが途切れず、キューへのパケット蓄積が速い。
【０２６８】
なお、パケット読出の高速化や効率的なメモリ使用を実現可能なメモリ区画のサイズ範囲は、バッファに入出力するパケットのバースト長やパケット長の最大値や平均値によって異なる。
各区画の大きさをｍとし、入力されたパケットが連続して蓄積されるときの最大蓄積データ量（＝バースト長）をＬｂとし、キューがデータ量Ｌｂを蓄積するとき、Ｌｂ／ｍ個の区画が使用される。
【０２６９】
したがって、Ｌｂ／ｍの値が小さくなるようｍの値を大きくすると、必要となる区画数が減るため区画を連結するための回路規模を削減できる一方で、キューに割り当て済の区画のうち、データを記憶していない空き領域の平均量（ｍ／２）が大きくなるためメモリの蓄積率Ｒｓ＝１−ｍ／（２×Ｌｂ）が低下する。
【０２７０】
また、ｍの値を小さくすると区画の連結処理や解放処理の回数が増大するため、処理量の増大によって消費電力の増加や、パケットの入出力速度の低下を招く可能性がある。また、データの書き込み／読み出しを行っている途中で区画が変わるため、ＤＤＲ−ＳＤＲＡＭなどのようなメモリを用いる場合は、メモリへのアクセスが中断されて、メモリのアクセス帯域の利用効率が低下する。特に、ｍの値が平均パケット長Ｌｐ以下になると、パケット途中での区画切り替えの確率Ｐｃ＝Ｌｐ／ｍが１以上となるため、各パケットの読み出しや書き込みを行う途中で区画が切り替わりが発生し、問題が深刻化する。
【０２７１】
このため、実用的なｍの範囲は、Ｌｂ，Ｌｐ，Ｒｓ，Ｐｃが与えられたとき、Ｌｐ／Ｐｃ≦ｍ≦２×Ｒｓ×Ｌｂで示される範囲となり、ｍは前記範囲内で大きい値をとる方が回路規模や消費電力が小さくなる。例えば、Ｂｂ＝１ＭＢｙｔｅ，Ｌｐ＝７５０ｂｙｔｅ，Ｒｓ＝０．０５，Ｐｃ＝０．１とすると、７．５Ｋｂｙｔｅ≦ｍ≦１００Ｋｂｙｔｅとなり、区画は１００Ｋｂｙｔｅが望ましい。
なお、Ｌｂ，Ｌｐ，Ｒｓ，Ｐｃの与えられ方によっては、実用的な範囲のｍが存在しないこともあるが、この場合は、本発明が有効ではなく従来構成を採用した方がよいと判断できる。
【０２７２】
また、キューごとに、平均パケット長やバースト長が異なる場合があるが、このような場合は、各キューについて、適切な区画の大きさの範囲を得たとき、これらの範囲をすべて満たす値の範囲のうち最大値を区画の大きさとして採用すればよい。このようにすることで、全てのキューに対して適切な範囲でｍを定めることができる。
【０２７３】
さらに、キューによって平均パケット長やバースト長が大きく異なるために上記ｍが存在しないような場合には、メモリ領域を、区画サイズｍ１でＭ１個に区画化した領域Ａ１、区画サイズｍ２でＭ２個に区画化した領域Ａ２、…、区画サイズｍｋでＭｋ個に区画化した領域Ａｋに区分し、各キューを、区画サイズが適切な範囲にある前記区分Ａ１〜Ａｋの何れか１つに所属させる。各キューへのパケットの蓄積にあたっては、前記キューが所属する区分内の区画を利用して、前記パケットを蓄積する。各区分内での区画の連結や解放の処理は、既に説明したとおりである。
【０２７４】
なお、各区分に割り当てるメモリ量は、その区分に所属するキューのバースト長の合計値以下で、統計多重効果（同時に各キューが最大長になる確率が低いためにキュー長の合計値が最大長の合計値より小さくなる効果）を考慮した値に設定すればよい。
【０２７５】
［実施の形態の拡張］
以上、実施形態を参照して本発明を説明したが、本発明は上記実施形態に限定されるものではない。本発明の構成や詳細には、本発明のスコープ内で当業者が理解しうる様々な変更をすることができる。また、各実施形態については、矛盾しない範囲で任意に組み合わせて実施することができる。
【符号の説明】
【０２７６】
１０…パケットバッファ装置、１１…バッファ制御部、１２…メモリ部、１３…書込バッファ部、１３Ａ…書込ブロックバッファ、１４…読出バッファ部、１４Ａ…読出ブロックバッファ、２１…書込位置情報保持部、２２…読出位置情報保持部、２３…連結区画情報保持部、２４…空き区画情報保持部。
【図１】
0005748288.tif 000002
【図２】
0005748288.tif 000003
【図３】
0005748288.tif 000004
【図４】
0005748288.tif 000005
【図５】
0005748288.tif 000006
【図６】
0005748288.tif 000007
【図７】
0005748288.tif 000008
【図８】
0005748288.tif 000009
【図９】
0005748288.tif 000010
【図１０】
0005748288.tif 000011
【図１１】
0005748288.tif 000012
【図１２】
0005748288.tif 000013
【図１３】
0005748288.tif 000014
【図１４】
0005748288.tif 000015
【図１５】
0005748288.tif 000016
【図１６】
0005748288.tif 000017