【文献】
高野光司、外1名,信号の状態変化・状態遷移に基づいたハードウエアデザイン検証手法,第18回 回路とシステム軽井沢ワークショップ 論文集,電子情報通信学会システムと信号処理サブソサイエティ、電子情報通信学会非線形理論とその応用サブソサイエティ,2005年 4月26日,pp.563〜568
(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0010】
以下に添付図面を参照して、本発明にかかるイベント計数装置、およびイベント計数方法の実施の形態を詳細に説明する。
【0011】
図1は、本発明にかかるイベント計数装置の一例を示す説明図である。イベント計数装置100は、観測対象の回路121において発生するイベントの発生回数を数える。観測対象の回路121とは、例えば、CPU(Central Processing Unit)やDSP(Digital Signal Processor)などのハードウェア回路である。イベント計数装置100は、例えば、観測対象の回路121に接続されて利用される。イベント計数装置100は、例えば、観測対象の回路121のデバッグ時に利用される。例えば、利用者が、イベントの発生回数の傾向などを把握することにより、ソフトウェアのハードウェア化やハードウェアのソフトウェア化などを検討するための指針となる情報を採取することができる。
【0012】
従来、ハードウェア回路の特定のイベントが観測対象の回路121内で発生した回数を数える場合、ハードウェア回路は高速に動作するため、イベントの発生回数を数える回路も高速に動作させなければならない。例えば、ハードウェア回路の動作速度が100[MHz]であれば、最大1秒間に1億回、信号線の値が変化する。しかしながら、観測するイベントの数が多いと、イベントの発生回数を数える回路が複雑となり、イベントの発生回数を高速に数えることが困難となる場合がある。例えば、観測したいイベントを利用者が選択できるようにすると、イベントの発生回数を数える回路が複雑となるため、イベントの発生回数を高速に数えることができない。
【0013】
また、例えば、観測対象の回路121の動作速度を遅くさせることにより、発生回数を数える方法もあるが、観測対象の回路121の動作速度が実際の動作速度と異なると、観測対象の回路121の挙動が変化する可能性がある。観測対象の回路121の挙動が変化した場合、観測したい希望の動作を観測できない可能性がある。
【0014】
本実施の形態では、イベント計数装置100は、イベント発生回数の記憶領域のアドレスを管理する2分探索木からイベントデータのノード探索中に新たにイベントデータを受けると、探索を中断する。記憶領域のアドレスは、記憶領域を区別するために領域ごとに付された番地である。そして、イベント計数装置100は、中断時のノードに応じたアドレスが示す記憶領域の発生回数を更新する。これにより、観測対象のハードウェア回路の動作速度への影響に支障を与えることなく、イベントの発生回数を確実に計数しつつ観測対象のハードウェア回路を高速に動作させることができる。
【0015】
また、中断しない場合やすべてのイベントデータを数える回路によって計数した場合などと比較して、イベントデータの精度は低下するが、イベントの発生回数を高速に計数することができる。イベントの発生が少ないような処理速度に余裕がある場合には、より多くの情報を記憶し、イベントの発生が多いような処理速度に余裕がない場合には、情報を省略して記録することができる。メモリアクセスを例に挙げると、イベントの発生が多いような場合とは、例えば、外部からの割り込みイベントなどの発生によりメモリアクセスが集中する場合である。このように、同じイベントが常時発生するわけではないため、イベントの発生回数の傾向を把握することは可能である。
【0016】
イベント計数装置100は、第1記憶部111と、第2記憶部112と、受け付け部101と、探索部102と、更新部103と、を有する。
【0017】
第1記憶部111は、観測対象の回路121に含まれる各信号線を流れる各信号値を組み合わせた値の各々に応じた組み合わせた値の発生回数を記憶する。組み合わせた値は、例えば、イベントデータとも称する。回路121に含まれる各信号線は、例えば、計数したい回路121の所望のイベントに応じた信号線である。
【0018】
第2記憶部112は、組み合わせた値または組み合わせた値の一部に対応する各ノードの各々の値に、第1記憶部111のうち、値に対応する組み合わせた値に応じた発生回数を記憶する領域を示す情報を関連付ける2分探索木の構造のデータを記憶する。領域を示す情報とは、例えば、領域を示すアドレスである。
【0019】
受け付け部101は、観測対象の回路121の動作中に各信号線を流れる各信号値の変化に応じて、各信号線を流れる各信号値を組み合わせた値を順次受け付ける。受け付け部101は、例えば、各信号線を流れる各信号値が変化した場合に、各信号線を流れる各信号値を組み合わせた値を受け付ける。また、受け付け部101は、例えば、各信号線を流れる各信号値を常時受け付けて、受け付けた各信号値が変化した場合に、各信号値を組み合わせた値を受け付けてもよい。
【0020】
探索部102は、2分探索木から、値が受け付け部101によって受け付けられた組み合わせた値に対応するノードを探索し、探索したノードの値に関連付けられた情報を出力する。
【0021】
更新部103は、探索部102によって出力された情報が示す第1記憶部111のうちの領域に記憶された発生回数を更新する。具体的に、更新部103は、例えば、記憶された発生回数に1加算した発生回数を探索部102によって出力された情報が示す第1記憶部111のうちの領域に格納する。
【0022】
ここで、探索部102は、受け付け部101によって受け付けられた組み合わせた値に対応するノードの探索中に、受け付け部101によって新たな組み合わせた値が受け付けられると、ノードの探索を中断する。そして、探索部102は、2分探索木のうち中断時において検出したノードの値に関連付けて記憶された情報を出力し、2分探索木から第2の組み合わせた値に対応するノードを探索する。中断時において検出したノードとは、中断時の着目ノードである。
【0023】
図2は、探索および更新処理の一例を示す説明図である。受け付け部101は、第1の組み合わせた値を受け付ける。第1の組み合わせた値は、「1001」である。探索部102は、例えば、値が第1の組み合わせた値に対応するノードを探索する。具体的に、探索部102は、例えば、ルートノードから順に着目ノードとし、着目ノードの値と第1の組み合わせた値とが一致するか否かによって順に探索する。第1の組み合わせた値が「1001」であるため、探索部102は、ルートノードのつぎに着目ノードをノード−1にする。
【0024】
探索部102は、例えば、ノード−1のつぎに着目ノードをノード−10にする。そして、受け付け部101は、第2の組み合わせた値を受け付ける。そのため、探索部102は、例えば、ノード−10において第1の組み合わせた値に対応するノードの探索を中断する。そして、探索部102は、着目ノードであるノード−10の値に関連付けられたアドレス「0004」を出力する。
【0025】
更新部103は、第1記憶部111のうち、アドレス「0004」が示す領域に格納された発生回数を更新する。具体的に、更新部103は、発生回数を1加算することにより発生回数を更新する。
図2の例では、アドレス「0004」が示す領域に格納された発生回数が2から3に更新される。
【0026】
これにより、イベントの発生回数を高速に数えることができる。
【0027】
(イベント計数装置100の全体例)
図3は、イベント計数装置の全体例を示す説明図である。イベント計数装置100は、イベント符号化回路301と、イベントフィルタ回路302と、イベント圧縮回路303と、圧縮イベントキュー回路304と、を有する。また、イベント計数装置100は、2分探索木回路306と、カウンタ値テーブル回路307と、データストア回路305と、レポート生成部308と、を有する。
【0028】
各回路は、論理積回路であるAND、否定論理回路であるINVERTER、論理和回路であるORや、ラッチ回路であるFF(Flip Flop)などの素子によって形成されてもよい。また、各回路は、スタンダードセルやストラクチャードASIC(Application Specific Integrated Circuit)などの特定用途向けIC(以下、単に「ASIC」と称す。)やFPGA(Field Programmable Gate Array)などのPLD(Programmable Logic Device)によって実現されてもよい。具体的には、例えば、上述した各部の機能をハードウェア記述言語などによってネットリストに機能定義し、そのネットリストを論理合成してASICやPLDに与えることにより、各部を実現してもよい。
【0029】
また、各回路は、理解の容易化のために、機能別となっているが、実際には、各回路の構成要素が共有される場合もある。
【0030】
ここで、受け付け部101は、イベント符号化回路301と、イベントフィルタ回路302と、イベント圧縮回路303と、圧縮イベントキュー回路304と、によって実現される。第2記憶部112と探索部102とは、例えば、2分探索木回路306とデータストア回路305とによって実現される。第1記憶部111と更新部103とは、カウンタ値テーブル回路307とデータストア回路305とによって実現される。出力部は、例えば、レポート生成部308によって実現される。
【0031】
また、レポート生成部308は、出力部であり、図示省略するが、イベント計数装置100を有するPC(Personal Computer)などのCPUによって実現されてもよい。例えば、レポート生成部308の処理は、図示省略するが、CPUがアクセス可能なROM(Read Only Memory)、RAM(Random Access Memory)、ディスクなどの記憶装置に記憶されたプログラムにコーディングされる。そして、CPUが記憶装置から該プログラムを読み出して、プログラムにコーディングされる処理を実行する。これにより、レポート生成部308の処理が実現される。また、レポート生成部308の処理結果は、例えば、RAM、ROM、ディスクなどの記憶装置に記憶される。
【0032】
イベント符号化回路301は、観測対象の回路121の動作中に各信号線を流れる各信号値の変化に応じて、各信号線を流れる各信号値を取得する。そして、イベント符号化回路301は、イベントに応じて、取得した各信号値を組み合わせた値を生成する。ここで、組み合わせた値は、例えば、イベントデータとも称する。具体的に、イベント符号化回路301は、観測対象の回路121においてイベントが発生すると、イベントの種類に応じて符号化を行うことにより、イベントデータを生成する。イベント符号化回路301は、例えば、観測対象の回路121から、メモリ(RAM)の書き込みや読み出しの指示、PC(Program Counter)の値、アドレス値、データ、演算指示、演算結果などの各種データを受け付ける。
【0033】
図4は、符号化時に付加される情報の一種であるTYPEの値例を示す説明図である。イベント符号化回路301は、イベントデータ内に、イベントの種類を示すTYPEを設定する。
【0034】
図4の例では、TYPEの値が「0」であれば、メモリ書き込みのイベントデータであることを示す。
図4の例では、TYPEの値が「1」であれば、メモリ読み出しのイベントデータであることを示す。
図4の例では、TYPEの値が「2」であれば、レジスタ移動のイベントデータであることを示す。
図4の例では、TYPEの値が「3」であれば、加算のイベントデータであることを示す。例えば、TYPEの値が「15」であれば、CPUの動作停止のイベントデータであることを示す。
【0035】
このように、TYPEの値によってイベントデータの種類を判別することが可能となる。
【0036】
従来のパフォーマンス監視ユニットなどは、実際に流通する製品などに搭載されるものを想定しているため、監視するイベントの種類数が少ない。これに対して、デバッグ時にイベントの発生回数を計数する場合、デバッグの容易化を図るためには、監視するイベントの種類数は多いとよい。しかし、イベントの種類数が多いと、イベントのイベントデータごとに発生回数を計数するため、発生回数を記憶するメモリの使用量が増大する。また、従来のパフォーマンス監視ユニットなどは、観測可能なイベントが固定であり、観測対象の信号を変更することが困難である。
【0037】
そこで、本実施の形態では、イベントフィルタ回路302が、各信号値のうち、利用者の操作により指定された信号値を選択して、指定された信号値を組み合わせた値を受け付ける。これにより、メモリ容量の増大を抑制することができる。また、利用者が、集計結果を見て、情報が少ないと思う場合、観測したいイベントのイベントデータだけに絞ってイベントデータを集計するように指定することが可能となる。
【0038】
イベントフィルタ回路302は、観測対象の回路121の複数のイベントの各々について各信号線を流れる各信号値を組み合わせた値を生成する。そして、イベントフィルタ回路302は、生成した組み合わせた値のうち、複数のイベントのうち指定されたイベントに応じた組み合わせた値を受け付ける受け付け部101である。
【0039】
具体的に、イベントフィルタ回路302は、例えば、イベント符号化回路301から出力されたイベントデータのうち、所望のイベントに対応するイベントデータを出力する。例えば、メモリアクセスのイベントについてのイベントの発生回数について集計する場合、イベントフィルタ回路302は、例えば、TYPEの値が「0」または「1」のイベントデータを出力する。一方、イベントフィルタ回路302は、TYPEの値が「0」または「1」以外のイベントデータを出力しない。
【0040】
図5は、符号化およびイベントフィルタ例1を示す説明図である。イベント符号化回路301は、メモリ書き込みの場合にTYPEの値を「0」にし、TYPE、PC、AD、DATAの順に並べたイベントデータを生成する。PCは、プログラムカウンタの値であり、ADはメモリアドレスであり、DATAは書き込みデータである。そして、イベントフィルタ回路302は、TYPEの値が「0」であるため、受け付けたイベントデータを出力する。
【0041】
図6は、符号化およびイベントフィルタ例2を示す説明図である。イベント符号化回路301は、加算の場合にTYPEの値を「3」にし、TYPE、加算結果の順に並べたイベントデータを生成する。そして、イベントフィルタ回路302は、TYPEの値が「3」であるため、受け付けたイベントデータを出力しない。
【0042】
図7は、イベントフィルタ回路例を示す説明図である。具体的に、イベントフィルタ回路302は、例えば、比較回路700と、レジスタ701と、を有する。レジスタ701は、利用者によって指定可能なコンフィギュレーションデータを記憶する。利用者は、コンフィギュレーションデータによってフィルタ条件が設定可能である。
【0043】
比較回路700は、例えば、コンフィギュレーションデータに応じたフィルタ条件に対応するAND回路によってイベントデータをマスクして0になった場合には出力しないとしてもよい。
【0044】
また、比較回路700は、例えば、フィルタ条件にイベントデータがマッチした場合に信号matchの値を「1」にする。例えば、イベントフィルタ回路302の後段にあるイベント圧縮回路303は信号matchの値が「1」の場合に動作しないというようにしてもよい。ここでのマッチするとは、所望のイベントでない場合である。また、比較回路700は、フィルタ条件にイベントデータがマッチしない場合に信号matchの値を「0」にしてもよい。例えば、イベントフィルタ回路302の後段にあるイベント圧縮回路303は信号matchの値が「0」の場合に動作しないというようにしてもよい。ここでのマッチしないとは、所望のイベントの場合である。
【0045】
このように、所望のイベントに応じたイベントデータを選択して出力する。これにより、所望のイベント以外のイベントの発生回数をカウントしなくてよいため、発生回数を記憶するためのメモリの使用量の増大を抑制することができる。
【0046】
つぎに、
図3に示すイベント圧縮回路303は、各信号値に対応する重要度に基づいて、各信号値を組み合わせた値を生成し、生成した組み合わせた値を受け付ける受け付け部101である。イベント圧縮回路303は、例えば、重要度が高い順に各信号値を並び替えて組み合わせた値を生成してもよい。ここで、イベント圧縮回路303によって生成される組み合わせた値は、例えば、圧縮イベントデータや圧縮後のイベントデータなどとも称する。重要度については、例えば、利用者によって定められる。
【0047】
また、イベント圧縮回路303は、各信号値に対応する重要度に基づいて、各信号値から選択した信号値を組み合わせた値を生成し、生成した組み合わせた値を受け付ける受け付け部101である。
【0048】
図8は、イベント圧縮回路例を示す説明図である。具体的に、イベント圧縮回路303は、例えば、イベントフィルタ回路302から出力されたイベントデータをコンフィギュレーションデータによってビットの並び替えを行う。ここでのコンフィギュレーションデータが各信号値の重要度である。
【0049】
また、イベント圧縮回路303は、イベントデータのうちコンフィギュレーションデータによって破棄指定されたデータを除外したイベントデータを出力する。例えば、利用者は、コンフィギュレーションデータによって20ビットのPCの値のうち上位4ビットを破棄するように指定してもよい。
【0050】
図8では、イベントデータに含まれる各データにおいて上位ビットであるほど、重要度が高い例である。
図8の例では、イベント圧縮回路303は、4ビットのTYPEの値と、20ビットのPCの値と、16ビットのADの値と、16ビットのDATAの値と、を含むイベントデータの、一部のビットデータの除外と、ビットの並び替えを行う。これにより、イベント圧縮回路303は、32ビットのデータw0と32ビットのデータw1とを含む圧縮イベントデータを生成する。データw0とデータw1とのビット幅が32ビットであるのは、この後説明する
図12および
図11のRAM1106が32ビット幅であるためであり、データw0とデータw1とのビット幅は32ビットに限定されない。
【0051】
図9は、破棄例および並び替え例を示す説明図である。イベント圧縮回路303は、PCの上位4ビットとDATAの全ビットを破棄する。そして、イベント圧縮回路303は、例えば、MSB(Most Significant Bit)側にTYPEの値を含め、TYPEの値の後にPCの値とADの値とを交互に並べる。これにより、イベント圧縮回路303は、データw0とデータw1とを有する圧縮イベントデータを生成する。データw1の上位4ビット以外については、未使用であり、空き領域となる。
【0052】
図10は、破棄および並び替えの結果例を示す説明図である。
図10では利用者が与えた重要度として、TYPEを最高とし、つづいてPCとADとが同順位であるとしている。
図10では、
図5に示したイベントデータ例を用いて
図9に示した圧縮イベントデータの生成例を説明する。イベント圧縮回路303は、TYPEの値が「0」、PCの値が「12340」、ADの値が「4000」、DATAの値が「abcd」であるイベントデータを受け付ける。
【0053】
イベント圧縮回路303は、DATAの値と、PCの上位4ビットの値と、を破棄する。そして、イベント圧縮回路303は、TYPEの値である「0」をMSBに配置し、PCの値の上位の値を削除する。イベント圧縮回路303は、PCの下位16ビットの値と、ADの値と、を交互に並べて圧縮イベントデータを生成する。そのため、データw0は、「02430400」となり、データw1は「0」となる。
【0054】
図10の例では、4ビット単位で交互に並べたが、1ビット単位で交互に並べてもよく、特に限定しなくてよい。重要度が等しいデータについては交互に並べるのがこの実施例では効果的であるためであり、並べ替えをしない場合もありえる。利用者は重要度を与えるかわりに、具体的な並べ替え方法を直接与えてもよい。
【0055】
つぎに、
図3に示す圧縮イベントキュー回路304は、組み合わせた値を順次受け付ける受け付け部101である。圧縮イベントキュー回路304は、例えば、組み合わせた値を受け付けた順に記憶し、記憶した順に組み合わせた値を取り出すことが可能なキュー構造の第3記憶部を有する。ここで、第3記憶部は、圧縮イベントデータを格納するキュー構造の記憶部であるため、圧縮イベントキューとも称する。第3記憶部は、例えば、
図12に示すRAMである。圧縮イベントキュー回路304は、受け付けた圧縮イベントデータを圧縮イベントキューに入れる。
【0056】
また、
カウンタ値テーブル回路307は、圧縮イベントデータに応じた発生回数を圧縮イベントデータに関連付けて
カウンタ値テーブルに格納してもよい。そして、
2分探索木回路306は、圧縮イベントキューへ圧縮イベントデータを入れる前に、圧縮イベントキューに、受け付けた圧縮イベントデータと同一の圧縮イベントデータが記憶されているか否かを探索する。
【0057】
2分探索木回路306は、新たに圧縮イベントデータを受け付けると、受け付けた圧縮イベントデータと同一値が圧縮イベントキューに記憶されているかを探索する。そして、
カウンタ値テーブル回路307は、受け付けた圧縮イベントデータと同一値が検出された場合、圧縮イベントキューに記憶された同一値に関連付けられた発生回数を更新し、受け付けた圧縮イベントデータを圧縮イベントキューに記憶させない。発生回数は、カウンタ値とも称する。ここで、
カウンタ値テーブル回路307は、同一に関連付けられたカウンタ値に1を加算することによってカウンタ値を更新する。
【0058】
また、
カウンタ値テーブル回路307は、受け付けた圧縮イベントデータと同一値が検出されなかった場合、圧縮イベントキューに、受け付けた圧縮イベントデータと、受け付けた圧縮イベントデータに応じたカウンタ値と、を関連付けて記憶する。ここでのカウンタ値は「1」である。
【0059】
また、圧縮イベントキュー回路304は、圧縮イベントキューに記憶された圧縮イベントデータの数が所定数以上となった場合に、予告信号を生成してデータストア回路305に出力する。所定数は、例えば、利用者によって定められてもよい。所定数は、例えば、閾値full_thresとも称する。圧縮イベントキューに記憶された圧縮イベントデータの数は、例えば、データ数numとも称する。
【0060】
図11は、圧縮イベントキュー回路例を示す説明図である。圧縮イベントキュー回路304は、SUP処理部1101と、プッシュ処理部1102と、ピーク処理部1103と、ポップ処理部1104と、RAM制御部1105と、RAM1106と、を有する。圧縮イベントキュー回路304は、圧縮イベントデータを一時的に格納するキューとしてRAM1106を使用する。
【0061】
各部の詳細な説明の前に、圧縮イベントキュー回路304において扱うデータのデータ構造について説明する。
【0062】
図12は、圧縮イベントキュー回路において扱うデータのデータ構造例を示す説明図である。
図11に示したRAM1106の構成について説明する。RAM1106は、上述した第3記憶部である。RAM1106は、例えば、1ワードが32ビットであり、64ワードを有する。ここで、64ワードを定数lenとし、RAM1106のサイズを表す。定数lenの単位はワード数である。
【0063】
圧縮イベントデータは、32ビット幅のデータw0と4ビット幅のデータw1とを有する36ビット幅のデータである。このため、1つの圧縮イベントデータに対してRAM1106のうち2ワード分を使用する。そこで、圧縮イベントキュー回路304は、36ビットの圧縮イベントデータと8ビットのカウンタ値とを、2ワードのデータとしてRAM1106に格納する。
【0064】
図11に示すRAM制御部1105は、RAM1106に、圧縮イベントデータを格納したり、RAM1106から圧縮イベントデータを取り出す際に、使用する変数などを記憶する制御用レジスタを有する。制御用レジスタは、例えば、アドレスwrite_ptr、アドレスread_ptr、データ数num、閾値full_thresを記憶する。
【0065】
アドレスwrite_ptrは、書き込み用のアドレスである。アドレスread_ptrは、読み出し用のアドレスである。データ数numは、RAM1106の64ワードのうち使用中のワードの数である。このため、データ数numは、RAM1106に記憶された組み合わせた値の数である。閾値full_thresは、上述したように所定数であり、予告信号nearly_fullを出力するか否かを判定するための閾値である。閾値full_thresは、例えば、利用者によって設定可能である。
【0066】
以降、説明の簡単化のために、プッシュ処理部1102、ポップ処理部1104、ピーク処理部1103などがRAM1106に対して書き込みや読み出しを行ったり、各変数などを更新するように記載する。実際には、RAM制御部1105が、RAM1106にデータをプッシュしたり、RAM1106にデータをポップする際の制御を行う。
【0067】
プッシュ処理部1102は、RAM1106に対するプッシュ処理を行う。入力データは、圧縮イベントデータと、カウンタ値cntと、である。ここで入力データに含まれるカウンタ値cntは「1」である。圧縮イベントデータは、データw0とデータw1を有する。データw0とデータw1とはそれぞれ32ビット幅である。カウンタ値cntは8ビット幅である。また、プッシュ処理部1102は、圧縮イベントキューが溢れそうになったら予告信号nearly_fullを出力する。
【0068】
プッシュ処理部1102は、定数lenと、データ数numと、を扱う。プッシュ処理部1102は、プッシュ処理の一例として、データw1の下位ビットが未使用であることを利用して、データw1の下位ビットにカウンタ値cntを格納し、データw0とデータw1とカウンタ値cntとを2ワードで表してRAM1106に書き込む。
【0069】
図13は、プッシュ処理部が行うプッシュ処理手順例を示すフローチャートである。プッシュ処理部1102は、圧縮イベントデータを受け付ける(ステップS1301)。つぎに、プッシュ処理部1102は、定数len≦データ数numか否かを判断する(ステップS1302)。
【0070】
定数len≦データ数numであると判断された場合(ステップS1302:Yes)、プッシュ処理部1102は、書き込み不可能エラーを出力し(ステップS1303)、一連の処理を終了する。定数len≦データ数numでないと判断された場合(ステップS1302:No)、プッシュ処理部1102は、RAM1106内のアドレスwrite_ptrが示す領域にデータw0を書き込む(ステップS1304)。
【0071】
プッシュ処理部1102は、RAM1106内のアドレスwrite_ptr+1が示す領域にデータw1とカウンタ値cntを書き込む(ステップS1305)。プッシュ処理部1102は、データ数num=データ数num+2を行い(ステップS1306)。プッシュ処理部1102は、アドレスwrite_ptr=アドレスwrite_ptr+2とする(ステップS1307)。
【0072】
そして、プッシュ処理部1102は、アドレスwrite_ptr>定数lenか否かを判断する(ステップS1308)。アドレスwrite_ptr>定数lenでないと判断された場合(ステップS1308:No)、プッシュ処理部1102は、ステップS1310へ移行する。アドレスwrite_ptr>定数lenであると判断された場合(ステップS1308:Yes)、プッシュ処理部1102は、アドレスwrite_ptr=アドレスwrite_ptr−定数lenとする(ステップS1309)。
【0073】
プッシュ処理部1102は、閾値full_thres<データ数numか否かを判断する(ステップS1310)。閾値full_thres<データ数numでない場合(ステップS1310:No)、プッシュ処理部1102は、予告信号nearly_full=0とし(ステップS1311)、一連の処理を終了する。閾値full_thres<データ数numである場合(ステップS1310:Yes)、プッシュ処理部1102は、予告信号nearly_full=1とし(ステップS1312)、一連の処理を終了する。
【0074】
つぎに、
図11に示すポップ処理部1104は、RAM1106に対するポップ処理を行う。出力データは、圧縮イベントデータと、カウンタ値cntと、である。圧縮イベントデータは、データw0とデータw1を有する。データw0とデータw1とはそれぞれ32ビット幅である。カウンタ値cntは8ビット幅である。
【0075】
図14は、ポップ処理部が行うポップ処理手順例を示すフローチャートである。ポップ処理部1104は、データ数num≦0か否かを判断する(ステップS1401)。データ数num≦0であると判断された場合(ステップS1401:Yes)、ポップ処理部1104は、読み出し不可能エラーを出力し(ステップS1402)、一連の処理を終了する。
【0076】
データ数num≦0でないと判断された場合(ステップS1401:No)、ポップ処理部1104は、RAM1106内のアドレスread_ptrが示す領域からデータdを読み出し、データw0にデータdを出力する(ステップS1403)。ポップ処理部1104は、RAM1106内のアドレスread_ptr+1が示す領域からデータdを読み出す(ステップS1404)。
【0077】
ポップ処理部1104は、データd1に(データd AND 0xffffff00)の結果を出力する(ステップS1405)。ポップ処理部1104は、カウンタ値cntに(データd AND 0x000000ff)の結果を出力する(ステップS1406)。ポップ処理部1104は、データ数num=データ数num−2とする(ステップS1407)。
【0078】
ポップ処理部1104は、アドレスread_ptr=アドレスread_ptr+2とする(ステップS1408)。ポップ処理部1104は、アドレスread_ptr>定数lenか否かを判断する(ステップS1409)。アドレスread_ptr>定数lenでない場合(ステップS1409:No)、ポップ処理部1104は、一連の処理を終了する。アドレスread_ptr>定数lenである場合(ステップS1409:Yes)、ポップ処理部1104は、アドレスread_ptr=アドレスread_ptr−定数lenとし(ステップS1410)、一連の処理を終了する。
【0079】
図11に示すピーク処理部1103は、ポインタread_ptrを変化させずに、圧縮イベントキューであるRAM1106からデータを読み出す。入力データは、読み出し位置iである。出力データは、圧縮イベントデータと、カウンタ値cntと、
図11に示すRAM1106のアドレスptrと、である。圧縮イベントデータは、データw0とデータw1を有する。データw0とデータw1とはそれぞれ32ビット幅である。カウンタ値cntは8ビット幅である。
【0080】
図15は、ピーク処理部が行うピーク処理手順例を示すフローチャートである。ピーク処理部1103は、読み出し位置iを受け付ける(ステップS1501)。ピーク処理部1103は、データ数num≦iか否かを判断する(ステップS1502)。データ数num≦iであると判断された場合(ステップS1502:Yes)、ピーク処理部1103は、読み出し不可能エラーを出力し(ステップS1503)、一連の処理を終了する。データ数num≦iでないと判断された場合(ステップS1502:No)、ピーク処理部1103は、アドレスp=アドレスread_ptr+iとする(ステップS1504)。
【0081】
つぎに、ピーク処理部1103は、定数len≦アドレスpか否かを判断する(ステップS1505)。定数len≦アドレスpでないと判断された場合(ステップS1505:No)、ピーク処理部1103は、ステップS1507へ移行する。定数len≦アドレスpであると判断された場合(ステップS1505:Yes)、ピーク処理部1103は、アドレスp=アドレスp−定数lenとする(ステップS1506)。
【0082】
ピーク処理部1103は、RAM1106内のアドレスpが示す領域からデータdを読み出す(ステップS1507)。ピーク処理部1103は、データw0にデータdを出力する(ステップS1508)。ピーク処理部1103は、RAM1106内のアドレスp+1が示す領域からデータdを読み出す(ステップS1509)。ピーク処理部1103は、データd1に(データd AND 0xffffff00)の結果を出力する(ステップS1510)。
【0083】
ピーク処理部1103は、カウンタ値cntに(データd AND 0x000000ff)の結果を出力する(ステップS1511)。ピーク処理部1103は、アドレスptrにアドレスpを出力し(ステップS1512)、一連の処理を終了する。
【0084】
SUP処理部1101は、スキャン(Scan)処理とアップデート(Update)処理とプッシュ(Push)処理を行う。SUP処理部1101は、受け付けた圧縮イベントデータとカウンタ値とを含むデータを圧縮イベントキューへ投入する前に、圧縮イベントキューをスキャンする。SUP処理部1101は、受け付けた圧縮イベントデータと同一の圧縮イベントデータがすでに圧縮イベントキューにあるか否かを判断する。
【0085】
SUP処理部1101は、すでに圧縮イベントキューにある場合、圧縮イベントキューに登録された圧縮イベントデータに対応するカウンタ値cntをカウントアップし、新たに受け付けた圧縮イベントデータを圧縮イベントキューに投入しない。
【0086】
入力データは、圧縮イベントデータと、カウンタ値cntと、である。ここで入力データに含まれるカウンタ値cntは「1」である。圧縮イベントデータは、データw0とデータw1を有する。データw0とデータw1とはそれぞれ32ビット幅である。カウンタ値cntは8ビット幅である。
【0087】
図16は、SUP処理部が行うSUP処理手順例を示すフローチャートである。SUP処理部1101は、圧縮イベントデータiw0,iw1とカウンタ値icntとを受け付ける(ステップS1601)。SUP処理部1101は、読み出し位置i=0とする(ステップS1602)。SUP処理部1101は、読み出し位置i≦(データ数num−2)であるか否かを判断する(ステップS1603)。
【0088】
読み出し位置i≦(データ数num−2)であると判断された場合(ステップS1603:Yes)、SUP処理部1101は、プッシュ処理を行い(ステップS1604)、一連の処理を終了する。読み出し位置i≦(データ数num−2)でないと判断された場合(ステップS1603:No)、SUP処理部1101は、読み出し位置iを入力としてピーク処理を行い、データw0,w1、カウンタ値cnt、アドレスptを取得する(ステップS1605)。
【0089】
SUP処理部1101は、データiw0=データw0、かつデータiw1=データw1であるか否かを判断する(ステップS1606)。データiw0=データw0でない、またはデータiw1=データw1でないと判断された場合(ステップS1606:No)、SUP処理部1101は、ステップS1603へ戻る。データiw0=データw0、かつデータiw1=データw1であると判断された場合(ステップS1606:Yes)、SUP処理部1101は、アドレスptr+1が示す領域にデータiw1とカウンタ値(cnt+icnt)を書き込む(ステップS1607)。そして、SUP処理部1101は、一連の処理を終了する。
【0090】
つぎに、データストア回路305と、2分探索木回路306と、カウンタ値テーブル回路307と、について説明する。
【0091】
データストア回路305は、2分探索木回路306と、カウンタ値テーブル回路307と、を制御する。
【0092】
2分探索木回路306は、第2記憶部112を有する。そして、2分探索木回路306は、2分探索木から、値が受け付け部101によって受け付けられた組み合わせた値に対応するノードを探索する。そして、2分探索木回路306は、探索したノードの値に関連付けられた情報を出力する探索部102である。情報は、例えば、上述したようにアドレスである。ここでは、エントリアドレスとも称する。
【0093】
カウンタ値テーブルは、第1記憶部111のうち、出力されたエントリアドレスが示す領域に記憶された発生回数を更新する更新部103である。発生回数はカウンタ値とも称する。
【0094】
また、2分探索木回路306は、ノードの探索中に、新たに組み合わせた値が受け付けられると、ノードの探索を中断する。そして、2分探索木回路306は、2分探索木のうち中断時において検出したノードの値に関連付けて記憶されたアドレスを出力する。そして、2分探索木は、新たに受け付けられた組み合わせた値に対応するノードを探索する。また、2分探索木回路306は、組み合わせた値に対応するノードの探索中に、2分探索木の深さが特定値となった場合に、ノードの探索を中断し、2分探索木のうち中断時において検出したノードの値に関連付けて記憶されたアドレスを出力する。中断時において検出したノードとは、中断時の着目ノードである。
【0095】
ここで、
図2に示した2分探索木とカウンタ値テーブルのデータ構造について説明する。
【0096】
図17は、2分探索木のデータ構造例を示す説明図である。
図17に示すRAM1700は、2分探索木の構造のデータを記憶する第2記憶部112である。
図17に示すRAM1700は、1ワードのビット幅が28ビットであり、ワード数が512ワードである。ここでは、1ワードが1つのノードを表すため、ワード数がノード数であり、ノード数をBTREE_NODE_NUMと示す。
【0097】
2分探索木の1つのノードあたりのデータ形式は、9ビットのノード番号p0と9ビットのノード番号p1と10ビットのエントリアドレスとの全28ビットである。ノード番号p0は、0枝が示すノード番号である。ノード番号p1は、1枝が示すノード番号である。ここで、ノード番号はノードを識別可能な番号であり、ノードの値であり、RAM1700のアドレスでもある。
【0098】
ここで、テーブルエントリの数はTABLE_SIZEと示す。テーブルエントリが存在しないことを表すための定数をTABLE_ENTRY_NONEと示す。ノードが存在しないことを意味する定数をBTREE_NODE_NONEと示す。各値の一例は以下の通りである。
【0099】
TABLE_SIZE=1024
TABLE_ENTRY_NONE=1023
BTREE_NODE_NUM=512
BTREE_NODE_NONE=511
【0100】
ここで、ノード番号p0とノード番号p1とエントリアドレスentryとの初期値は以下の通りである。
p0=BTREE_NODE_NONE
p1=BTREE_NODE_NONE
entry=TABLE_ENTRY_NONE
【0101】
図18は、カウンタ値テーブルのデータ構造例を示す説明図である。RAM1800は、例えば、カウンタ値を記憶する第1記憶部111である。第1記憶部111は、カウンタ値テーブルとも称する。カウンタ値テーブルは、例えば、1ワードが32ビットであり、1024ワード有する。テーブルエントリ1つあたりのデータ形式は、例えば、32ビット幅のカウンタ値cntである。カウンタ値cntの初期値は0である。
【0102】
図19は、2分探索木回路例を示す説明図である。2分探索木回路306は、2分探索処理部1901と、初期化処理部1902と、ノード割当処理部1903と、ダンプ処理部1904と、RAM制御部1905と、RAM1700と、を有する。
【0103】
RAM1700は、2分探索木の構造のデータを格納する第2記憶部112である。RAM制御部1905は、RAM1700からのデータの読み出し、RAM1700へのデータの書込を制御する。RAM制御部1905は、フリーノードアドレスbtree_nоde_freeを格納可能な制御用レジスタを有する。
【0104】
初期化処理部1902は、リセット信号を受け取ったときに、RAM1700の全ワードについて、ノード番号p0とノード番号p1とエントリアドレスentryと、を初期化する。
【0105】
また、2分探索処理部1901は、2分探索木から、値が受け付けた圧縮イベントデータに対応するノードを探索する。ノード割当処理部1903は、2分探索処理部1901によって圧縮イベントデータに対応するノードが見つからない場合、圧縮イベントデータまたは圧縮イベントデータの一部に対応する新たなノードを割り当てる処理を行う。
【0106】
ダンプ処理部1904は、RAM1700に格納された各ノードの値をダンプしてレポート生成部308に出力する処理を行う。
【0107】
図20は、カウンタ値テーブル回路例を示す説明図である。カウンタ値テーブル回路307は、初期化処理部2001と、テーブルエントリ割当処理部2002と、ダンプ処理部2003と、RAM制御部2004と、RAM1800と、を有する。
【0108】
RAM1800は、カウンタ値テーブルである。RAM1800は、圧縮イベントデータの各々に応じた圧縮イベントデータの発生回数を記憶する第1記憶部111である。
【0109】
RAM制御部2004は、RAM1800への書き込みや読み出しを制御する。また、RAM制御部2004は、フリーエントリアドレスtable_freeを格納可能な制御用レジスタを有する。フリーエントリアドレスtable_freeは、RAM1800のうち未使用の領域を示すアドレスのうちの先頭のアドレスである。
【0110】
テーブルエントリ割当処理部2002は、2分探索木に含まれるノードに対応するテーブルエントリを割り当てる処理を行う。
【0111】
初期化処理部2001は、リセット信号を受け取った時に、すべてのテーブルエントリを初期化する。
【0112】
ダンプ処理部2003は、RAM1800に格納された各テーブルエントリの値をダンプしてレポート生成部308に出力する処理を行う。
【0113】
図21は、データストア回路例を示す説明図である。データストア回路305は、カウンタ値テーブル回路307と2分探索木回路306とを制御する。データストア回路305は、例えば、2分探索木回路306によって出力されたエントリアドレスが示す第1記憶部111のうちの領域に記憶された発生回数を更新する更新部103である。データストア回路305は、テーブルインデックス計算部2100を有する。
【0114】
図22は、探索およびテーブル登録例を示す説明図である。RAM1700には、2分探索木の構造のデータが格納される。RAM1800では、アドレス「0000」〜「0002」が示す各領域は使用状態であり、アドレス「0003」以降のアドレスが示す各領域は未使用状態である。そのため、フリーエントリアドレスtable_freeは、「0003」が設定される。
【0115】
データストア回路305は、ポップ処理部1104によってポップ処理を行わせることにより圧縮イベントキューから圧縮後のイベントデータとカウンタ値とを取得する。そして、データストア回路305は、取り出した圧縮後のイベントデータを検索キーとして2分探索処理部1901によって2分探索処理を実行する。具体的に、2分探索処理部1901は、例えば、圧縮後のイベントデータを検索キーとして2分探索木から検索キーに対応するノードを探索する。ここでは、説明の簡略化のために、圧縮後のイベントデータは、「1001」とする。そして、カウンタ値は、「1」とする。
【0116】
まず、2分探索処理部1901は、ルートノードから順に圧縮後のイベントデータの先頭のビット「1」と一致するノード−1を探索する。つぎに、2分探索処理部1901は、「10」と一致するノード−10を探索する。ここで、2分探索処理部1901は、予告信号を受け付けたため、探索を中断する。そのため、2分探索処理部1901は、ノード−10のノード番号を出力する。
【0117】
テーブルインデックス計算部2100は、2分探索処理部1901によって出力されたノード番号に基づいてRAM1700からノード番号に関連付けられたエントリアドレスentryを読み出す。テーブルインデックス計算部2100は、読み出したエントリアドレスentryを出力する。
【0118】
テーブルインデックス計算部2100は、エントリアドレスentryが未割当値TABLE_ENTRY_NONEの場合、フリーポインタtable_freeに基づいて新たにテーブルエントリを割り当てる。テーブルインデックス計算部2100は、新たにテーブルエントリを割り当てた後、フリーポインタを更新する。そして、テーブルインデックス計算部2100は、新たに割り当てたエントリアドレスentryを出力する。
【0119】
データストア回路305は、RAM1800のうちエントリアドレスentryが示す領域に格納されたカウンタ値cnt_oldを読み出す。そして、データストア回路305は、カウンタ値cnt_oldに、ポップ処理によって得られたカウンタ値cntを加算したカウンタ値を、RAM1800のうちエントリアドレスentryが示す領域に格納する。
【0120】
図23および
図24は、2分探索処理部が行う2分探索処理手順例を示すフローチャートである。2分探索処理部1901は、node=0とする(ステップS2301)。2分探索処理部1901は、node_from=定数BTREE_NODE_NONEにする(ステップS2302)。
【0121】
2分探索処理部1901は、w0,w1=圧縮イベントデータとする(ステップS2303)。そして、2分探索処理部1901は、bi=0とする(ステップS2304)。2分探索処理部1901は、閾値limit=20とする(ステップS2305)。2分探索木のノード数が増えてくると、2分探索木を実現するRAM1700の使用容量が大きくなる。そこで、2分探索木のノードの深さに閾値limitを設けることにより、RAM1700の使用容量の低減を図る。RAM1700の使用容量の低減を図ることにより、よりRAM1700のサイズの縮小化を図ることができる。また、メモリ満杯エラーが発生した場合には、エラーの回復処理として閾値limitを減らして再度実行することにしてもよい。これにより、メモリの使用容量の低減を図ることができる。また、2分探索木のルートノードからの探索中のノードまでのノード数に対して閾値を設けることにより、RAM1700の使用容量の低減を図ってもよい。
【0122】
2分探索処理部1901は、36≦biか否かを判断する(ステップS2306)。36≦biでないと判断された場合(ステップS2306:No)、2分探索処理部1901は、node_fromを出力し(ステップS2307)、一連の処理を終了する。
【0123】
36≦biであると判断された場合(ステップS2306:Yes)、2分探索処理部1901は、閾値limit=0または予告信号nearly_full=1であるか否かを判断する(ステップS2308)。つぎに、閾値limit=0または予告信号nearly_full=1である場合(ステップS2308:Yes)、2分探索処理部1901は、nodeを出力し(ステップS2309)、一連の処理を終了する。
【0124】
閾値limit=0でなく、予告信号nearly_full=1でない場合(ステップS2308:No)、2分探索処理部1901は、ステップS2401へ移行する。
【0125】
一方、ステップS2308のYesの場合のつぎに、2分探索処理部1901は、RAM[nоde]を読み出し、[p0,p1,entry]=RAM[nоde]とする(ステップS2401)。ここでのRAMは、RAM1700である。つぎに、2分探索処理部1901は、b=ビットベクタ[w0,w1]のMSB側から第biビットとする(ステップS2402)。
【0126】
2分探索処理部1901は、b=0か否かを判断する(ステップS2403)。b=0であると判断された場合(ステップS2403:Yes)、2分探索処理部1901は、nоde_next=関数sub_proc(p0)とし(ステップS2404)、ステップS2406へ移行する。b=0でないと判断された場合(ステップS2403:No)、2分探索処理部1901は、nоde_next=関数sub_proc(p1)とし(ステップS2405)、ステップS2406へ移行する。
【0127】
2分探索処理部1901は、node_from=nodeとする(ステップS2406)。2分探索処理部1901は、nоde=nоde_nextとする(ステップS2407)。2分探索処理部1901は、bi=bi+1とする(ステップS2408)。2分探索処理部1901は、閾値limit=閾値limit−1とし(ステップS2409)、ステップS2306へ戻る。
【0128】
図25は、関数sub_proc(p)についての処理手順例を示すフローチャートである。2分探索処理部1901は、入力pを受け付ける(ステップS2501)。そして、2分探索処理部1901は、p=定数BTREE_NODE_NONEか否かを判断する(ステップS2502)。p=定数BTREE_NODE_NONEでないと判断された場合(ステップS2502:No)、2分探索処理部1901は、ステップS2506へ移行する。
【0129】
p=定数BTREE_NODE_NONEであると判断された場合(ステップS2502:Yes)、2分探索処理部1901は、p=ノード割当処理部1903によるノード割当処理の結果とする(ステップS2503)。2分探索処理部1901は、p=定数BTREE_NODE_NONEであるか否かを判断する(ステップS2504)。p=定数BTREE_NODE_NONEであると判断された場合(ステップS2504:Yes)、2分探索処理部1901は、メモリ満杯エラーを出力し(ステップS2505)、一連の処理を終了する。
【0130】
p=定数BTREE_NODE_NONEでないと判断された場合(ステップS2504:No)、2分探索処理部1901は、pを返し(ステップS2506)、一連の処理を終了する。
【0131】
図26は、ノード割当処理部が行うノード割当処理手順例を示すフローチャートである。ノード割当処理部1903は、定数BTREE_NODE_NONE≦フリーノードアドレスbtree_nоde_freeか否かを判断する(ステップS2601)。定数BTREE_NODE_NONE≦フリーノードアドレスbtree_nоde_freeであると判断された場合(ステップS2601:Yes)、ノード割当処理部1903は、メモリ満杯エラーを出力し(ステップS2602)、一連の処理を終了する。
【0132】
定数BTREE_NODE_NONE≦フリーノードアドレスbtree_nоde_freeでないと判断された場合(ステップS2601:No)、ノード割当処理部1903は、new_btree_nоde=フリーノードアドレスbtree_nоde_freeとする(ステップS2603)。ノード割当処理部1903は、フリーノードアドレスbtree_nоde_free=フリーノードアドレスbtree_nоde_free+1とする(ステップS2604)。そして、ノード割当処理部1903は、new_btree_nоdeを返し(ステップS2605)、一連の処理を終了する。
【0133】
テーブルエントリ割当処理部2002によるテーブルエントリ割当処理は、ノード割当処理部1903によるノードの割当処理と同様の処理であるため、詳細な説明を省略する。
【0134】
図27は、データストア回路が行うデータストア処理手順例を示す説明図である。データストア回路305は、圧縮イベントキューからポップ処理によってデータ(圧縮イベントデータ[w0,w1],カウンタ値cnt)を取り出す(ステップS2701)。データストア回路305は、圧縮イベントデータ[w0,w1]を入力として、テーブルインデックス計算処理を行い、エントリアドレスentryを得る(ステップS2702)。
【0135】
そして、データストア回路305は、RAM1800のうちエントリアドレスentryが示す領域に格納されたカウンタ値cnt_оldを読み出す(ステップS2703)。つぎに、データストア回路305は、RAM1800のうちエントリアドレスentryが示す領域に、カウンタ値(cnt+cnt_оld)を書き込み(ステップS2704)、一連の処理を終了する。
【0136】
図28は、テーブルインデックス計算部が行うテーブルインデックス計算処理手順例を示すフローチャートである。テーブルインデックス計算部2100は、btree_nоde=2分探索処理の結果とする(ステップS2801)。テーブルインデックス計算部2100は、[p0,p1,entry]=RAM[btree_nоde]とする(ステップS2802)。ここでのRAMは、RAM1700である。ステップS2802においては、例えば、テーブルインデックス計算部2100が、RAM1700のうちbtree_nоdeが示す領域に格納されたデータを、p0,p1,entryそれぞれに代入する処理である。
【0137】
テーブルインデックス計算部2100は、エントリアドレスentry=定数TABLE_ENTRY_NONEか否かを判断する(ステップS2803)。エントリアドレスentry=定数TABLE_ENTRY_NONEでないと判断された場合(ステップS2803:No)、テーブルインデックス計算部2100は、ステップS2806へ移行する。エントリアドレスentry=定数TABLE_ENTRY_NONEであると判断された場合(ステップS2803:Yes)、テーブルインデックス計算部2100は、ステップS2804へ移行する。テーブルインデックス計算部2100は、エントリアドレスentry=テーブルエントリ割り当て処理の結果とする(ステップS2804)。
【0138】
テーブルインデックス計算部2100は、RAM[btree_node]=[p0,p1,entry]とする(ステップS2805)。ここでのRAMは、RAM1700である。テーブルインデックス計算部2100は、エントリアドレスentryを返し(ステップS2806)、一連の処理を終了する。
【0139】
つぎに、
図3に示すレポート生成部308は、2分探索木のデータと発生回数とを集計して提示する出力部である。レポート生成部308は、例えば、第2記憶部112に記憶されたノードの値と、ノードの値に関連付けられた情報と、を取得する。レポート生成部308は、第1記憶部111に記憶された発生回数を取得する。レポート生成部308は、2分探索木に含まれるノードのうち値に情報が関連付けられたノードの各々について、ノードの値と、取得した発生回数のうちノードの値に関連付けられた情報が示す領域に格納された発生回数と、を関連付けて提示する。レポート生成部308は、2分探索木のデータと発生回数とを集計してレポートを出力する。
【0140】
図29は、イベント発生例を示す説明図である。
図29の左側には、イベントフィルタ回路302から出力されたイベントデータを示す。そして、
図29の右側には、イベントデータがイベント圧縮回路303によって圧縮された後の圧縮イベントデータを示す。上述したように、TYPEの値が「0」であれば、メモリ書き込みを示し、TYPEの値が「1」であれば、メモリ読み出しを示す。
図29には、メモリ書き込みとメモリ読み出しとが6回発生した例を示す。以下では、
図29のイベントが発生しているときに、RAM1700とRAM1800のデータを用いてレポート生成部308が行う処理を説明する。
【0141】
レポート生成部308は、ダンプ処理部1904によってRAM1700のダンプデータを取得する。
【0142】
図30は、2分探索木から得られるダンプデータ例を示す説明図である。
図30では、各ノードを「[ノード番号] ノード番号p0 ノード番号p1 エントリアドレスentry」によって表す。
【0143】
上述では、値が存在しない場合については、「511」や「1023」などを使って表していたが、
図30の例では、[−1]と表す。
図30によれば、エントリアドレスentryが設定されてあるノードが全体のノードに対して少ないことが判別可能である。具体的に、エントリアドレスentryが設定されてあるノードのノード番号は「20」、「37」、「48」、「64」、「80」である。このことは、2分探索木のノード数と比較して、RAM1800はそれほど大容量でなくてもよいことを示している。
【0144】
また、レポート生成部308は、ダンプ処理部2003によってRAM1800のダンプデータを取得する。
【0145】
図31は、カウンタ値テーブルから得られるダンプデータ例を示す説明図である。
図31では、「[ ]」によってエントリアドレスを表し、「[ ]」の隣の数値がカウンタ値を表す。フリーエントリアドレスtable_freeの値は5である。
【0146】
図31によれば、例えば、RAM1800のうちアドレスが「0」の領域に格納されたカウンタ値は1であり、RAM1800のうちアドレスが「1」の領域に格納されたカウンタ値は2である。
【0147】
図32は、2分探索木のダンプデータを木構造によって表した例を示す説明図である。
図32では、例えば、「[n]」の場合、nがノード番号を表す。矢印の上の「0」が0枝を表し、矢印の上の「1」が1枝を表す。
【0148】
例えば、[0]から[20]に至る枝のラベルを収集して2進ベクトルによって表すと、「00010000010…」となる。この2進ベクトルを16進数によって表すと、「0x_1_0_4_0_0」となる。
【0149】
16進数によって表された数値が、再構築された圧縮イベントデータである。上述例における圧縮イベントキューに投入される際の圧縮イベントデータのデータ幅は、36ビットであるが、再構築された圧縮イベントデータのデータ幅は、20ビットである。このように、データストアの途中において予告信号nearly_fullの発生または閾値limitにより圧縮イベントデータの情報量が低減する。
図32には、閾値limitを20として実行したときの結果を示す。
【0150】
図33は、イベント種別およびカウンタ値への対応付け例を示す説明図である。
図33における表記について説明する。「[n]===>(p:q)」の場合を例に挙げて説明すると、nがノード番号である。ここでのpがノードに関連付けられているエントリアドレスである。ここでのqが、エントリアドレスが示す領域に格納されているカウンタ値である。ルートノードから各ノードまでに至る枝ラベルから圧縮イベントデータを再構築することができる。また、圧縮および並び替えを戻すことによって圧縮前のイベントデータが得られる。ここでは、例えば、テーブルに格納する前の圧縮イベントデータは36ビットであるが、新たに戻した場合の圧縮イベントデータは20ビットである。
【0151】
例えば、「[20]===>(0:1)」の場合、再構築された圧縮イベントデータは「0x_1_0_4_0_0」である。また、圧縮および並び替えを戻した場合におけるイベントデータでは、読み出しのイベントであることを示し、PCの値が「0x*00**」であり、ADが「0x40**」であることを示す。「*」は、不確定値を表し、情報量が低減したために値を決められないことを示す。
【0152】
例えば、「[80]===>(4:1)」の場合、再構築された圧縮イベントデータは「0x_1_8_0_0_0」である。また、圧縮および並び替えを戻した場合におけるイベントデータでは、読み出しのイベントであることを示し、PCの値が「0x*80**」であり、ADが「0x00**」であることを示す。
【0153】
例えば、「[37]===>(1:2)」の場合、再構築された圧縮イベントデータは「0x_0_0_0_0_0」である。また、圧縮および並び替えを戻した場合におけるイベントデータでは、書き込みのイベントであることを示し、PCの値が「0x*00**」であり、ADが「0x00**」であることを示す。ここでは、qの値が「2」であるため、このイベントは、2回発生していることを示す。
【0154】
図34は、レポート出力例を示す説明図である。
図34の例では、[ノード番号]、イベント内訳については、2進数表記(16進数表記)、countがカウンタ値である。
【0155】
[20]を例に挙げると、PCの値が「0x*00**」においてアドレスが「0x40**」である領域へのメモリ書き込みのイベントが1回発生したことを示す。
【0156】
また、[4]を例に挙げると、PCとアドレスが不明であるが、メモリ書き込みのイベントが計2回発生したことを示す。
【0157】
また、[21]を例に挙げると、PCとアドレスが不明であるが、メモリ読み出しのイベントが計4回発生したことを示す。
【0158】
また、[3]を例に挙げると、読み出しまたは書き込みのいずれかは不明であるが、メモリアクセスのイベントが計6回発生することを示す。
【0159】
(レポート生成部308が行うレポート生成処理手順例)
図35は、レポート生成部が行うレポート生成処理手順例を示すフローチャートである。レポート生成部308は、2分探索木回路306にダンプ処理を行わせ、データを取得する(ステップS3501)。ここで取得されるデータは、btree[]と表す。つぎに、レポート生成部308は、カウンタ値テーブル回路307にダンプ処理を行わせ、データを取得する(ステップS3502)。ここで取得されるデータは、table[]と表す。
【0160】
つぎに、レポート生成部308は、集計処理を行う(ステップS3503)。そして、レポート生成部308は、集計結果を出力し(ステップS3504)、一連の処理を終了する。
【0161】
図36は、
図35で示した集計処理(ステップS3503)の詳細な説明を示すフローチャートである。レポート生成部308は、着目ノード番号nоde=ルートノード番号とする(ステップS3601)。ここで、ルートノード番号は「0」である。レポート生成部308は、要素数36の配列変数ebのメモリ確保を行う(ステップS3602)。要素数36の配列変数ebのメモリ確保とは、C言語などのchar型を例に挙げると、「char eb[36]」のように配列変数ebの領域が確保されることである。
【0162】
レポート生成部308は、配列変数ebを初期化する(ステップS3603)。配列変数ebには、再構築された圧縮イベントデータが格納される。初期化するとは、具体的に、例えば、レポート生成部308は、eb[0]=2、eb[1]=2,eb[2]=2とする。ここでは、eb[i]によって1桁の値を表し、0,1,不確定値*の3種類の値を格納するために、0,1と、不確定値*に2を用いる。
【0163】
レポート生成部308は、eb_tail=−1とする(ステップS3604)。レポート生成部308は、関数repоrt_sub(nоde,eb,eb_tail)の呼び出しを行い(ステップS3605)、一連の処理を終了する。
【0164】
図37および
図38は、関数report_subの詳細な説明を示すフローチャートである。レポート生成部308は、着目ノード番号nоde=定数BTREE_NODE_NONEか否かを判断する(ステップS3701)。定数BTREE_NODE_NONEは、ノードが存在しないことを表す数である。着目ノード番号nоde=定数BTREE_NODE_NONEであると判断された場合(ステップS3701:Yes)、レポート生成部308は、0を返し(ステップS3702)、一連の処理を終了する。
【0165】
着目ノード番号nоde=定数BTREE_NODE_NONEでないと判断された場合(ステップS3701:No)、レポート生成部308は、[p0,p1,entry]=btree[nоde]とする(ステップS3703)。つぎに、レポート生成部308は、配列変数eb[eb_tail+1]=0とする(ステップS3704)。
【0166】
レポート生成部308は、num0=関数repоrt_sub(p0,eb,eb_tail+1)とする(ステップS3705)。ステップS3705における関数repоrt_subの呼び出しは再帰呼び出しである。レポート生成部308は、eb[eb_tail+1]=1とする(ステップS3706)。レポート生成部308は、num1=repоrt_sub(p1,eb,eb_tail+1)とする(ステップS3707)。ステップS3707における関数repоrt_subの呼び出しは再帰呼び出しである。
【0167】
つぎに、レポート生成部308は、エントリアドレスentry=定数TABLE_ENTRY_NONEか否かを判断する(ステップS3801)。定数TABLE_ENTRY_NONEは、上述したようにテーブルエントリが存在しないことを表すための定数である。エントリアドレスentry=定数TABLE_ENTRY_NONEでないと判断された場合(ステップS3801:No)、レポート生成部308は、データ数num=table[entry]とし(ステップS3802)、ステップS3804へ移行する。
【0168】
エントリアドレスentry=定数TABLE_ENTRY_NONEであると判断された場合(ステップS3801:Yes)、レポート生成部308は、データ数num=0とする(ステップS3803)。そして、レポート生成部308は、eb[eb_tail+1]=2とする(ステップS3804)。レポート生成部308は、cоunt=num+num0+num1とする(ステップS3805)。そして、レポート生成部308は、cоuntとeb[36]をレポート出力する(ステップS3806)。そして、レポート生成部308は、cоuntを返し(ステップS3807)、一連の処理を終了する。
【0169】
以上説明したように、イベント計数装置100は、イベントの発生回数を記憶する領域のアドレスを管理する2分探索木からイベントデータのノード探索中に新たなイベントデータを受け付けると、探索を中断する。そして、イベント計数装置100は、中断時に検出したノードに応じたアドレスが示す領域の発生回数を更新する。これにより、観測対象のハードウェア回路の動作速度への影響に支障を与えることなく、イベントの発生回数を確実に計数しつつ観測対象のハードウェア回路を高速に動作させることができる。
【0170】
また、中断しない場合やすべてのイベントデータを数える回路によって計数した場合などと比較して、イベントデータの精度は低下するが、イベントの発生回数を高速に計数することができる。イベントの発生が少ないような処理速度に余裕がある場合には、より多くの情報を記憶し、イベントの発生が多いような処理速度に余裕がない場合には、情報を省略して記録することができる。メモリアクセスを例に挙げると、イベントの発生が増減する場合とは、例えば、外部からの入力されたデータや割り込み発生などの要因によりメモリアクセスの場所や頻度が増減する場合である。このように、同じイベントが常時一定の頻度で発生するわけではない。たまたま処理速度に余裕がなくなって情報が省略されてしまったとしても、イベントの発生回数の傾向をおおまかに把握することは可能である。
【0171】
また、イベント計数装置100は、キューから取得したイベントデータに対応するノードの探索中に、キューに格納されたイベントデータの数が所定数以上となった場合、ノード探索を中断し、中断時のノードに対応するアドレスが示す領域の発生回数を更新する。
【0172】
また、イベント計数装置100は、出力されたアドレスが示す領域に記憶された発生回数を1加算することにより発生回数を更新する。これにより、発生回数を計数することができる。
【0173】
また、イベント計数装置100は、イベントデータに発生回数を関連付けてキューに記憶させる場合、新たに受け付けたイベントデータがすでにキューにある場合、すでにキューに格納されたイベントデータに関連付けられた発生回数を更新する。これにより、イベントデータに対応するノードの探索回数の低減を図ることができる。したがって、より高速にイベントの発生回数を計数することができる。
【0174】
また、イベント計数装置100は、各信号値に対応する重要度に基づいて、各信号値を組み合わせた値を生成し、生成した組み合わせた値を受け付け、組み合わせた値のビットの並びに基づき組み合わせた値に対応するノードを探索する。これにより、ノードの探索が中断されても、組み合わせた値のうちより重要度の高いビットに対応するノードの発生回数を更新することが可能となる。したがって、情報量が削減されても、より重要度の高い情報を残すことができる。
【0175】
また、イベント計数装置100は、各信号値に対応する重要度に基づいて、各信号値から選択した信号値を組み合わせた値を生成し、生成した組み合わせた値を受け付ける。これにより、重要な情報を残しつつ、情報を削減することが可能となる。したがって、キュー、2分探索木、カウンタ値テーブルなどのメモリの使用容量の低減を図ることができる。
【0176】
また、イベント計数装置100は、イベントデータのうち、複数のイベントのうち指定されたイベントに応じたイベントデータを受け付ける。これにより、利用者が所望のイベントに応じたイベントの発生回数を計数しつつ、キュー、2分探索木、カウンタ値テーブルなどのメモリの使用容量の低減を図ることができる。
【0177】
また、イベント計数装置100は、圧縮イベントデータに対応するノードの探索中に、2分探索木の深さが特定値となった場合に、ノードの探索を中断し、2分探索木のうち中断時において検出したノードの値に関連付けて記憶されたアドレスを出力する。このように、2分探索木の深さを制限することにより、圧縮イベントデータの情報量は低減するが、メモリの使用容量を制限でき、メモリ使用容量の低減を図ることができる。特定値は、例えば、閾値limitとも称する。
【0178】
また、イベント計数装置100は、2分探索木からダンプ処理して得た情報と、カウンタ値テーブルからダンプ処理して得た情報と、に基づいて、ノードの値の各々について発生回数を関連付けて提示する。これにより、利用者は、提示された情報を見て、イベントデータの発生回数の傾向を把握することが可能となる。
【0179】
また、イベント計数装置100は、ノードの探索中に、イベントデータの全部または一部に対応するノードがない場合、あらたにノードを割り当てる。
【0180】
また、イベント計数装置100は、生成されたノードの値が組み合わせた値の全部に対応する場合、またはノードの探索が中断した際の着目ノードが生成されたノードである場合に、カウンタ値テーブルに領域を確保する。これにより、発生回数をカウントすべきイベントデータの全部または一部に応じた領域だけをカウンタ値テーブル内に確保することができる。したがって、すべてのノードの値に対応する領域をカウンタ値テーブル内に確保する場合よりも、メモリの使用容量の低減を図ることができる。
【0181】
また、本実施の形態で説明したイベント計数装置100は、スタンダードセルやストラクチャードASICなどのASICやFPGAなどのPLDによっても実現することができる。具体的には、例えば、上述したイベント計数装置100の機能や記憶部がHDL(Hardware Description Language)記述によって機能定義され、そのHDL記述が論理合成されてASICやPLDに与える。これにより、イベント計数装置100が製造されてもよい。イベント計数装置100の機能や記憶部とは、例えば、受け付け部101から更新部103や第1記憶部111および第2記憶部112などである。
【0182】
上述した実施の形態に関し、さらに以下の付記を開示する。
【0183】
(付記1)観測対象の回路に含まれる各信号線を流れる各信号値を組み合わせた値の各々に応じた前記組み合わせた値の発生回数を記憶する第1記憶部と、
前記組み合わせた値の全部または一部に対応する各ノードの各々の値に、前記第1記憶部のうち、前記値に対応する前記組み合わせた値に応じた前記発生回数を記憶する領域を示す情報を関連付ける2分探索木の構造のデータを記憶する第2記憶部と、
前記回路の動作中に前記各信号線を流れる各信号値の変化に応じて、前記各信号線を流れる各信号値を組み合わせた値を順次受け付ける受け付け部と、
前記2分探索木から、前記値が前記受け付け部によって受け付けられた前記組み合わせた値に対応するノードを探索し、探索した前記ノードの値に関連付けられた前記情報を出力する探索部と、
前記探索部によって出力された前記情報が示す前記第1記憶部のうちの前記領域に記憶された前記発生回数を更新する更新部と、
を有し、
前記探索部は、
前記受け付け部によって受け付けられた前記組み合わせた値に対応する前記ノードの探索中に、前記受け付け部によって新たに前記組み合わせた値が受け付けられると、前記ノードの探索を中断し、前記2分探索木のうち中断時において検出したノードの値に関連付けて記憶された前記情報を出力し、新たに受け付けられた前記組み合わせた値に対応する前記ノードを探索する、
ことを特徴とするイベント計数装置。
【0184】
(付記2)前記受け付け部は、
前記組み合わせた値を受け付けた順に記憶し、記憶した順に前記組み合わせた値を取り出すことが可能なキュー構造の第3記憶部を有し、
前記探索部は、
前記第3記憶部に最も先に記憶された前記組み合わせた値を取得し、取得した前記組み合わせた値に対応する前記ノードを探索し、前記ノードの探索中に、前記第3記憶部に記憶された前記組み合わせた値の数が所定数以上である場合に、前記ノードの探索を中断し、前記2分探索木のうち中断時において検出したノードの値に関連付けて記憶された前記情報を出力し、前記第3記憶部に最も先に記憶された前記組み合わせた値を新たに取得し、新たに取得した前記組み合わせた値に対応する前記ノードを探索する、
ことを特徴とする付記1に記載のイベント計数装置。
【0185】
(付記3)前記更新部は、
前記探索部によって出力された前記情報が示す前記第1記憶部のうちの前記領域に記憶された前記発生回数に1を加算することによって前記発生回数を更新する、
ことを特徴とする付記1または2に記載のイベント計数装置。
【0186】
(付記4)前記受け付け部は、
前記組み合わせた値に応じた発生回数を前記組み合わせた値に関連付けて前記第3記憶部に格納し、
新たに前記組み合わせた値を受け付けると、新たに受け付けた前記組み合わせた値と同一値が前記第3記憶部に記憶されているかを探索し、
受け付けた前記組み合わせた値と同一値が検出された場合、受け付けた前記組み合わせた値を前記第3記憶部に記憶せず、前記第3記憶部に記憶された同一値に関連付けられた前記発生回数を更新し、
受け付けた前記組み合わせた値と同一値が検出されなかった場合、前記第3記憶部に、受け付けた前記組み合わせた値と、受け付けた前記組み合わせた値に応じた発生回数と、を関連付けて格納し、
前記更新部は、
前記探索部によって出力された前記情報が示す領域に記憶された前記発生回数を、前記第3記憶部に記憶された前記組み合わせた値に関連付けられた前記発生回数に基づき更新する、
ことを特徴とする付記2に記載のイベント計数装置。
【0187】
(付記5)前記受け付け部は、
前記各信号値に対応する重要度に基づいて、前記各信号値を組み合わせた値を生成し、生成した前記組み合わせた値を受け付け、
前記探索部は、
前記受け付け部によって受け付けられた前記組み合わせた値のビットの並びに基づいて、前記2分探索木から、前記値が前記組み合わせた値に対応するノードを探索する、
ことを特徴とする付記1〜4のいずれか一つに記載のイベント計数装置。
【0188】
(付記6)前記受け付け部は、
前記各信号値に対応する重要度に基づいて、前記各信号値から選択した信号値を組み合わせた値を生成し、生成した前記組み合わせた値を受け付ける、
ことを特徴とする付記5に記載のイベント計数装置。
【0189】
(付記7)前記受け付け部は、
前記回路の複数のイベントの各々について前記各信号線を流れる前記各信号値を組み合わせた値を生成し、生成した前記組み合わせた値のうち、前記複数のイベントのうち指定されたイベントに応じた前記組み合わせた値を受け付ける、
ことを特徴とする付記1〜6のいずれか一つに記載のイベント計数装置。
【0190】
(付記8)前記探索部は、
受け付けられた前記組み合わせた値に対応するノードの探索中に、前記2分探索木の深さが特定値となった場合に、前記ノードの探索を中断し、前記2分探索木のうち中断時において検出したノードの値に関連付けて記憶された前記情報を出力する、
ことを特徴とする付記1〜7のいずれか一つに記載のイベント計数装置。
【0191】
(付記9)前記第2記憶部に記憶された前記ノードの値と、前記ノードの値に関連付けられた前記情報と、を取得し、前記第1記憶部に記憶された前記発生回数を取得し、前記2分探索木に含まれるノードのうち前記値に前記情報が関連付けられた前記ノードの各々について、前記ノードの値と、取得した前記発生回数のうち前記ノードの値に関連付けられた前記情報が示す領域に格納された前記発生回数と、を関連付けて提示する出力部を有することを特徴とする付記1〜8のいずれか一つに記載のイベント計数装置。
【0192】
(付記10)前記探索部は、
受け付けられた前記組み合わせた値に対応するノードの探索中に、前記値が前記組み合わせた値の全部または一部に対応するノードがない場合、前記組み合わせた値の全部または一部に値が対応するノードを生成する、
ことを特徴とする付記1〜9のいずれか一つに記載のイベント計数装置。
【0193】
(付記11)前記更新部は、
前記探索部によって新たに前記ノードが生成された場合において、生成された前記ノードの値が前記組み合わせた値の全部に対応する場合、または前記ノードの探索が中断され、生成された前記ノードが中断時において検出した前記ノードである場合に、生成された前記ノードの値に対応する前記組み合わせた値の全部または一部に応じた発生回数を記憶する領域を前記第1記憶部に確保し、確保した前記領域に生成された前記ノードの値に対応する前記組み合わせた値の全部または一部に応じた発生回数を記憶し、
前記探索部は、
新たに生成された前記ノードの値に、前記更新部によって確保された前記領域を示す情報を関連付けて前記第2記憶部に記憶する、
ことを特徴とする付記10に記載のイベント計数装置。
【0194】
(付記12)観測対象の回路に含まれる各信号線を流れる各信号値を組み合わせた値の各々に応じた前記組み合わせた値の発生回数を記憶する第1記憶部と、
前記組み合わせた値の全部または一部に対応する各ノードの各々の値に、前記第1記憶部のうち、前記値に対応する前記組み合わせた値に応じた前記発生回数を記憶する領域を示す情報を関連付ける2分探索木の構造のデータを記憶可能な第2記憶部と、を有するイベント計数装置)が、
前記回路の動作中に前記各信号線を流れる各信号値の変化に応じて、前記各信号線を流れる各信号値を組み合わせた値を順次受け付け、
前記2分探索木から、前記値が受け付けた前記組み合わせた値に対応するノードを探索し、探索した前記ノードの値に関連付けられた前記情報を出力し、
出力した前記情報が示す前記第1記憶部のうちの前記領域に記憶された前記発生回数を更新する、
処理を行い、
前記探索する処理では、
受け付けた前記組み合わせた値に対応する前記ノードの探索中に、新たに前記組み合わせた値が受け付けられると、前記ノードの探索を中断し、前記2分探索木のうち中断時において検出したノードの値に関連付けて記憶された前記情報を出力し、前記2分探索木から新たに受け付けられた前記組み合わせた値に対応する前記ノードを探索する、
ことを特徴とするイベント計数方法。