オープンソースソフトウェアを利用したハードウェアソフトウェア協調検証方法であって、オープンソースソフトウェアであるQemuを改変することにより、Qemuとハードウェアモデルの接続するTLMインターフェースを介して、ハードウェアモデルに対してデータI/Oを行う手段と、ハードウェアモデルをQemu上でエミュレートしているPCIバスに接続されているPCIデバイスとして見せる手段と、SystemCシミュレータからQemuを起動する手段とを備えたオープンソースソフトウェアのPCエミュレータを実現することを特徴とするオープンソースソフトウェアを利用したハードウェアソフトウェア協調検証方法。上述したとおり、ハードウェアソフトウェア協調検証に使用するハードウェアエミュレータの初期導入コストは一般的に非常に高価であり、システムの開発規模と比較して、十分な数のハードウェアソフトウェア協調検証環境を揃えにくいという問題がある。また、ハードウェアエミュレータとハードウェアモデル例えば、SystemCで記述したハードウェアモデルを接続する方法はハードウェアエミュレータにより異なり、ハードウェアソフトウェア協調検証を行う際にハードウェアモデルの一部を書き換える必要がある。本発明の目的は、初期導入コストを安く抑えたハードウェアエミュレータを提供し、ハードウェアモデルとハードウェアエミュレータとを容易に接続する技術を提供することにある。上記目的を達成するため、本発明では、一般に広く用いられているTLMTransactionLevelModelingインターフェースを備えたオープンソースソフトウェアをベースとしたハードウェアエミュレータを提供する。すなわち、本発明は、オープンソースソフトウェアを利用したハードウェアソフトウェア協調検証方法であって、オープンソースソフトウェアであるQemuを改変することにより、Qemuとハードウェアモデルの接続するTLMインターフェースを介して、ハードウェアモデルに対してデータI/Oを行う手段と、ハードウェアモデルをQemu上でエミュレートしているPCIバスに接続されているPCIデバイスとして見せる手段と、SystemCシミュレータからQemuを起動する手段とを備えたオープンソースソフトウェアのPCエミュレータを実現することを特徴とする。本発明によれば、オープンソースソフトウェアのPCエミュレータを改造して使用するので、従来と比較して初期導入コストを低く抑えてハードウェアソフトウェア協調検証環境を構築することができる。TLMライブラリを使用したハードウェアモデルは、そのまま修正を加えること無く、ハードウェアエミュレータに接続可能となる。TLMライブラリを使用したハードウェアモデルは、そのままPCIデバイスとしてOSから認識できるようになる。それにより、組み込みソフトウェアからは、実機と同様に、LSIハードウェモデルに対してMemoryMappedIOPortMappedIOが可能となる。ハードウェアエミュレータとハードウェアモデルとの接続は、数~十数ステップのコードを記述し、コンパイルを実行することにより容易に接続可能である。以下、図面を用いて、本発明の実施の形態を説明する。本実施形態では、オープンソースソフトウェアのPCエミュレータであるQemuを基として、そのQemuのソースコードの変更を行い、Qemuと検証対象であるハードウェアモデルとを接続するTLMインターフェースを介して、ハードウェアモデルに対してデータI/Oを行う手段を追加する。また、Qemuのソースコードの変更を行うことにより、ハードウェアモデルを、Qemu上でエミュレートしているPCIバスに接続されているPCIデバイスとして見せる手段を追加し、さらに、SystemCシミュレータからQemuを起動する手段を追加する。図1は、本実施形態で実現するハードウェアソフトウェア協調検証環境の全体概要図である。図1の各ブロックは、コンピュータ上でソフトウェアを実行することで実現される。すなわち、これらの各ブロックは、HDD等の記憶装置からメモリ等の主記憶装置に読み出され、CPU等の演算部により実行されることで実現される。本実施形態のハードウェアソフトウェア協調検証環境は、オープンソースソフトウェアのPCエミュレータであるQemu部分100と、Qemu上でエミュレートしているPCIバス部分101と、PCIバス部分101上に接続したPCIデバイス部分102と、Qemuとハードウェアモデルの中継ぎを行う中継モジュール部分103と、ハードウェアソフトウェア協調検証対象となるハードウェアモデル部分104と、ハードウェアソフトウェア協調検証対象となるソフトウェア部分105と、ソフトウェア部分105の動作プラットフォームとなるOS部分106とを備える。107はQemu上でエミュレートしているCPU部分であり、108はQemu上でエミュレートしているMCHMemoryControlHub部分であり、109はQemu上でエミュレートしているメモリ部分を示す。107~109は、Qemu100が従来より備えているCPUとMCHとメモリをエミュレートする機能を利用して実現する。PCIバスとPCIデバイスに関し、汎用のPCが持つ幾つかの基本的なPCIデバイスとそれらを接続するPCIバスについては従前よりQemu100が持つ機能で実現している。図1ではそのような基本的なPCIデバイスについては不図示とした。本実施形態では、検証対象のハードウェアモデル104を接続するためのPCIデバイス102に相当する部分をQemu100に追加する必要がある。また、このPCIデバイス102をPCIバスに接続するため、Qemu100のPCIバス101に相当する部分を改変する必要がある。これらPCIデバイス102とPCIバス101は、C言語で記載されているQemuを改変することで実現する。Qemu100とハードウェアモデル104とは、中継モジュール103を介して接続する。中継モジュール103は、SystemCで記述したSystemCモジュールすなわちCレイヤであり、ハードウェアモデル104に対してはTLMインターフェースにて接続する。また、中継モジュール103とPCIデバイス102との接続は、コールバック用の関数ポインタをPCIデバイス102に渡しておく方式により実現する。Qemu100で実現されるPCIデバイス102はC言語レイヤで、中継モジュール103はCレイヤであるので、そのままではPCIデバイス102から中継モジュール103のメソッドを呼び出すことができず、PCIデバイス102から中継モジュール103経由でのハードウェアモデル104に対するデータの書き込みや読み出しを行うことができない。そこで、PCIデバイス102から中継モジュール103へデータ転送を行うときは、コールバック用の関数ポインタにて関数を発行し、データ渡しを行う。中継モジュール103からPCIデバイス102へのデータ転送も同様の方式である。これらの実装は、実際のハードウェア構成でいうと、PCIデバイス部分102はPCIカードに相当し、ハードウェアモデル104はそのPCIカード上に実装されたLSIに相当する。検証対象のハードウェアモデル104は、SystemCおよびTLMインターフェースを使用して記述したものを使用する。SystemCおよびTLMインターフェースは、従来より知られている数多くのハードウェアシミュレータで使用されている形式であるので、既にそのようなハードウェアモデルを作成済みであればそれをそのまま使い回すことができる。図2は、中継モジュール103のクラス定義実装例である。中継モジュール103は、予めユーザが、SystemCで作成しておく。図2の201はハードウェアモデル104との接続ソケットであり、202はPCIデバイス102からコールバックされるデータ書き込みメソッドであり、203はPCIデバイス102からコールバックされるデータ読み込みメソッドであり、205は中継モジュール103のコンストラクタであり、図2の206はデータ書き込みメソッド202の実装から発行されるメソッドであり、207はデータ読み込みメソッド203の実装から発行されるメソッドである。図2の中継モジュール103のクラスからオブジェクトを作成する際にコンストラクタ205が実行され、これにより各種のテーブル領域の確保や初期設定が行われる。コンストラクタ205の実装例はここでは省略するが、後述する図5のステップ502以降の初期設定処理はコンストラクタ205の実装により実現されるものである。図3は、図1のハードウェアソフトウェア協調検証環境の動作開始時の処理の流れを示すフローチャートである。Qemuによるエミュレーションの処理は、後述する図4のQemuのメインループ処理により実行されるが、そのメインループ処理が開始される前に、図3の310と320の処理が実行される。前処理310は、ハードウェアモデル104をOS106からQemu上でエミュレートしているPCIバス101に接続されているPCIデバイス102として見せる手段を実現するための処理である。この処理は、GNUgcc拡張機能attributeにより、main発行前に発行される処理である。ステップ311で、DeviceInfoテーブルの領域を確保し属性を設定する。DeviceInfoテーブルは、PCIデバイス102をエミュレートするために利用する構造体である。図7cに、DeviceInfoテーブルテーブル3の構造体の一部領域の設定例を示す。PCIデバイス識別名文字列は、ハードウェアモデル104を接続するためのPCIデバイス102を特定する識別名の文字列である。PCIデバイス説明文字列は、PCIデバイス102を説明する文字列である。PCIDeviceテーブルサイズは、本PCIデバイス102に対応するPCIDeviceテーブル図7dで後述するのサイズバイト数である。PCIデバイス初期化関数ポインタは、PCIデバイス102の初期化を実行する関数を指すポインタである。図7cに示すDeviceInfoテーブルはPCIデバイス102に対応するテーブルであるが、PCIデバイス102以外にも汎用のPCが基本的に備えているPCIデバイスが存在し、Qemuでエミュレートする全てのPCIデバイスのそれぞれにはそのPCIデバイスに対応するDeviceInfoテーブルが確保される。それら全てのDeviceInfoテーブルはチェインでつながれ、このチェインを辿ることで、各PCIデバイスに対応するDeviceInfoテーブルへのアクセスを実現できる。このチェインをDeviceInfoテーブルチェインと呼ぶ。DeviceInfoテーブルチェインポインタは、そのDeviceInfoテーブルチェインで繋がれている次のDeviceInfoテーブルを指すポインタである。図3に戻って、ステップ311の後、ステップ312~315で、DeviceInfoテーブルに、PCIデバイス102のPCIデバイス識別名文字列とPCIデバイス説明文文字列とPCIDeviceテーブルサイズバイト数とPCIデバイス初期化関数ポインタを設定する。次に、ステップ316で、当該DeviceInfoテーブルをDeviceInfoテーブルチェインに追加する。次の前処理320は、SystemCシミュレータからQemu100を起動する手段を実現するための処理である。前述したとおり、ハードウェアモデル104のオブジェクトファイルとSystemCライブラリをリンクしたものはSystemCシミュレータとして動作する。そのため、SystemCライブラリには、予め、プログラムのエントリポイントであるmain関数が実装されている。一方、Qemuもエントリポイントであるmain関数を持つ。そこで、Qemuのソースを改造し、元々のQemuのエントリーポイントであるmain関数をコメントアウトし、図3の320に示すようにSystemCシミュレータからQemuを起動するように改変する。この仕組みではSystemCライブラリには予めプログラムのエントリポイントであるmain関数が実装されているので、ステップ321で、このmain関数が起動される。ステップ322で、このmain関数から、同じくSystemCライブラリに実装されているscelabandsim関数が発行される。さらに、ステップ323で、このscelabandsim関数から、scmainという名前の関数が発行される。SystemCシミュレータのエントリポイントはSystemCの記述規則によりscmain関数と定められており、scmain関数の実装はSystemCシミュレータの利用者が行う。本実施形態においては、このscmain関数からQemu100の起動を行う。Qemu100の起動のため、ステップ324で、仮想マシンのインスタンス化を行う。この処理については、図5で詳しく説明する。次に、ステップ325で、ハードウェアモデルLSIハードウェア設計記述104のインスタンス化を行う。ステップ326で、Qemu100による仮想マシンとハードウェアモデル104との相互接続を行う。次に、ステップ327で、SystemCライブラリに実装されているSCSTART関数を発行する。これにより、センシビティリストSCTHREADに登録した処理が開始される。センシビティリストSCTHREADは、ハードウェアモデルをエミュレートするための各プロセスの実行を制御するのに利用するリストである。後述するが、Qemuメインループ処理もセンシビティリストSCTHREADに登録されるので、ステップ327によりセンシビティリストSCTHREADに登録した処理が開始されることで、図1のハードウェアソフトウェア協調検証環境の動作が開始される。図4は、ステップ327により開始されるQemuメインループ処理ステップ401を示す。ステップ402のQemuメインループの処理では、SCTHREADに登録した各処理が実行され、それがループ処理であれば繰り返し実行される。終了が指示されると、ステップ403でQemu終了処理を実行する。図5は、図3のステップ324の仮想マシンのインスタンス化ステップ501の処理の流れを示す。ステップ502では、中継モジュール103のインスタンス化を行う。これは、図2で説明した中継モジュール103のクラスのインスタンス化であり、これにより中継モジュール103のエミュレートが実現される。処理503は、Qemu100とハードウェアモデル104とを接続するTLMインターフェースを介してハードウェアモデル104に対してデータI/Oを行う手段を実現するための処理である。ステップ511では、データI/Oハンドラテーブル領域を確保する。図7aに、データI/Oハンドラテーブルテーブル1の構造体の一部領域の設定例を示す。データI/Oハンドラテーブルには、中継モジュール103のクラスのインスタンスアドレスが設定される。また、ハードウェアモデル104へのメモリマップドライト関数ポインタ、メモリマップドリード関数ポインタ、ポートマップドライト関数ポインタ、および、ポートマップドリード関数ポインタが設定される。これらの関数ポインタは、CレイヤからC言語レイヤへのコールバック関数ポインタであり、I/Oハンドラに相当する。図5の処理に戻って、ステップ511でデータI/Oハンドラテーブルテーブル1の領域を確保したら、ステップ512で、メモリマップドI/OハンドラをデータI/Oハンドラテーブルへ設定し、ステップ513で、ポートマップドI/OハンドラをデータI/Oハンドラテーブルへ設定する。これにより図7aのデータI/Oハンドラテーブルの各I/Oハンドラ関数ポインタ等のデータが設定される。ステップ504では、Qemu100の初期化処理として、Qemuメインループ直前までの処理を実行する。この処理については、図6で詳しく説明する。ステップ505では、Qemuメインループ処理を、センシビティリストSCTHREADへ登録する。図6は、図5のステップ504のQemu100の初期化処理ステップ601の流れを示す。処理602は、ハードウェアモデル104をOS106からQemu100上でエミュレートしているPCIバス101に接続されているPCIデバイス102として見せる手段を実現するための処理である。まずステップ611で、PCIバスモデルを作成する。これは、Qemuのオリジナルな処理であり、PCIバステーブルを作成する処理である。図7bに、PCIバステーブルテーブル2の一部領域の設定例を示す。PCIバステーブルには、PCIバス101に接続している全てのPCIデバイスに対応するPCIDeviceテーブルをチェインしたチェインリストPCIDeviceチェインリストの先頭アドレスを設定する。これにより、図7bのPCIバステーブルからPCIDeviceチェインリストを辿って各PCIデバイスに対応するPCIDeviceテーブルにアクセスできる。上述したように、DeviceInfoテーブルチェインを辿ることにより、各PCIデバイスに対応するDeviceInfoテーブルにアクセスできる。各PCIデバイスに対応するDeviceInfoテーブルとPCIDeviceテーブルを利用することによって、それら各PCIデバイスの動作のエミュレートが実現できる。図7dに、PCIDeviceテーブルテーブル4の一部領域の設定例を示す。PCIDeviceテーブルには、各種PCIコンフィギュレーションレジスタ情報格納領域先頭アドレスと、ポートマップドI/Oハンドラ関数ポインタwriteと、ポートマップドI/Oハンドラ関数ポインタreadと、メモリマップドI/Oハンドラ関数ポインタwriteと、メモリマップドI/Oハンドラ関数ポインタreadとが設定される。図6に戻って、ステップ611で図7bのPCIバステーブルを作成した後、ステップ612では、PCIデバイス102に対応するPCIDeviceテーブルの領域を確保する。他のPCIデバイスについても同様である。これは、DeviceInfoテーブルチェインの先頭から順に辿って各PCIデバイスに対応するDeviceInfoテーブルにアクセスし、そのPCIデバイスに対応するPCIDeviceテーブルの領域を順に確保していく処理である。ステップ613では、PCIバスモデルの接続するPCIデバイスチェインリストへPCIDeviceテーブルアドレスを設定する。この処理は、ステップ612で確保した各PCIデバイスに対応するPCIDeviceテーブルのアドレスをPCIデバイスチェインリストに設定して、各PCIデバイスに対応するPCIDeviceテーブルをチェインで繋ぐ処理である。チェインで繋ぐ順番は、DeviceInfoテーブルチェインで繋がれたPCIデバイスの順と同じである。次に、ステップ614で、DeviceInfoテーブルチェインの先頭から順に、各PCIデバイスに対応するDeviceInfoテーブル図7cのPCIデバイス初期化関数ポインタを読み込み、各種PCIデバイスの初期化関数を発行する。これにより、PCIデバイス102についても初期化関数が発行される。ステップ615では、PCIデバイス102のベンダID、デバイスID、レビジョンID、クラスコードなどの各種PCIコンフィグレーションレジスタ情報を、所定のPCIコンフィグレーションレジスタ情報格納領域に格納し、その領域のアドレスをPCIDeviceテーブル図7dの各種PCIコンフィギュレーションレジスタ情報格納領域先頭アドレスに設定する。ステップ616では、ポートマップドI/OハンドラをPCIDeviceテーブルのポートマップドI/Oハンドラ関数ポインタwriteおよびポートマップドI/Oハンドラ関数ポインタreadに設定する。ステップ617では、メモリマップドI/OハンドラをPCIDeviceテーブルのメモリマップドI/Oハンドラ関数ポインタwriteおよびメモリマップドI/Oハンドラ関数ポインタreadに設定する。以上のように初期設定が為された後、例えば、検証対象のソフトウェア105からハードウェアモデル104に対してメモリ書き込みを行う場合、Qemu100はその書き込み命令を受けて、図7aのコールバック関数ポインタハードウェアモデル104へのメモリマップドライト関数ポインタを利用してデータ書き込みメソッドを発行する。そのデータ書き込みメソッドの実装例は省略するが、そのデータ書き込みメソッドの実装によりメモリ書き込みがエミュレートされる。ハードウェアモデル104に対するメモリ読み出し、ポート書き込み、および、ポート読み出しも同様の方式でエミュレートしている。これにより、Qemu100からハードウェアモデル104に対してデータ書き込みおよびデータ読み込みを行う手段が実現される。また、図7b~図7dで説明した構造体を用意し、図3の310および図6の602の初期化処理を行っており、これによりハードウェアモデル104をPCIバス101に接続されているPCIデバイス102として見せる手段が実現される。