本発明の特徴について説明する前に、本発明の理解を助けるため、および、さまざまな用語の意味を提示するために、従来技術に関していくつかの詳細な事項について説明する。
本明細書において、「コンピュータシステム」という用語は、可能な限り最も広い意味を含み、独立(スタンドアローン)のプロセッサ、ネットワーク化されたプロセッサ、メインフレームプロセッサ、およびクライアント/サーバ関係にあるプロセッサを含むが、これらに限定されない。「コンピュータシステム」という用語は、少なくともメモリおよびプロセッサを含むものと理解されるべきである。一般に、メモリは、いろいろなときに、実行可能プログラムコードの少なくとも一部を格納し、プロセッサは、その実行可能プログラムコードを構成する命令を実行する。
本明細書において、「組込みコンピュータシステム」という用語は、組込み中央プロセッサとオブジェクトコード命令を有するメモリとからなるが、これに限定されない。組込みコンピュータシステムの例には、携帯情報端末(PDA)、セルラ電話機およびディジタルカメラがあるが、これらに限定されない。一般に、どんなに原始的であっても、中央プロセッサを用いてその機能を制御する機器は、組込みコンピュータシステムを有するということができる。組込み中央プロセッサは、メモリに格納されたオブジェクトコード命令を実行する。組込みコンピュータシステムは、キャッシュメモリ、入出力デバイスおよびその他の周辺装置を有することが可能である。
理解されるように、「所定オペレーション」という用語および「コンピュータシステムソフトウェア」という用語は、本明細書の目的では、実質的に同じものを意味する。本発明の実施にとって、メモリおよびプロセッサが物理的に同じ場所に位置する必要はない。すなわち、プロセッサおよびメモリが物理的に異なる装置にあることや、地理的に異なる場所にあることも予期される。
本明細書において、当業者には理解されるように、「媒体」あるいは「コンピュータ可読媒体」は、ディスケット、テープ、コンパクトディスク、集積回路、カートリッジ、通信回線を通じてのリモート伝送、あるいはその他の同様の、コンピュータが使用可能な媒体を含むことが可能である。例えば、コンピュータシステムソフトウェアを分散させるため、供給業者(サプライや)は、ディスケットを提供することも可能であり、また、衛星伝送、直接電話リンク、あるいはインターネットを通じて何らかの形で所定オペレーションを実行する命令を伝送することも可能である。
コンピュータシステムソフトウェアは、ディスケットに「書き込まれる」ことも、集積回路に「格納される」ことも、通信回線を通じて「伝送される」ことも可能であるが、理解されるように、本明細書の目的では、コンピュータ使用可能媒体は、所定オペレーションを実行する命令を「有する」ということにする。すなわち、「有する」という用語は、所定オペレーションを実行するための命令がコンピュータ使用可能媒体に関わる上記およびすべての等価な方法を含むことを意図するものである。
したがって、簡単のため、「プログラム製品」という用語は、以下、任意の形式で所定オペレーションを実行するための命令を有する(上記で定義)コンピュータ使用可能媒体を指すために用いられる。
次に、添付図面を参照して、本発明の特徴の詳細な説明を行う。
VHDLプロセスと、軽量オペレーティングシステムで実行されるプロセスとの間の顕著な類似性のため、VHDLプロセスを、個別のソフトウェアプロセスとして、軽量オペレーティングシステムを用いて書き、イベントをスケジューリングすることが可能となる。好ましくは、軽量オペレーティングシステムは、メッセージによるプロセス間通信を提供する小さいマイクロカーネルをもとに構築される。メッセージは、関連するパラメータを有するオペレーションコードであり、上記の項目3aのイベント駆動モデルを表現する。好ましくは、メッセージは、プロセス間で受渡しされるシステム構造体にマッピングされるグローバルデータ定義である。イベントのセマンティクスはアプリケーションによって定義される。この場合、プロセス間メッセージは、VHDL信号値の変化についてプロセスに通知するために用いられることも可能である。好ましくは、軽量オペレーティングシステムは、信号線、アドレスバス、データバスおよびクロック分配方式が少数の基本メッセージから構築されることを可能にする一群のメッセージプリミティブを提供する。好ましくは、マイクロカーネルコアによって供給されるメッセージに加えて、プロセスは、アプリケーション固有のインタフェースをインプリメントするために自己のメッセージコードおよびパラメータを定義することも可能である。その場合、このインタフェースは、共有ライブラリにインプリメントされたルーチンコールのセットにまとめられる。
次に、図2を参照して、電子回路と、その回路をターゲットとするソフトウェアとのコバリデーションを行う本発明の特徴について簡単に説明する。電子回路および制御プログラムは、軽量コンピュータシステムオペレーティング環境で実行される所定のコンピュータ言語を用いてシミュレートされる。S0900で、1つまたは複数の回路記述言語によってモデル化された、コンピュータハードウェアの動作の要素を、選択された軽量オペレーティングシステムの構文およびメソッドに翻訳する。S1000で、電子回路設計の動作記述を、軽量コンピュータシステムオペレーティング環境をターゲットとする前記構文からなるソフトウェアモデルに翻訳する。S1100で、電子回路設計をターゲットとする制御プログラムの部分を命令セットシミュレーションが実行するように、命令セットシミュレータを所定のコンピュータ言語で構成する。S1200で、電子回路設計のソフトウェアモデルを命令セットシミュレーションに結合して、軽量コンピュータオペレーティングシステム環境で実行される試験対象システムを作成する。最後に、S1300で、試験対象システムに刺激を入力することにより、試験対象システムに結果を出力させる。
次に、電子回路および制御プログラムのコバリデーションを行う本発明の特徴についてさらに詳細に説明する。
ステップS0900では、ハードウェア記述言語を調べる。好ましくはVHDL言語がモデル化されるが、本発明の方法および応用は、特定の言語や特定の軽量オペレーティングシステムに限定されない。動作レベルVHDLの制御フローおよび様式は、以下の具体的な点でCに容易にマッピングすることが可能である。
VHDLの変数はCの変数に似ている。その値は、制御がプロセスを離れて戻ってきたときにも保持されている。しかし、その名前のスコープは、それがインスタンス化されたプロセスについてローカルである。したがって、本発明は、VHDLの変数をCのスタティック変数で置き換える。ビットベクタ型は、32ビット幅(32ビットプロセッサで動作する処理系の場合)までは、Cの符号なし整数型に含めることができる。個別ビットアクセスおよびスライス演算はいずれも、シフトおよびマスク演算で実行することができる。
信号は、プロセス間で値を送信するために用いられる。信号の値のスコープは、システム全体を通じてグローバルであるが、その名前は、特定のプロセスについてローカルである。本発明では、プロセスの複数のコピーを、それぞれ相異なる信号(例えば、UART_A_Chip_Select、UART_B_Chip_Select)にアクセスする同一のローカル信号名(例えば、Chip_Select)でインスタンス化することが可能である。「0」や「1」のような単純な信号値と、スライス値とは、マシン内のビットパターンとして容易に表現される。VHDLは、用いられる電気的モデルに依存して、「Z」や「W」のようなこの範囲外の論理値をサポートする。
個々のVHDLプロセスは、一定のナノ秒数の間、または、その信号に関する条件のセットが満たされるまで、その実行をサスペンドすることが可能である。VHDLプロセスが「動作可能」であるための条件を決定することは、言語構文のマッピングにおいてインプリメントされなければならない機能の1つである。
また、VHDL言語は、ハードウェアの実行のフローを制御する構文を提供する。これは、軽量オペレーティングシステムによって用いられるプログラミング言語(この場合はC)の等価な構文にマッピングされなければならない。
好ましくは、シミュレーションシステム内の中央プロセスは、各信号の値を追跡すること、および、その値をモニタするプロセス間に信号変化を分配することの処理を行う。以下の説明でこのプロセスに言及するときには、「ファブリック」プロセスと呼ぶことにする。本発明は、軽量オペレーティングシステムのメッセージ受渡しオペレーションを用いて、プロセス間で、信号値の変化やその他の構文の受渡しを行う。例えば、"wait for N ns"(Nナノ秒ウェイト)というVHDL構文は、次のような2つのユーザ定義パラメータを有するメッセージにより表現される。
Msg WAITFOR{int CLOCKT; int TICKS;}
TICKSパラメータは、VHDLにおけるNパラメータからナノ秒数を提供し、CLOCKTパラメータは、クロック相対同期ポイントを提供する。
メッセージインタフェースは、アプリケーションコードに直接には現れない。すべての相互作用は、マイクロカーネルコア機能を呼び出す共有ライブラリルーチンを通じてなされる。
信号は文字列を用いて命名されるが、opaque型ポインタを用いて参照される。以下のインタフェースルーチンは、信号名と参照の間のマッピングをインプリメントする。さらに、このインタフェースは、信号値の変化について中央制御プロセッサに通知し、信号の値の変化をウェイトする、共有ライブラリルーチンを含む。
・void *fabinit(void): このルーチンは、中央制御プロセスインタフェースライブラリを初期化する。このルーチンは、信号メンテナを使用することになる各プロセスによって1回呼び出されなければならない。
・void *fabric_find_signal(char *SIGNAL): このルーチンは、(グローバルに命名された)SIGNALパラメータを参照するために使用可能なopaque型ポインタを返す。このルーチンは、すべての登録された名前に対する文字列比較を実行し、信号参照が存在すればそれを返す。信号がリスト内にまだない場合、初期値0で作成される。このようにして、プロセスは、特定の順序でインスタンス化あるいは初期化されることは不要である。
・uint fabric_read_signal(void *SYM): このルーチンは、opaque型SYMパラメータによって参照される信号の現在値を、もしそれが定義された(すなわち、非浮遊トライステート)値を有していれば、返す。
・void fabric_set_clock(char *NAME, int INITIAL, int PERIOD): このルーチンは、このプロセスに対する同期オペレーションで用いられるクロック信号を定義する。このルーチンは、ファブリックプロセス内への共有ライブラリ呼出しであり、ファブリックプロセスがすべての遷移を内部的に処理する。INITIALパラメータは、信号の開始値(通常0)を指定し、PERIODパラメータは、遷移間の間隔(すなわち、クロック周期の半分)を質する。これは信号を定義するため、クロックはグローバルであり、複数のプロセスが同じクロックを共有することができる。
・void fabric_tristate(void *SYM, int VALUE): このルーチンは、IEEE論理システムの拡張値の設定およびそれとの比較を可能にする多値論理信号をサポートする。
・void fabric_write_signal(void *SYM, uint VALUE): このルーチンは、opaque型ポインタSYMによって参照される信号の値をVALUEにセットする。
ファブリックプロセスは、信号が、単純な2値ドメイン内で作用しているか、それとも、多値論理を使用しているかを知らなければならない。このドメインは、システムにわたり信号変化を送信するために用いられるインタフェースルーチンによって決定され、処理系は、多値論理ドメインが表現されることを可能にする。それぞれの多値論理ドメインに要求される拡張値の表現を含む個々のCヘッダファイル(例えば、ieee.h)は、個々の論理ドメインをカプセル化することが可能である(例えば、std_logicパッケージ)。
以下の形のWaitルーチンはすべて、CLOCKTパラメータに次の3つの値のうちの1つをとる。0は、非同期オペレーションを意味する(指定された条件が満たされるとすぐにプロセスをスケジューリングする)。−1は、条件がプロセスのクロック信号の立下り端で満たされる場合にプロセスをスケジューリングし、+1は、条件がプロセスのクロック信号の立上り端で満たされる場合にプロセスをスケジューリングする。
・void WaitClk(int CLOCKT): このルーチンは、(CLOCKTパラメータに従って)そのクロックの次の立上りまたは立下り端まで、現在のプロセスをサスペンドする。
・void WaitForc(uint TICKS, int CLOCKT): このルーチンは、TICKS個のクロックティックの間、現在のプロセスをサスペンドする。
・void WaitUntilc(void *SYM, int OP, uint VALUE, int CLOCKT)
・void WaitUntil2c(void *SYM1, int OP1, uint VALUE1, void *SYM2, int OP2, uint VALUE2, int CLOCKT)
・void WaitUntil3c(void *SYM1, int OP1, uint VALUE1, void *SYM2, int OP2, uint VALUE2, void *SYM3, int OP3, uint VALUE3, int CLOCKT): これらのルーチンは、1、2または3個の条件のうちのいずれか1つ以上が(同時に)真になるのをウェイトする。それぞれの条件は、信号SYM、オペレーションOPおよびVALUEである。例えば、"EQ"オペレーションは、SIGNALとVALUEの間の等値性をテストするために用いられる。
上記のルーチンは、プロセス間メッセージを形成し、それをファブリックプロセスに送る。このコントローラプロセスは、信号に対するすべての変化を追跡し、イベントをウェイトしているプロセスをいつ呼び起こすかを決定する。
これらのルーチンは、共有ライブラリにインプリメントされ、Cヘッダファイルを通じてエクスポートされた。また、ヘッダファイルは、ファブリックプロセスによって管理されるグローバルナノ秒ティックカウンタもエクスポートするため、個々のプロセスからのトレース出力は、現在のタイムスタンプでタグ付けされることが可能である。
図3を参照すると、本発明は、それぞれの信号名を前処理する。S1010で、それぞれの信号に対して、本発明は、名前にプレフィクス句"signal_"を付けることによって、内部変数を生成する。したがって、信号CHIP_SELECTへのopaque型ポインタは"static void *signal_CHIP_SELECT"となる。その後、この新しい信号名は、プロセスがインスタンス化されるときに、信号参照に結合される。インスタンス化された信号名がその信号名と同一である必要はない。例えば、signal_CHIP_SELECTは次のようにインスタンス化されることも可能である。
signal_CHIP_SELECT=fabric_find_signal("UART_A_CHIP_SELECT");
VHDLの本体で、プリプロセッサは、信号CHIP_SELECTへの参照を、変数signal_CHIP_SELECTを参照するように修正する。インスタンス化されるとき、変数signal_CHIP_SELECTは、UART_A_CHIP_SELECT信号に結合される。
S1015で、前処理すべき信号名がさらにあるかどうかを判定する。ある場合、S1018で、前処理すべき次の信号名を取得し、プロセス制御フローはS1010に戻って、信号名の前処理を続ける。ない場合、プロセス制御フローはS1020に進む。
図3を参照して、プロセス制御フローがS1020〜S1060に到達すると、どのタイプの動作言語構文が用いられているか、および、その動作言語を、軽量コンピュータオペレーティングシステムをターゲットとする構文にどのように翻訳するかについて判定を行う。好ましくは、使用される動作言語はVHDLであり、翻訳のために用いられる構文はCベースのものである。
S1020で、翻訳されるべき動作言語構文が内部変数への代入であるかどうかを判定する。内部変数への代入である場合、プロセス制御フローはS1025に進む。内部変数への代入でない場合、プロセス制御フローはS1030に進む。
S1025で、VHDL代入からC代入への翻訳が次のように行われる。
VHDL: i_word := 1;
C: static uint i_word;
i_word = 1;
この翻訳の終了後、プロセス制御フローはS1020に戻る。
S1030で、翻訳されるべき動作言語構文が外部変数への代入であるかどうかを判定する。外部変数への代入である場合、プロセス制御フローはS1035に進む。外部変数への代入でない場合、プロセス制御フローはS1040に進む。
ほとんどのインタフェースルーチンは、VHDL−C翻訳が読みやすくかつ理解しやすくなるように設計されたプリプロセッサマクロを通じてアクセスされる。これらのマクロは、信号名と変数名の間の変換を処理する。以下のマクロにおいて、"signal"はVHDL信号の名前を意味する。これらの名前は、上記のopaque型参照へと前処理される。
・uint GetSignal(signal NAME): このマクロは、NAMEという信号の現在値を返す;
・void Signal(signal NAME, uint VALUE): このマクロは、NAMEという信号のVALUEをその(32ビットの)値にセットする;
・void SignalZ(signal NAME): このマクロは、NAMEという信号の値をIEEEのZ値にセットする。
S1035で、VHDL代入から外部信号への翻訳が次のように行われる:
VHDL: a_busp <= '0';
マクロ: Signal(a_busp, 0);
C: fabric_write_signal(signal_a_busp, 0);
生成される代入は、ランタイムインタフェースを通じてファブリックプロセスへの呼出しを生成することになる。この翻訳の終了後、プロセス制御フローはS1020に戻る。
S1040で、翻訳されるべき動作言語構文がウェイトポイントであるかどうかを判定する。ウェイトポイントである場合、プロセス制御フローはS1045に進む。外部変数への代入でない場合、プロセス制御フローはS1050に進む。外部信号への代入と同様に、ウェイトポイントは、次のようなプリプロセッサマクロを用いたインタフェース呼出しにマッピングされる。
・void WaitClk{F|R}(void): これらのマクロはそれぞれ、プロセスクロック信号の次の立上りまたは立下り端をウェイトする;
・void WaitFor{F|R}(uint TICKS): これらのマクロは、TICKSナノ秒間ウェイトする。プロセスは、そのティックにおける、または、次の適当なクロック遷移における実行のためにスケジューリングされる;
・void WaitUntil{F|R}(signal NAME, int OP, uint VALUE)
・void WaitUntil2{F|R}(signal NAME, int OP, uint VALUE, signal NAME2, int OP2, uint VALUE2)
・void WaitUntil3{F|R}(signal NAME, int OP, uint VALUE, signal NAME2, int OP2, uint VALUE2, signal NAME3, int OP3, uint VALUE3): これらのマクロは、ある条件が1、2、または3個の信号に現れるまでプロセスがウェイトすること、および、要求されるクロック同期に従ってプロセスがスケジューリングされることを可能にする。
S1045で、VHDL構文の翻訳は次のように行われる:
VHDL: wait until (startn = '0');
マクロ: WaitUntil(startn, EQ, 0);
C: WaitUntilc(signal_startn, EQ, 0, 0);
ウェイトポイントの翻訳の終了後、プロセス制御フローはS1020に戻る。
S1050で、VHDL制御構文が、等価なC言語オペレーションに翻訳される。この翻訳は、追加のインタフェース呼出しを含むことがある。例として、'if'制御構文の翻訳は次のように行われる:
VHDL: if (resetn = '0') then
マクロ: if (GetSignal(resetn) == 0) {
C: if (fabric_read_signal(signal_resetn) == 0) {
制御構文の翻訳の終了後、プロセス制御フローはS1020に戻る。
図4を参照すると、S1060で、翻訳する必要のある動作言語構文がさらにあるかどうかを判定する。さらにある場合、プロセス制御フローはS1020に進む。さらにない場合、変換プロセスは完了する。
これらの少数の基本変換により、動作VHDLコードをCに翻訳し、そのコードをコンパイルし、軽量オペレーティングシステム用にそれをリンクすることが可能である。CとVHDLの間のマッピングは一対一であり可逆であるため、もとの設計がVHDLで定式化されているか、それとも、翻訳可能Cで定式化されているかで、シミュレーションには差がない。翻訳が正しく実行される限り、結果は同じになる。この翻訳から生じるCのサブセットは依然として強力なプログラミング言語である。これは、ポインタ間接参照や高度なデータ構造体のような特にCPUベースのアルゴリズムを目的とするいくつかの機能を欠いているが、それ以外の点では、ターゲット変更可能設計の出発点として働くことが可能である。分割がわかったら、個々の解(ハードウェアまたはソフトウェア)の機能を十分に活用すべきである。
本発明の特徴によれば、設計のソフトウェアコンポーネントは、ターゲットプロセッサの命令セットシミュレータ(ISS:Instruction-Set Simulator)を用いてシミュレートすることが可能である。一般に、このようなシミュレータは、次の3つの要素を有する。
1.ターゲットプロセッサのオペレーションおよびレジスタのエミュレーション;
2.エミュレートされるプロセッサの状態を表示し、エミュレータのオペレーションを制御する、外部プログラムへのインタフェース、あるいはヒューマンインタフェース;
3.試験対象システムに存在するデバイスを表す外部ハードウェアのエミュレーションへのインタフェース。
シミュレータの高度化と、外部デバイスとの相互作用とに依存して、結果は、試験対象システムの基本機能のみを確認することもあり、あるいは、すべてのプロセスのサイクル精度のシミュレーションを与えることもある。非サイクル精度のISSの構成を、本発明の第1の特徴として以下で説明し、本発明のさらに他の特徴による変形についてはその後説明する。
要素1は、ソフトウェアが、指定されたアーキテクチャによるプロセッサのレジスタをエミュレートすることを要求する。このようなレジスタには、汎用レジスタ、浮動小数点レジスタ、制御レジスタ、および、ユーザソフトウェアから直接にはアクセス可能でない「隠れた」レジスタが含まれるが、これらに限定されない。さらに、レジスタに対するオペレーションもまた、そのようなオペレーションによって引き起こされるステータスおよびエラー情報の生成を含めて、正しくエミュレートされなければならない。
要素2は、外部エージェントへのインタフェースを要求する。好ましくは、ISSは、非常に単純なコマンドラインインタフェースを有し、使用されるコマンドは、図5に示したテーブル1にリストされている。
要素3は、プロセッサに接続されたメモリおよびその他の外部デバイスのエミュレーションを要求する。ISSは、2つの方法のうちの一方を用いてローカルRAMをエミュレートする。RAMの量が小さい場合、ホストマシンのローカルメモリが用いられる。そうでない場合、ディスクスペースを用いて、エミュレートされるRAMを保持する。これにより、実際のマシンより多くの物理メモリを有するマシンのエミュレーションが可能となる。また、これは、障害時のメモリの再検討可能なチェックポイントを提供する。予想されるように、外部ディスクを用いると、シミュレーションはかなり遅くなる。
ISSが外部ハードウェアに応答するためには、そのハードウェアのモデルにアクセスすることができなければならない。本発明の第1の特徴によれば、外部ハードウェアの動作を表すモジュールのセットが、ISS実行可能ファイルにリンクされる。外部デバイスは、外部グルーロジックを通じてCPUアドレス空間にマッピングされると仮定され、ある範囲の(非キャッシュ)メモリアドレスがデバイスへのアクセスを引き起こすようになる。このアクセス範囲は、ハードウェアコマンドによって定義される。
例えば、一般的なUARTインタフェースは、次の5つの機能を有することが可能である。
・void uart_reset(void): このルーチンは、ハードウェアリセット信号の送信をシミュレートするために、ISS初期化中に呼び出される。
・uint uart_fetch(int ADDRESS, int LENGTH): このルーチンは、プロセッサからデバイスへのリード(読出し)要求をシミュレートする。デバイスは、その入力アドレスライン上にADDRESSパラメータが提示されたかのように、LENGTHパラメータによって指定される適当な数のビットを返さなければならない。
・void uart_store(int ADDRESS, int LENGTH, uint VALUE): このルーチンは、プロセッサからデバイスへのライト(書込み)要求をエミュレートする。このルーチンは、ADDRESSパラメータがその入力アドレスラインに提示され、かつ、VALUEパラメータがその入力データラインに提示されたかのように、作用しなければならない。LENGTHパラメータは、有効な値のバイト数を指定する。
・void uart_tick(void): このルーチンは、プロセッサクロックティックごとに呼び出され、データストリーミングやタイマオペレーションをシミュレートするために使用可能である。
・ハードウェアコンポーネントがプロセッサへの割込み信号を発生することを可能にする割込み発生ルーチン。
このエミュレーションは、タイミング情報を含まない。UARTは、イベントが提示されるのと同じクロックティック内に応答している。正確なタイミングが問題とはならない試験ソフトウェアの場合、この単純なモデルで十分であった。
プロセッサは数百メガヘルツのクロックで動作することが可能であるが、このような速度は、命令およびデータがいずれも高速のオンチップキャッシュから来るときにのみ実現される。遅いキャッシュや外部メモリにアクセスすると、CPUの見かけのパフォーマンスは低下することになる。さらに、多くのコデザイン問題の場合、外部ハードウェアは、オフチップRAMにのみ書込みが可能である。このこともまた、ソフトウェア設計に対する制約となる。このようなデータにアクセスするにはデータキャッシュをバイパスしなければならない(結果としてそのデータはキャッシュにロードされるかもしれないが)からである。もちろん、メモリマップドI/Oロケーションへのアクセスもまた、非キャッシュアクセスを通じて行われなければならない。
しかし、このインタフェースは、コンポーネントに対する異なるアクセス時刻をエミュレートしない。すべてのメモリトランザクションは、単一サイクルで完了すると仮定される。
基本インタフェースは、必要に応じて個々の命令エミュレーションから呼び出される次の3つのルーチンを通じて提供される。
・void fetch(iblock *IN, uint ADDRESS1, int NBYTE, uint *ADDRESS2): このルーチンは、(エミュレーション)アドレスADDRESS1からNBYTEバイトをロードし、それを(マシン)アドレスADDRESS2に格納(ストア)する。命令ブロックINは、リソーススコアボーディングのために用いられる。このルーチンは、キャッシュ可能領域ではデータキャッシュ探索を行い、それ以外ではエミュレートされたRAMやデバイスにアクセスする。
・void ifetch(uint ADDRESS1, int MAX, int IX): このルーチンは、命令フェッチアルゴリズムをインプリメントする。これは、(エミュレーション)アドレスADDRESS1から始まるMAX個までのワードを、インデックスIXから始まる(4ワード)命令パイプにロードする。このルーチンは、まず、命令キャッシュを探索した後、データが見つからない場合に8ワードキャッシュラインを充填するためにメモリに進む。
・void store(block *IN, uint ADDRESS, int NBYTE, uint *VAL): このルーチンは、(マシン)アドレスVALから(エミュレーション)アドレスADDRESSにNBYTEバイトを書き込む。また、このルーチンは、キャッシュ可能メモリのためにデータキャッシュを更新する。命令ブロックポインタINは、スコアボーディングのために用いられる。また、これらのルーチンは、キャッシュヒット数、キャッシュミス数、および非キャッシュメモリへのアクセス数についての統計を収集する。
タイミング測定が不要な場合、CPUの最も単純(かつ最も高速)なシミュレーションは、命令を1個ずつフェッチおよびデコードし、次の命令に進む前に各命令の実行を完了することである。インテルI960プロセッサチップを例として用いると、ISSは、キャッシュ動作の十分なエミュレーションを提供する。これは、命令キャッシュおよびデータキャッシュの両方をサポートし、メモリコントローラレジスタ(mcon0〜mcon15)を用いて、データをキャッシュするかどうかを決定する。また、このインタフェースは、メモリマップドハードウェアデバイスにアクセスするためのアドレス空間デコーディングも提供する。ルーチンは、ハードウェアルーチンのうちの1つ(例えば、uart_fetch)を呼び出すか、または、直接にRAMエミュレーションにアクセスする。
ISSは、軽量オペレーティングシステムの下で組込みアプリケーションとして動作する例示的な"hello world"プログラムを実行するために用いられた。この簡単なプログラムは、4個のプロセス、すなわち、UARTドライバ、コンソールプロセス、'hello'アプリケーション、およびアイドルプロセスを含む。また、このプログラムは、オペレーティングシステムのコアと、Cランタイムライブラリも含む。
ターゲットシステムは、開始エントリポイントから開始される。ターゲットシステムは、ブランク記憶領域をゼロにクリアし、制御されたプロセッサリセットを実行して、内部制御レジスタを設定する。初期化ルーチンが、4個のプロセスを作成し、UARTのためのハードウェア初期化ルーチンを呼び出す。このハードウェア初期化ルーチンは割込みハンドラをインストールする。
コンソールプロセスは、UARTプロセスへのメッセージチャネルを開き、UARTキーボードインタフェースからの入力を受け取ることができるようにメッセージのキューをセットアップする。
アプリケーションは、Cランタイムライブラリを用いて、通常のI/Oファイル(stdin、stdoutおよびstderr)をコンソールマルチプレクサプロセスに対して開いた後、printfルーチンを呼び出して、文字列をフォーマットしてメッセージをコンソールに送る。これは、コンソールへのコンテクストスイッチを引き起こし、文字列の前にプロセス名を付加してそれをUARTプロセスに転送する。
UARTは、ハードウェアによって生成されるTx-Available割込みに応答して、文字列を一時に1文字ずつハードウェアに送信する。すべての文字が送られた後、メッセージがコンソールプロセスを通じてアプリケーションに返され、その後、アプリケーションは終了する。
ISSをこのレベルで動作させると、ソフトウェアが正しく動作しているというある程度の信頼性を示すことができる。例えば、アプリケーションとのUARTの動作を制御するソフトウェアは、いつCPUが文字を書くことができるかを示すためにチップによって供給されるステータスフラグを正しく解釈している。さらに、ルーチンは、正しいパラメータおよび連繋で、正しい順序で呼び出されている。また、検出可能なメモリ破損がなく、定義されたメモリ領域の外部へのアクセスもないと仮定することも妥当である。
しかし、このモードでシミュレータを動作させても、実行時間に関する実際の情報は得られない。あらゆる命令は1クロックティックしかかからないと仮定しているからである。命令タイミングモードを動作させ、パイプライントレースをプリントアウトすれば、命令サイクルがどこを進んでいるかが示される。
また、ISSを使用すると、回路内エミュレータを使用しても通常は入手できない情報にアクセスすることもできる。例えば、実際に使用されたレジスタキャッシュの最大深さを決定することや、キャッシュヒット統計とともにフレームこぼれ数をカウントすることも可能である。
また、それぞれの命令が実行された回数をカウントすることも可能である。このようなデータは、特に高集積SOCを製造するとき、プロセッサトレードオフを決定する際に非常に有益である。これは、例えば、より少数の分岐命令によって、ゲート数を少なくするためである。I960アーキテクチャは「予測分岐」命令を備えているが、コンパイラはそれらを使用しない。これらの命令を除去することも可能であり、あるいは、これらの機能を利用可能な別のコンパイラを検討することも可能である。
このレベルの詳細さでも、サイクル精度にはほど遠い。この場合、すべてのバストランザクションが(マルチワードオペレーションを含めて)同じサイクル内で完了するという1サイクルメモリモデルを仮定しているからである。このレベルでのタイミングを正確にモデル化するためには、システムデータバスとそのデバイスの精密なモデルが必要であり、これは、完全なコシミュレーション環境を生成することを必要とする。
次に、完全なサイクル精度の命令セットシミュレーションの構成について説明する。真のハードウェア/ソフトウェアコシミュレーションを可能にするためには、本発明の第1の特徴に要求されるISSの機能を少なくとも含む、選択されたCPUに対する命令セットシミュレータが要求される。
しかし、この機能は、特定のCPUを選択する際に次の3つの主要な要素を無視している。
1.例えば乗算や除算のように、多くの命令は、単一サイクルで実行を完了しない。
2.CPUは、リソース使用衝突がないと仮定して、バスオペレーションがレジスタ間オペレーションと同時に実行可能なように、複数の専用ユニットにわたる内部並列処理をインプリメントしていることがある。
3.内部キャッシュメモリ、外部RAMメモリおよびデバイスへのアクセスは、互いに非常に異なる応答時間を有することがある。これによる通常の効果は単に実行が遅延されるだけであるが、ある重大な場合には(例えば、到来する割込みの相対的タイミングがあるタスクの処理順序を決定する場合)、全体のパフォーマンスにおいて多大な役割を演ずることがある。
次に、電子回路とその電子回路を制御する制御プログラムとを有するシステムの検証のための、ターゲットプロセッサのサイクル精度の命令セットシミュレーションを導出する方法について詳細に説明する。
インテルI960プロセッサを例として用いると、ISSは、命令キャッシュに加えて、次の機能をインプリメントすることによって、I960命令スケジューラをモデル化する。
・並列デコーディングを有する4ワード命令パイプ;
・5個のI960命令パスのエミュレーション;
・結果が利用可能になる前には使用されないことを保証するためのレジスタスコアボーディング;
・分岐や呼出し(コール)のようなパイプライン切断命令の実装;
・完了するのに単一クロック時間より長くかかる命令に対するパイプラインストール。
図6を参照すると、命令パイプラインは、各プロセッサクロックティックの最初に検査される。パイプが完全に満たされてはいない場合、満たすためにifetchルーチンが呼び出される。パイプを満たすのに必要な命令が命令キャッシュに見つからない場合、ifetch擬似命令がスケジューリングされる。この命令は、CPUのバス制御ユニット(BCU:Bus Control Unit)およびメモリパスにおいて実行される(そのため、これらのユニットがビジーである場合には遅延されることがある)。結果的に、この命令が実行されると、8ワードが命令キャッシュラインにロードされる。これらのワードのうちの4個までが、fill_Ipipeルーチンによって、命令パイプラインを満たすために使用される。使用されるワード数は、パイプの状態と、命令キャッシュバウンダリに関する現在の命令ポインタのアラインメントとに依存する。
命令パイプラインにデータがある場合、その値が命令へとデコードされる。一部のI960命令は複数ワードを占めるため、不完全な命令がパイプに存在する可能性があり、その場合(図6の第2のcallx命令の場合のように)、それはデコードすることができない。命令は一度だけでコードされ、デコードされた形がデータ構造体に格納される。また、デコーディングには、命令をスケジューリングするために必要な内部処理ユニット、パイプラインおよびレジスタリソースを識別することも関連する。
CPUが使用中のリソースは、ティックごとに、スコアボード構造体によって表される。命令は、パイプラインから順に取り出され、1つずつスケジューリングされる。スケジューリングは、命令がこのティックの間にすでにコミットされたリソースを要求するとき、もしくは、命令がパイプライン切断を生じるとき、または、パイプライン内にもはやデコードされた命令がないときのいずれかに、停止する。
スケジューラがパイプライン内のスロットを消費した場合、残りのデータが繰り上がり、命令ポインタが更新される。
スケジューリングが完了すると、現在のティックにおいてユニットに入る命令が実行される。完了するのに単一ティックより長くかかる命令は、パイプラインがストールすると、そのリソースを後続のティックに伝搬させる。
図6を参照すると、AGU、MEMパス、ソースレジスタとしてのフレームポインタ、および、デスティネーションレジスタとしてのスタックポインタをロックして、lda命令が現在のティックにおいてスケジューリングされることが可能である。これは、次のcallx命令がスケジューリングされないようにするため、次のcallx命令はパイプにとどまる。lda命令は、実行するのに複数サイクルかかるため、AGUは次のティックでストールし、この命令からのリソースは、この命令がAGUを占有する限り、スコアボードにコピーされる。ldaは、完了すると、そのリソースを解放し、callx命令が開始することができる。次のcallx(これはここで完全にデコードされることが可能となる)は、次の2つの理由で、スケジューリングされない。第1に、このcallxでのリソースクラッシュのためであるが、それだけでなく第2に、callx命令はパイプライン切断(および新しい命令ポインタへの転送)を引き起こすからである。
図6を参照すると、lda命令のエミュレーションは特に複雑ではない。命令デコーディングルーチンは、デスティネーションレジスタおよびメモリオペランドをすでに評価しているため、ルーチンは、レジスタを保持している(ISSメモリ内の)ロケーションを単に更新するだけである。その結果は、検査のために外部観察者に対して表示することが可能であり、スコアボードは、この命令に対する全部で4ティックについてマークされる。
エミュレーションにおいては、デスティネーションレジスタが命令の期間中にアクセス不能とマークされている限り、現実のCPUの場合のように「最終」ティックまで結果の代入を遅延させる必要はない。この便法は、ハードウェアがコシミュレートされているときにはもはや成り立たない。
図7〜図9を参照して、サイクル精度のターゲットプロセッサのモデル化のプロセスについて説明する。S1105で、ターゲットプロセッサがオンボードキャッシュメモリを有するかどうかを判定する。ターゲットプロセッサがオンボードキャッシュメモリを有する場合、プロセスフローはS1115に進み、オンボードキャッシュアクセスを制御するアルゴリズムがモデル化される。ターゲットプロセッサがオンボードキャッシュメモリを有しない場合、プロセスフローはS1120に進む。
S1120で、ターゲットプロセッサが命令パイプラインアーキテクチャを有するかどうかを判定する。ターゲットプロセッサが命令パイプラインアーキテクチャを有する場合、S1130で、命令パイプライン充填プロセスがモデル化される。そうでない場合、プロセスフローはS1135に進む。
S1135で、命令およびリソースの表現を作成する。ターゲットプロセッサのアーキテクチャに依存して、各命令の効果、その命令が要求しロックするターゲットプロセッサ内のリソース、および、その命令の継続時間または終了条件を表現するデータ構造体が定義され初期化される。
図8を参照すると、S1140で、上記で定義されたリソース定義と、現在のマシン状態における命令のアクションとに対するインタプリタを作成することによって、命令がシミュレートされる。
S1145で、ターゲットプロセッサがマルチパスアーキテクチャを有するかどうかを判定する。ターゲットプロセッサがマルチパスアーキテクチャを有しない場合、プロセスフローはS1165に進む。これに対して、ターゲットプロセッサがマルチパスアーキテクチャを有する場合、S1155で、現在のマシン状態において、他の命令が並列に実行されるべきかどうかを判定するアルゴリズムが生成される。他の命令が並列に実行されるべきである場合、プロセスフローはS1140に戻り、並列命令が実行される。そうでない場合、プロセスフローはS1165に進む。
図8および図9を参照すると、S1165で、シミュレートされる命令がマルチサイクル命令であるかどうかを判定する。シミュレートされる命令がマルチサイクル命令である場合、S1170で、上記のようにスコアボードが用意される。次に、S1175で、上記のようにリソースが伝搬され、プロセスフローはS1180に進む。
S1180で、非決定性タイミングが存在するかどうかを判定する。非決定性タイミングが存在する場合、終了の評価を行う。S1190で、現在のマシン状態における非決定性タイミングオペレーションに対する終了条件を判定するアルゴリズムを生成する。ターゲットプロセッサのアーキテクチャに従って、これは、エミュレートされるマシンレジスタ内の値に基づく計算を含むこともあり、また、外部信号の状態を調べるコードを生成することを含むこともある。S1192で、終了条件がチェックされ、命令が終了していない場合、プロセスフローはS1175に進む。命令が終了している場合、前に伝搬されたリソースがクリアされ、命令のシミュレーションは完了する。
図10〜図13を参照して、電子回路と、その電子回路を制御する制御プログラムとを含むシステムのコバリデーションの実行について説明する。S1310で、刺激が試験対象システムに入力される。S1315で、CPUが「動作可能」であるかどうかを判定する。動作可能である場合、プロセスフローはS1340に進む。動作可能でない場合、S1320で、ターゲットプロセッサはストールされ、S1325で、エミュレートされているキャッシュメモリに命令がロードされる。S1330で、キャッシュメモリがロードされているかを判定する。メモリが十分にロードされている場合、S1335で、ターゲットプロセッサがアンストール(ストール解除)される。
S1340で、命令パイプラインが、ターゲットプロセッサの内部データフローモデルから導出される信号のシーケンスを用いて充填される。図11を参照すると、S1345で、ターゲットプロセッサの内部データバスのアクションをエミュレートするために、所定数のクロックサイクルに基づく遅延が実行される。この所定数は、内部データバスの幅に基づき、1〜数クロックサイクルの範囲とすることが可能である。
次に、S1350で、実行に利用可能な命令を解釈するために、ターゲットプロセッサの内部デコードサイクルが実行される。この命令デコードサイクルは、上記のように実行される。
ターゲットプロセッサの内部デコードサイクルが実行された後、S1355で、スケジューリングされた命令が上記のようにパイプライン切断をインプリメントしているかどうかを判定する。パイプライン切断が要求される場合、S1365で、命令スケジューラがストールされる。パイプライン切断が要求されない場合、プロセス制御フローはS1370に進む。
次に、S1320で、スケジューリングされた命令が、適当な命令パイプラインあるいはハードウェアコンポーネントに転送される。適当な命令パイプラインへの命令の転送後、S1375で、各命令のサイクル実行時間が計算される。
図12を参照すると、S1380で、非決定性タイミングが存在するかどうかを判定する。非決定性タイミングが存在する場合、S1390で、S1190で生成された終了条件を判定するアルゴリズムが、各クロックサイクルの終端で実行される。
S1400で、エミュレーションは、計算された命令時間に対するリソース割当てを伝搬させる。S1405で、計算された実行サイクルの終端で利用可能な結果が出力される。この結果は、エミュレートされたレジスタやフラグの値を更新することや、外部信号の値を変化させることを含むことがある。
次に、S1410で、次の命令サイクルで割込みハンドラがスケジューリングされるべきかどうかを判定する。スケジューリングされるべきである場合、S1420で、次の命令サイクルで実行するために割込みハンドラがスケジューリングされる。
図13を参照すると、S1425で、刺激からの結果が試験対象システムから出力される。この出力は、外部観察者に対して示されるシミュレーションの進行の視覚的表示であることも可能であり、あるいは、後の検討や後処理のためのそのような変化のログ(例えば、図20によって例示されるようなトレース出力)の生成であることも可能である。S1430で、試験対象システムに入力されるべき刺激がまだあるかどうかを判定し、もうない場合、プロセスは終了する。まだある場合、プロセス制御はS1310に進む。
次に、試験対象システムへの刺激の入力により、試験対象システムに結果を出力させることについて詳細に説明する。
一般に、いくつかの異なるプロセスが、試験対象システムの異なる部分をシミュレートする。これらのプロセスは試験対象システムに固有であり、ケースバイケースで修正されなければならない。図14を参照すると、設計された試験サイクルを継続的に繰り返して、コシミュレートされるハードウェアおよびソフトウェアを十分に作用させるために、例として、グローバルループコントローラ23が用いられる。試験刺激プロセス24は、「外界」から試験対象システムに刺激を提供する。試験刺激プロセス24のもう1つの機能は、誤った入力がどのように処理されるかを見るために、誤入力を試験対象システムに入力することである。例えば、試験刺激プロセス24は、データ転送トランザクションの応答側として作用し、試験対象システムの再試行メカニズムを試験するために、プロトコルエラーで応答することが可能である。バスアービトレーションプロセス22は、試験対象システムと試験刺激プロセスの間のバスアービトレーションを提供する。試験対象回路21は、単一のプロセスであることも可能であり、あるいは代替例では、回路設計の複雑さに依存して、数個のプロセスであることも可能である。
さらに、信号表示プロセスにより、ステップ実行を行い、グローバル状態に対する個々のステートメントの効果をウォッチすることが可能である。
次に、電子回路のハードウェアモデルを命令セットシミュレーションに結合して、軽量コンピュータオペレーティングシステム環境で実行される試験対象システムを作成することについて、さらに詳細に説明する。
第1段階として、ハードウェアの動作記述を調べ、各ハードウェアプロセスが個別のソフトウェアプロセスによって表現されるプロセス構造が構成される。各プロセス内では、動作記述が、軽量オペレーティングシステムのプログラミング言語に翻訳される。命令セットシミュレータがこの言語で同様にコーディングされる。シミュレータに必要なファブリックプロセスおよび刺激生成プログラムも同様である。第2段階として、プログラミング言語ソースファイルは、軽量オペレーティングシステムが動作するプロセッサに対するオブジェクトコードにコンパイルされる。第3段階として、これらのファイルが、軽量オペレーティングシステムに対するオブジェクトコードとリンクされ、完全な実行環境が形成される。第4段階として、シミュレータが実行されるシステムに、実行可能ファイルがロードされる。第5段階として、シミュレータが、軽量オペレーティングシステムの制御下で実行され、出力が観察される。
次に、図14を参照して、電子回路と、その電子回路をターゲットとする制御プログラムとのコバリデーションのためのコンピュータシステムについて、簡単に説明する。電子回路および制御プログラムは、軽量コンピュータシステムオペレーティング環境で実行される所定のコンピュータ言語を用いてシミュレートされる。また、このコンピュータシステムは、上記のルーチンを使用する。S0900の設計ステップの終了後、コンピュータシステムは、ファブリックプロセス10を有する。ファブリックプロセス10は、複数のグローバル信号の状態を管理する信号メンテナサブシステム12と、ソフトウェアモデルおよび命令セットシミュレータによって使用されるクロック信号を生成するクロックジェネレータサブシステム13と、ソフトウェアモデルおよび命令セットシミュレータからのイベントをウェイトするプロセスキューを管理するキューメンテナサブシステム14と、所定のタイミング間隔で少なくとも1つのプロセスを実行するスケジューラサブシステム16と、少なくとも信号メンテナサブシステム12、クロック信号ジェネレータサブシステム13、キューメンテナサブシステム14およびスケジューラサブシステムの実行を制御する中央制御プロセス11とを有する。
マイクロカーネルサポートプロセス以外に、コンピュータシステムは、ファブリックプロセス10、命令セットシミュレーションプロセス、ならびに、ハードウェアコンポーネントおよび刺激システムを表すプロセスを有し、これらはすべて互いに関連して動作する。コシミュレーション環境の中央制御プロセス11は、次の5個の主要なサブシステムの全体の機能および相互作用を管理する。
(a)すべてのグローバル信号の状態を管理する信号メンテナ12;
(b)クロック信号を生成するクロックジェネレータ13;
(c)イベントをウェイトするプロセスのキューを管理するキューメンテナ14;
(d)各ナノ秒ティックごとにそれぞれのアクティブプロセスを実行するスケジューラ16;
(e)ユーザに対して信号変化を示すディスプレイを駆動するディスプレイジェネレータ15。
試験刺激の例としては、外部インタフェース上でのデータ利用可能性を示す信号がある。また、刺激は、エラー条件、例えば、ECCメモリによって生成されるパリティ検査エラーをシミュレートすることも可能である。
図15を参照すると、シミュレーション環境の全体は、軽量オペレーティングシステム30内の複数のプロセスとして動作する。個々のプロセスには、ファブリックプロセス31、命令セットシミュレーションプロセス32およびVHDLプロセス33、34が含まれる。VHDLプロセス33、34は、モデル化されているハードウェアのインスタンス化されたハードウェアプロセスと一対一に対応する。すべての信号相互作用35は、オペレーティングシステム30によってスケジューリングされたメッセージとして、ファブリックプロセス31を通る。
このようなソフトウェアベースのシミュレーションシステム内では、シングルプロセッサシステムでは真の並行性はないため、見かけ上の並列処理しか達成することができない。これは、信号に対する「同時」変化と時間の概念の問題を引き起こす。考慮すべき次の3つの問題がある。
・問題1: 2つのプロセスが動作可能であり、それらの実行の期間中に、ある信号の値を変化させる場合、その結果は、プロセスが実行される順序に依存することがある。例えば、信号"test"が実行の最初に値'1'を有する場合、
プロセス1: if (test = '1') then test <= '0'; end if;
プロセス2: test <= '1';
プロセス1がプロセス2の前に実行される場合、(素朴な)結果は、実行の終了時に"test"が'1'にセットされるというものである。プロセス2がプロセス1の前に実行される場合、結果は、実行の終了時に"test"が'0'にセットされるというものである。
・問題2: プロセスが変化し、同じ実行期間に、ある信号を読み出す場合、結果は非決定性となる。例えば、次のコードフラグメントを考える。
プロセス1: test <= '1';
if (test = '1') then output <= '1'; end if;
現実のシステムでは、これはoutputを'1'にセットすることもしないこともある。
・問題3: プロセスは、既知の周波数で動作するクロック信号に対する絶対時間の値を必要とする。さらに、絶対時間は、より複雑なデューティサイクルとともに、次のような構文に必要である。
クロックプロセス: clk <= !clk after 5 ns;
従来のVHDLシミュレータは通常、最初の2つの問題を、「デルタ」、すなわち、サブティック同期ポイントの概念により処理する。サブティック同期ポイントを使用すると、すべての信号値は、デルタの最初に固定される。これらの値が信号値に対する要求に応答して出され、デルタの最後にのみ値が更新される。これは、シミュレーションを決定性にし、プロセスのシミュレーションの順序とは独立にするという利点がある。これは、VHDLプログラマに対して、次のデルタへのアラインメントを強制するように余分のウェイト(wait)ステートメントをコードに挿入することを要求する。上記の問題2の場合、この非決定性問題を解決するために、デルタバウンダリを強制するステートメントが挿入される。
プロセス1: test <= '1';
wait for 0 ns;
if (test = '1') then output <= '1'; end if;
プロセス1は一貫してoutputを'1'にセットすることになる。しかし、合成された結果が期待通りに動作するという保証はない。
ファブリックプロセスの現在の実装では、瞬時値が出される(そのため、この例は、ウェイトが暗黙のうちに挿入されているかのように動作する)が、結果は、プロセスの実行の順序に依存する。当業者には明らかなように、システムは、1つの信号に対する単一の「デルタ」内の複数の変化を検出して、これをシミュレーション出力に報告するか、あるいは、他の動作をまねるように実装を変更するように、修正することも可能である。
シミュレータは、絶対時間の値を生成する。ファブリックプロセスのクロックサブシステムは、現在、1ナノ秒の基本タイムスライスを使用しているが、これは、現在のクロック信号の必要な精度を追跡するのに十分である。これは、数GHzのシステムがさらに広まるに応じて、変更される必要があるかもしれない。クロック信号のサポートは、共通のオペレーションのためのインタフェースを単純化するために、中央プロセスに組み込まれた。
ほとんどの動作VHDLは、2つのモードのうちの一方で動作するトリガで書かれる。非同期モードでは、信号変化は、その信号に反応するプロセスを、次のナノ秒で動作可能にした。同期(クロック)モードでは、信号は、クロック信号の端(立上りあるいは立下り)でのみ調べられた。これらのモードは、図2のS1000における動作翻訳中に決定される。プロセスの動作可能性は、前のティックに生じた信号変化と、そのときに起こっているクロック遷移とに基づいて、各ナノ秒ティックの最初に決定された。そのナノ秒ティック中に動作可能となったプロセスは次のティックまで開始されず、「デルタ」メカニズムに類似の環境提供した。
このインタフェース方法の顕著な特徴は、イベントをウェイトしているプロセスが、マイクロカーネルコア内で真のウェイト状態にあることである。すなわち、それらのプロセスは、各クロックティックでチェックされず、システムの残りの部分におけるオーバーヘッドを生じない。ファブリックプロセスは、条件のすべてのチェックを処理する。従来のオペレーティングシステムのオーバーヘッドを除去し、軽量オペレーティングシステムの直下でシミュレーションを実行することによって、本発明は、より高速に動作するのみならず、エミュレートされる状態の表現は、オペレーティングシステム自体のスケジューリングコアを通じて直接にインプリメントされる。
個々のプロセスが翻訳されたコードを実行するため、トレース出力はコンソールに表示することができる。システム全体のECHOVHDL変数が0でない場合、シミュレーション環境は、ナノ秒ティックのタイムスタンプを前に付した文字列を印字することによって信号値の変化が観察者に見えるようにする。コシミュレーション環境内の信号表示サブシステムと組み合わせて、ステップ実行を行い、グローバル状態に対する個々のVHDLステートメントの効果をウォッチすることが可能である。
図16に、プロセッサ40、I/Oデバイス43およびビデオディスプレイ端末41を有するコンピュータシステムの実施例を示す。I/Oデバイス43は、キーボードおよびマウスを含むが、これらに限定されない。タッチパッドのような他のデバイスも使用可能である。さらに、コンピュータシステムは、このコンピュータシステムが本発明のステップを実行することを可能にするように適応したソフトウェア命令を含むメモリ42(図示していないが、プロセッサ40に組み込まれている)を有する。
また、コンピュータシステムは、データリンク44によってプロセッサ40に接続されたサーバ45も含むことが可能である。データリンク44は、従来のデータリンク(例えば、イーサーネット、ツイストペア、FTP、HTTPなど)である。サーバ45は、このサーバに接続されたプログラムライブラリ46へのアクセスを提供する。また、プログラムライブラリ46は、コンピュータシステムが本発明のステップを実行することを可能にするように適応したソフトウェア命令を提供することも可能である。上記のように、プログラムライブラリ46は、当業者に周知の任意のさまざまな媒体(例えば、フロッピー(登録商標)ディスク、ハードディスク、光ディスク、カートリッジ、テープ、CD−ROM、書き込み可能CDなど)上に実現可能である。図16に示したコンピュータシステムでは、メモリ42上のソフトウェア命令により、プロセッサ40は、データリンク44を通じてサーバ45にアクセスすることによって、プログラムライブラリ46にアクセスすることができる。図16に示したコンピュータシステムは、いかなる意味でも限定的であることは意図しておらず、本発明を実施する多数のさまざまなコンピュータシステムを組み合わせることが可能である。
図17に、本発明によってモデル化される例示的なシステムのブロックレベル設計を示す。システムは、I960プロセッサ35、グルーロジック36およびUART37を有する。この例示的システムは、本発明の適用範囲を制限するものではなく、以下の説明に役立てるためのものである。このサンプルシステムは、外部データバスがメモリサブシステム38およびアドレスデコーディンググルーロジック36の両方に接続されたI960命令セットシミュレータを有する。矢印は、信号の一方向性または双方向性を示す。グルーロジック36は、メモリおよびUARTチップ37に対するchip-select信号をドライブするとともに、UART37に対してさまざまな信号提示要求を提供する。この設計は、プロセッサクロックおよびバスクロックという2つのクロックにより、意図的に複数のタイミングドメインに分割された。
コシミュレーション環境を実証するため、I960命令セットシミュレータは、NEC VR4300プロセッサのユーザガイド(User Guide)からの情報を用いて、MIPSアーキテクチャに基づくデータバスにリンクされた。バス上には外部バスマスタリングデバイスがなかったため、システムは、フルMIPSバスのサブセットを使用した。選択された信号のセットは、さまざまなバースト能力とともに、さまざまな応答時間で、デバイスをインプリメントするのに十分であった。
バスは同期モードで動作し、アクティビティはbusclk信号の立上り端でスケジューリングされる。信号およびプロトコルは以下に記載するとおりである。次のバス信号が用いられる。
・SysAD [31..0] 多重化システムアドレスおよびデータバス;
・SysCmd [4..0] データおよびトランザクションタイプを識別するコマンドバス。これは、リードモードに8ワードのバーストを追加するが、エラー指示コマンドおよび外部非応答モードを使用しない;
・EOK 外部デバイスがコマンドを受け入れることができるときにローにセットされる;
・EValid 外部デバイスがバス上に有効なデータを置いたときにローにセットされる;
・PMaster プロセッサが(外部デバイスがリード応答を発行することができるように)バス所有権を解放したときにハイにセットされる。
外部バスマスタリングデバイスのないこの簡単なモデルでは、フルMIPSバスからの他のプロトコル信号は使用されなかった。
プロセッサの視点から、図18を参照すると、バスは次の順序でドライブされる。
1.プロセッサは、EOKがローになる(これは、バスを使用中の外部デバイスがないことを示す)のをウェイトする;
2.プロセッサは、SysAD上にアドレスを、また、SysCmd上に適当なWriteコマンドをドライブする。また、プロセッサは、PValidをローにセットする(これは、バス上に有効なデータがあることを示す);
3.プロセッサは、EOKがハイになる(これは、外部デバイスがコマンドを受け入れたことを示す)のをウェイトする;
4.プロセッサは、SysADバスに、busclkサイクルごとに1個ずつデータワードを順次ドライブし、最後(または唯一)のワードを'no-more'フラグでマークする;
5.最後のデータサイクルの終わりに、プロセッサは、PValidをハイにセットし(これは、プロセッサがもはやバスをドライブしていないことを示す)、SysADおよびSysCmdをトライステートにする。
図19を参照すると、プロセッサリードは次のようになる。
1.プロセッサは、EOKがローになる(これは、バスを使用中の外部デバイスがないことを示す)のをウェイトする;
2.プロセッサは、SysAD上にアドレスを、また、SysCmd上に適当なReadコマンドをドライブする。また、プロセッサは、PValidをローにセットする(これは、バス上に有効なデータがあることを示す);
3.プロセッサは、EOKがハイになる(これは、外部デバイスがコマンドを受け入れたことを示す)のをウェイトする;
4.プロセッサは、PValidをハイにセットし(これは、プロセッサがもはやバスをドライブしていないことを示す)、PMasterをハイにセットしてバスの制御を解放する;
5.プロセッサは、EValidがローにセットされる(これは、外部デバイスがバス上に有効なデータを置いたことを示す)のをウェイトする。次に、プロセッサは、SysADバスから、busclkサイクルごとに1個ずつデータワードを順次読み出す;
6.プロセッサは、EValidがハイにセットされるのをウェイトしてから、PMasterをローにセットし、バスの制御を再び獲得する。
UARTは、次のような非常に単純な信号モデルを使用した。
・uartD{7..0}は、チップとの間での単一データ(非バースト)アクセスをサポートするバイト幅双方向データバスである;
・uartAは、2つの内部レジスタのうちの一方を選択するために用いられる1ビット「アドレス」バスである。アドレス'0'は制御レジスタであり、アドレス'1'はデータレジスタである;
・uartRは、プロセッサがリード要求を発行した場合にローにセットされる;
・uartWは、プロセッサがライト要求を発行した場合にローにセットされる;
・uartSは、UARTを選択するためにローにセットされる。アドレスおよびデータバスの値は、チップが選択されている間中有効でなければならない;
・uartIは、UARTからプロセッサに割込みを通知するためにハイにセットされる。
busclkは、チップに対する同期クロック信号であり、すべての遷移は、クロックの立上り端でサンプリングされる。
UARTは、アドレスおよびデータの値が同時に提示されることを要求するため、グルーロジックは、多重化されたSysADバスからの翻訳を処理しなければならない。
制御レジスタは、まずインデックス番号を書き込んだ後に8ビットのデータを書き込むという2段階アクセスによって、内部UARTレジスタにアクセスするために用いられる。制御レジスタ0は、制御アドレスに制御オペレーションを書き込むことによって直接にアクセスされることが可能である(制御オペレーションは、間接レジスタ番号の範囲外のバイナリ値を有する)。この最小モデルでは、上記テーブル2にリストした制御オペレーションのみがインプリメントされた。これらは、割込み駆動およびポーリングモードの出力(入力はない)を提供するのに十分であった。
システムメモリは、busclkの速度でSysADラインを通じてのバックツーバックバーストモード転送をサポートすると仮定された。メモリコントローラには、プロセッサバス上のSysAD、SysCmd、PMasterおよびEValid信号へのアクセスが許可され、busclkでクロックされた。メモリコントローラは、グルーロジックへのさらに2つの次の信号を使用した。
・memSはメモリchip-selectであり、これは、メモリが、バス上のコマンドおよびアドレスデータのターゲットであったときにローにセットされる;
・memEOKは、メモリコントローラがコマンドを受け入れることができるときに、メモリコントローラによってローにセットされる。
「現実の」コントローラの内部の詳細(例えば、RASおよびCAS生成)はモデル化されず、すべてのメモリアクセスは単一の(バス)クロックサイクルで応答された。
UARTおよびメモリの実装はいずれも、上記のアーキテクチャ仕様によるそれらのオペレーションを制御するために、VHDL信号ライブラリを用いて直接にbehavioral Cで書かれた。さらに、UART実装は、ISSログファイルに出力されるように命令された文字列を格納した。このことは、シミュレータは、シミュレートされたシステムの出力の視覚的記録を生成したことを意味する。グルーロジックは、アドレスでコーディングおよび信号翻訳のための状態マシンを実装するVHDLで、単一のエンティティとして書かれた。VHDLは、S1000の方法に従ってCに翻訳された。
次に、上記の命令セットシミュレータをコシミュレーション環境に統合することについて説明する。ISSをファブリック環境に統合するためには、ISSにいくつかの変更が必要とされた。いったんI/Oオペレーションが予測可能な継続時間のものでなくなると、その変更のほとんどは、タイミングの変更に関するものであった。
ファブリックインタフェース、プロセスの同期クロックおよび信号のセットを初期化するために、次のコードがプロセス初期化シーケンスに追加された。
FabInit();
/* pclock周期を指定する */
fabric_set_clock("pclk", 0, 5);
/* プロセッサ信号の初期状態 */
Signal(PMaster, 0);
Signal(PValid, 1);
/* ドライブされるまでデータおよびコマンドバスは浮遊 */
SignalZ(SysAD);
SignalZ(SysCmd);
単一のプロセッサクロックティックをシミュレートするルーチンは、各ティックを実行する前に、
WaitClkR();
への呼出しを追加することによって、中央ファブリックプロセスからのpclk上の立上り端変化をウェイトするように変更された。これはまた、プロセッサを他のハードウェアコンポーネントと同期させる効果を有する。注意すべき点であるが、このオペレーションのシーケンスは、選択されたデータバスモデルのアーキテクチャによって決定されているため、モデル化されているシステムに固有である。このような統合ステップは、コシミュレートされるそれぞれの設計ごとに実行されることになる。
入出力(フェッチおよびストア)オペレーションの基本的なストラテジは同じままであった。メモリ領域デスクリプタに依存して、データキャッシュ(または命令キャッシュ)をまず参照した後、データがキャッシュにない場合には、外部デバイスのうちの1つがアクセスされる。主な変更は、すべてのアドレスデコーディングがグルーロジックで行われ、「ハードウェア」記述およびdevice_storeルーチンが使用されなかったことである。
インタフェース自体は、上記の説明に従った。例えば、新たなオペレーションは次のように開始された(変数thisはI/O要求データ構造体を指すと仮定する)。
if (GetSignal(EOK) == 0)
{
Signal(Pvalid, 0);
Signal(SysAD, this->addr);
Signal(SysCmd, this->op);
this->memstate = 1;
}
sbmarksb(this->inst, 2);
すなわち、EOKがローにセットされるのをウェイトした後、バス上に信号をドライブする。なお、コマンドが開始されたかどうかにかかわらず、ユニットは次のティックの間ストールされ、リソースは利用可能でないとマークされなければならない。また、このルーチンはそのすべての信号に対してポーリングを行う。ウェイトポイントが'step'ルーチンにあるからである。
外部バスマスタリングデバイス、あるいは、エラー処理がない場合、外部インタフェースは、状態が10個より少ない小規模な状態マシンで捕捉された。また、このマシンは、命令フェッチサイクルも処理した。
このようなシステムに割込み信号を統合する際には特別の注意をしなければならない。シングルプロセス実装では、シミュレートされるプロセッサの割込み処理中の制御レジスタを直接修正することが可能である。コシミュレーションシステムでは、これは、UARTコードにおける
Signal(uartI, 1);
への呼出しと、ISSプロセスにおける対応するテスト
if (GetSignal(uartI) == 1)
{
IGEN(7);
}
によって置き換えなければならない。このアプローチは、バス制御ユニット(Bus
Control Unit)がビジーでありプロセッサが割込みを直ちに処理することができないとき、または、割込みが実行可能になる前に命令フェッチを要求するときに問題を引き起こした。特別の対処がなければ、プロセッサの優先度レジスタが割込み優先度に更新されるまで、割込みは各クロックティックにおいて処理されることになる。
これは、割込み処理が開始されるとセットされるフラグにより処理された。このフラグは、バス制御ユニットにおけるアクティビティ(割込みディスパッチャによってスケジューリングされるアクティビティを含む)がある限り、すべてのパイプラインスケジューリングをバイパスした。このフラグをセットすることは、割込み処理中のレジスタを検査するオペレーションが再びスケジューリングされる前にすべてのI/Oオペレーションが完了してプロセッサ優先度が更新されることを保証した。
プロセッサクロックは、100MHzで動作するようにセットされた。プロセッサ内では、命令キャッシュと命令パイプの間の内部バスは、フルスピードで動作するフル128ビット幅と仮定された。したがって、命令パイプはキャッシュからレイテンシ0で充填される。データキャッシュは、レベル1、すなわち、フルプロセッサスピードにあると仮定された。メモリアクセスはbusclkで動作したため、アクセスあたり1個の(プロセッサ)ウェイト状態を必要とした。
UARTは、9600ボーの外部シリアルラインに接続されていると仮定された。したがって、文字は1ミリ秒ごとに送出された。UART内部にはバッファリングがないため、'Tx Available'信号は、ライトオペレーションごとに1ミリ秒だけ遅延された。
このシステムは、前述のコード例、すなわち"Hello World"プログラムの実行を繰り返すために使用された。図20に示す出力は、MIPS−IIIアーキテクチャCPUを含む開発ボード上で実行された、動作中のシステムを実証している。このアーキテクチャは、シミュレートされているCPU(インテルI960)のアーキテクチャとは異なり、より能力の高いプロセッサがどのようにシミュレーションのために用いられるかを実証している。
ターゲットCPU自体の処理能力が低い場合、ターゲットCPUは、シミュレーション環境をサポートしておらず、適当な時間で結果を出さない可能性がある。軽量オペレーティングシステムのためのデバイスドライバを容易に書くことができるため、迅速なプロトタイピングとシミュレーション環境が提供可能である。シミュレータをシングルCPUに制約する理由はない。
軽量オペレーティングシステムコア自体を除いて、シミュレーションシステムは、特定のマシンアーキテクチャとは独立である。その非常に低いオーバーヘッドおよびメモリ要求により、軽量オペレーティングシステムは、ページングやスワッピングによらずに、利用可能なRAMをシミュレーションのために最大限に利用させることができる。また、このようなシステムは一般に、最小限の外部周辺装置のセットしか必要としないため、従来のワークステーションのためのシミュレーションエンジンあるいはアクセラレータとして高性能CPUの利用することも考えられる。
図16を参照すると、本発明のもう1つの特徴によれば、目的とするターゲットCPUは、通信媒体51を通じてシミュレーションシステム40に接続された開発ボード50上に位置する。通信媒体51は、システム40内に共存するデータバスであることも可能である。ターゲットアプリケーションは、開発ボード50のCPU上で直接実行され、命令セットシミュレータの必要性が回避される。このアプローチは、サイクルレベルの制度を維持するためにCPU命令セットからのサポートを必要とし、任意の与えられたCPUに対するその実現は、すでに説明した原理から導出することが可能である。
本発明のさまざまな特徴についての以上の記載は、例示および説明の目的で提示したものである。これは、網羅的であることや、開示したとおりの形に本発明を限定することは意図しておらず、さまざまな修正および変更が、上記の説明に照らして可能であり、また、本発明の実施により得られる。当業者が、考えている個々の用途に合わせて、さまざまな実施例においてさまざまな修正を施して本発明を利用することができるように、本発明の原理およびその実際的な応用について説明した。
したがって、本発明のいくつかの特徴についてしか具体的には説明しなかったが、明らかなように、本発明の技術思想および技術的範囲から離れることなく、さまざまな変形を行うことが可能である。さらに、頭字語は、単に、本明細書の可読性を高めるために用いられている。注意すべき点であるが、このような頭字語は、用いられている用語の一般性を狭めることを意図しておらず、特許請求の範囲を限定すると解釈されてはならない。