(57)【特許請求の範囲】
【請求項１】
少なくとも２つのプロセスが並列に実行され、プロセス間でデータの通信を行う装置におけるプロセス間通信機構であって、
送信されるべきデータを書き込む領域を書き込み可能領域開始位置を示す第１のインデックスと書き込み可能領域終了位置を示す第２のインデックスで指定し、受信されるべきデータを読み出す領域を読み出し可能領域開始位置を示す第３のインデックスと読み出し可能領域終了位置を示す第４のインデックスで指定し、前記第１、第２、第３および第４のインデックスを配置し、前記第１のインデックスの位置を書き込み処理に応じて進め、前記第３のインデックスの位置を読み出し処理に応じて進め、前記第１のインデックスの位置が前記第２のインデックスの位置と一致した場合に書込みエラーになったとし、前記第３のインデックスの位置が前記第４のインデックスの位置と一致した場合に読み出しエラーになったとする、１回のプロセスの実行周期で送信されるデータ量の２倍のデータの格納容量を有するリングバッファを備え、
前のプロセスの実行周期と次のプロセスの実行周期との間の空き時間において、前記リングバッファを介して、書き込み側プロセスから読み出し側プロセスへ前記データを転送し、
更に前記リングバッファは前記転送周期毎に、前記第２のインデックスを前記第１のインデックスの位置から所定の数進んだ位置に配置し、前記第４のインデックスを前記第１のインデックスの位置に配置し、前記第４のインデックスの位置が前記第３のインデックスの位置より前記所定の数＋１以上進んだ位置に配置された場合に前記リングバッファがオーバーフローになったとする、
ことを特徴とするプロセス間通信機構。
【請求項２】
前記プロセス間通信機構は、ソフトウェアをシミュレートするプロセスと、ハードウェアをシミュレートするプロセスとを並列に実行し、動作を検証するハードウェア／ソフトウェア協調検証装置における機構であることを特徴とする請求項１に記載のプロセス間通信機構。
【請求項３】
前記プロセスの実行周期は、通信のためのデータコピー実行時間よりも充分長い所定の周期であることを特徴とする請求項２に記載のプロセス間通信機構。
【請求項４】
前記プロセスの実行周期において、プロセスの実行の開始と終了において、前記少なくとも２つのプロセスについてバリア同期を取ることを特徴とする請求項１に記載のプロセス間通信機構。
【請求項５】
前記データのやり取りは、プロセスの終了のバリア同期の後、プロセスの開始のバリア同期の前に行われることを特徴とする請求項４に記載のプロセス間通信機構。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並列に動作する２つのプロセス間のプロセス間通信機構に関する。
【背景技術】
【０００２】
近年、ＣＰＵに周辺装置が接続された製品等の動作を検証する場合に、ＣＰＵのソフトウェアと周辺装置の動作をシミュレートするソフトウェア（ハードウェアのモデル化したもの）とをハードウェア／ソフトウェア協調検証装置にインストールし、検証装置上で実行する方法が使用される。このような場合、検証対象のソフトウェア及びハードウェアを検証装置上で実行可能なコードとしてモデル化し, シミュレーションを行う必要があり、ソフトウェアとハードウェアモデルは互いに通信を行う必要がある。このとき、ソフトウェアのプログラムを実行するプロセスと、ハードウェアのモデルのプログラムを実行するプロセスとは並列に実行される。
【０００３】
特許文献１には、計算機相互間のデータの授受方法が開示されている。特許文献２には、共有メモリへの送信側プロセッサと受信側プロセッサのアクセスの競合を削減する技術が開示されている。特許文献３には、複数のＣＰＵ間の通信において、相手のＣＰＵの動作状態によらず、互いの待ち時間を不要とする技術が開示されている。
【特許文献１】特開平６−１３１２４３号公報
【特許文献２】特開平８−２２７４０２号公報
【特許文献３】特開２００２−２０７７１３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
２つのプロセスが並列に実行され、互いにデータを通信する必要のある装置、たとえば、SW/HW協調検証装置上で通信を行う際に解決しなければならない課題としては、以下のようなものがある。
1: シミュレーション上の矛盾の排除
並列に動作するプロセス間通信にＯＳ付属の通信機能などをそのまま使用した場合、２つのプロセスの動作順序によっては、まだ読み出すべきでない、シミュレーション時刻でみるところの未来のデータが読まれてしまう状況が発生する。
2: 高速性の確保
プロセス間通信に、書き込みや読み出しを行うデータの数の通信バッファを使用し, 同期処理中に通信バッファのコピーを行った場合,コピーデータ数およびそのコピー実行頻度が多いと 全シミュレーション時間中にプロセスの並列動作できない時間(=クリティカルパス)の割合が増え, シミュレーションの高速性が損なわれる。
【０００５】
本プロセス間通信機構の課題は、並列に動作するプロセス間の通信において、データの転送の時間順序を守りつつ、プロセスの実行を高速に行うことのできるプロセス間通信機構を提供することである。
【課題を解決するための手段】
【０００６】
本プロセス間通信機構は、少なくとも２つのプロセスが並列に実行され、プロセス間でデータの通信を行う装置におけるプロセス間通信機構であって、送信されるべきデータを書き込む領域と、受信されるべきデータを読み出す領域とを、動的に設定されるインデックスで指定するリングバッファを備え、前のプロセスの実行周期と次のプロセスの実行周期との間の空き時間において、該リングバッファを介して、プロセス間でデータがやり取りされる。
【発明の効果】
【０００７】
本実施形態によれば、並列に動作するプロセス間の通信において、データの転送の時間順序を守りつつ、プロセスの実行を高速に行うことのできるプロセス間通信機構を提供することができる。
【発明を実施するための最良の形態】
【０００８】
図１は、本実施形態の概念を示す図である。
本実施形態では、プロセスの実行周期である所定の周期間隔(コピー実行時間よりも充分長い時間周期たとえば、1ms)毎に, 書き込み側プロセス(procA)から読み出し側プロセス(procB)へデータを転送するプロセス間通信機構であり、 次のような機能を持つ。
・procA側で書き込んだ順に, procB側で読み出す。
・procA側で書き込んだデータは, procB側に送られるまでprocB上のモデルから読み出さない。
・procA側からは, 1ms区間に所定の個数, データを書き込む。
【０００９】
データを送る処理は, n msからn+1msまでの全ての書き込み動作の後, かつn+1msからn+2msまでの全ての読み出し動作の前に行われる(n = 0,1,2...)。図１においては、０ｍｓから１ｍｓのシミュレーションの所定周期において、procAは、所定の数の（図１では、３つの）データの書き込み（push:3、push:4、push:5）を行う。１ｍｓから始まる次のシミュレーション周期において、procBが読み出しをはじめる前（図１では、１ｍｓの時点となっているが、これに限られたものではない）に、procAによって書き込まれたデータがprocB側に送られ、procBは、送られてきたデータを読み出す（pop:3、pop:4、pop:5）。
【００１０】
ここで、本実施形態では、procAの書き込みをリングバッファに行い、procBの読み出しをこのリングバッファから行うようにする。データの転送は、以下に説明するように、リングバッファ上の書き込み、読み出し位置の設定を行うことに対応することになる。これにより、２つのプロセスの書き込み／読み出しタイミングが１つのリングバッファ上で統制されることになり、複数のバッファを設けて、バッファ間でデータをやり取りするという複雑な制御も必要なくなる。
【００１１】
図２は、リングバッファの構成を示す図である。
段数は所定のデータ数の２倍とする。所定のデータ数とは、１回のシミュレーション周期で、書き込みや読み出しを行いたいデータの量であり、シミュレーションの内容などによって適宜設定されるべきものである。リングバッファは、データの書き込み／読み出し量の単位量の領域（コマ）が複数接続された構成とする。
【００１２】
Write-Index１０, Read-Index１１（リングバッファ上のポインタであり、Write-Index１０は、書き込み可能領域の開始位置を、Read-Index１１は読み出し可能の開始位置を示す）を配置し, それぞれに対応する終端インデックス(Write-Terminal１２（書き込み可能領域の終了位置, Read-Terminal１３（読み出し可能領域の終了位置）)を配置する。
【００１３】
Write-Index１０はバッファに書き込みを行うたびにコマを進め, Write-Terminal１２と同じ位置の場合に書き込みを行った場合、オーバーフローになったとし、書き込みエラーとなったとする。Read-Index１１はバッファから読み出しを行うたびにコマを進め, Read-Terminal１３と同じ位置の場合に読み出しを行った場合、アンダーフローとなったとし、読み出しエラーになったとする。
【００１４】
1ms毎の データ転送処理 は, 次の処理によって行う
まず、Write-Terminal１２をWrite-Index１０から所定のデータ数分進んだ位置に配置する。すなわち、Write-Index１０をWrite-Terminal１２から書き込みを行いたいデータ量の分だけ進んだ位置に配置する。次に、Read-Terminal１３をWrite-Index１０の位置に配置する。以上の操作の結果, Read-Terminal１３がRead-Index１１の位置から所定のデータ数+1コマ分以上進んだ位置に配置された場合, バッファオーバーフローの処理を行う。
【００１５】
図３は、データの転送処理タイミングを説明する図である。
シミュレーションの周期が１ｍｓとした場合、データ転送処理を, ｎ.９９９９９９９９ｍｓのタイミングで動作させる。ここで、ｎは整数とする。
【００１６】
２つのプロセスを並列に独立に実行するシミュレーション装置等の場合、同じシミュレーション時刻に動作するモデルの動作順序は非決定的となる。これを回避するため、装置のユーザがモデルの動作に使用できない時刻を使用してデータの送信処理を行う。ユーザは、通常プロセスの動作のプログラミングをナノ秒より大きい時間単位しか使用できないと制約すれば, それ以下のピコ秒単位を使用できない時刻を使用してデータの送信処理を行う。すなわち、ユーザは、シミュレーションの実行制御を１ｎｓ単位でプログラミングすることはできるが、ピコ秒単位では、プログラミングできないため、プロセスの実際の実行時間とプログラミングによる設定時刻との間にピコ秒単位でのタイムラグがあるので、このピコ秒単位のタイムラグを利用して、データの転送を行う。なお、本実施形態では、データの転送は、上記したように、リングバッファ上でのWrite-Index、Write-Terminal、Read-Index、Read-Terminalの設定処理となる。
【００１７】
図３においては、０．９９９９９８ｍｓの時刻（タイミング）において、Model-5、Model-6を処理し、０．９９９９９９ｍｓの時刻（タイミング）において、Model-7、Model-8を処理し、１．００００００ｍｓでModel-1、Model-2を処理している。しかし、０．９９９９９９ｍｓから１．００００００ｍｓの間は、ユーザがモデル処理のためにプログラミングすることはできない時間帯であるので、このような時間帯をデータの送信処理に使う。
【００１８】
図４は、本実施形態に従った、書き込み側プロセス(ProcA)でのシミュレーション全体の処理フローである。
図４に従うと、シミュレーション全体は、シミュレーション(1ms：より一般には、シミュレーション周期：ステップＳ１０)を行った後、バリア同期(A)（ステップＳ１１）をとって、データ転送処理（ステップＳ１２〜Ｓ１４）をし、さらにバリア同期 (B)（ステップＳ１５）をとって、シミュレーション（ステップＳ１０）に戻るステップからなる。
【００１９】
データ転送処理では、Write-TerminalをWrite-Indexから所定の数進んだ位置に配置する（ステップＳ１２）。これによって，次の周期(1ms区間)で書き込むことのできるバッファを確保する。次に、Read-Terminalを，Write-Indexの位置に配置する（ステップＳ１３）。これによって，次の周期(1ms)で読み出すことのできる領域を指定する。そして、Read-TerminalがRead-Index+所定の数より進んだ位置に配置されているか否かを判断（ステップＳ１４）し、ステップＳ１４の判断がＮｏの場合には、ステップＳ１５に進み、Ｙｅｓの場合，バッファオーバーフローとして異常終了する。
【００２０】
バッファ全体の容量は、書き込みたいデータ量である所定の数の２倍確保されており、Write領域(Write-IndexとWrite-Terminalによって示されている領域)はその半分(所定の数)を確保する。従って，Read-IndexとRead-Terminalが示す領域の大きさは所定の数以下でなければならない。
【００２１】
図５は、本実施形態に従った、読み出し側プロセス(ProcB)でのシミュレーション全体の処理フローである。
図５に従うと、シミュレーション全体は、シミュレーション(1ms：より一般には、シミュレーション周期：ステップＳ２０)を行い、バリア同期(A)（ステップＳ２１）をとり、バリア同期(B)（ステップＳ２２）をとるステップからなる。
【００２２】
バリア同期(A), (B) は，並列に動作するProcA, ProcBの動作制御を行う。すなわち、ProcA, ProcBのどちらか片方がバリア同期を処理すると，もう片方がバリア同期を処理するまで次の処理を保留する。バリア同期(A) は，1msのシミュレーションが終了し，データ転送処理を開始するときに処理する。バリア同期(B) は，データ転送処理が終了し，1msのシミュレーションを開始するときに処理する。読み出し側プロセスでは，データ転送処理を行わず、書き込み側プロセスがデータ転送処理を完了するのを待機し、データ転送処理が完了したら、データを読み出す。
【００２３】
図６は、本実施形態に従った、書き込み処理の処理フローである。
ユーザーモデル内で行う書き込み処理は以下のとおりである。書き込みを開始すると、Write-IndexとWrite-Terminalの指し示す位置が同じか否かを判断し（ステップＳ３０）、Ｙｅｓの場合には、バッファオーバーフローとして異常終了する。Write-IndexとWrite-Terminalの指し示す位置が異なる場合、Write-Indexが指す位置へデータを書き込み（ステップＳ３１）、Write-Indexの位置を1つ進め（ステップＳ３２）、書き込み処理を終了する。
【００２４】
図７は、本実施形態に従った、読み出し処理の処理フローである。
読み出し処理は以下のとおりである。Read-IndexとRead-Terminalの指し示す位置が同じか否かを判断し（ステップＳ４０）、Ｙｅｓの場合，バッファアンダーフローとして異常終了する。Read-IndexとRead-Terminalの指し示す位置が異なる場合，Read-Indexが指す位置からデータを読み出し（ステップＳ４１）、Read-Indexの位置を1つ進める（ステップＳ４２）。
【図面の簡単な説明】
【００２５】
【図１】本実施形態の概念を示す図である。
【図２】リングバッファの構成を示す図である。
【図３】データの転送処理タイミングを説明する図である。
【図４】本実施形態に従った、書き込み側プロセス(ProcA)でのシミュレーション全体の処理フローである。
【図５】本実施形態に従った、読み出し側プロセス(ProcB)でのシミュレーション全体の処理フローである。
【図６】本実施形態に従った、書き込み処理の処理フローである。
【図７】本実施形態に従った、読み出し処理の処理フローである。
【符号の説明】
【００２６】
１０      Write-Index
１１      Read-Index
１２      Write-Terminal
１３      Read-Terminal
【図１】
0005228552.tif 000002
【図２】
0005228552.tif 000003
【図３】
0005228552.tif 000004
【図４】
0005228552.tif 000005
【図５】
0005228552.tif 000006
【図６】
0005228552.tif 000007
【図７】
0005228552.tif 000008