インサーキット・エミュレータ

インサーキット・エミュレータ(ICE)



インサーキット・エミュレータ(英語名: in-circuit emulator、略称: ICE)は、デジタル機器の開発作業に不可欠な支援装置の一つです。特に、マイクロプロセッサCPU)を用いたシステム、例えば組み込み機器やコンピュータの基本入出力システムであるBIOSなどの開発において、対象となるCPUの動作を詳細に制御・観測するために用いられます。

概要



ICEは、中心となるマイクロプロセッサの機能を代替・模倣(エミュレート)するハードウェアを主体とし、これにデバッグ機能を操作するためのソフトウェアが組み合わされたシステムです。実際のマイクロプロセッサが持つ機能に加え、プログラムの特定の箇所で一時停止させる「ブレークポイント」設定といったデバッグに特化した機能が実装されています。通常のソフトウェアによるデバッグでは、実行速度が実時間と異なるため、リアルタイムな挙動が重要なデジタル機器の開発には限界があります。ICEは、実際のハードウェア環境に接続して動作するため、現実のシステムと同じ速度や条件下でのデバッグが可能となります。一般的には「アイス」と略称で呼ばれることが多いです。

(なお、「In-Circuit Emulator」は、米インテル社の登録商標です。)

基本構成と動作



ICEは、通常、開発対象機器のCPUが搭載されるソケットから本来のCPUを取り外し、そこにICEのプローブを接続する形態をとります。これにより、CPUの外部でその動作を実行しながら、主要な信号の変化などを精密に追跡することが可能となります。ICEをCPUソケットに接続することで、最終製品が動作するのと同等の環境下でデバッグが行えます。単にプログラムを停止させるだけでなく、特定のメモリアドレスへのアクセスといった複雑な条件でのブレークや、プログラムが異常な状態に陥った際の強制的な停止など、非常に強力なデバッグ機能を提供します。そのため、ソフトウェア開発だけでなく、ハードウェアの動作検証のためにテストプログラムを実行するなど、ハードウェア開発の分野でも活用されます。多くの場合、PCと接続されて操作されます。

主要な機能



ICEは、プログラムの実行、停止(ブレーク)といった基本的な制御に加え、以下のような多様なデバッグ機能を備えています。

レジスタの表示・変更: CPUが持つ内部レジスタや、特定の機能を持つペリフェラルレジスタ、浮動小数点演算ユニット(FPU)のレジスタなどの値を画面に表示し、必要に応じてその値を開発者が任意に変更できます。これにより、プログラムの実行状態を詳細に確認し、デバッグの状況に合わせて調整することが可能です。

メモリ内容の表示・変更: CPUに接続されているメモリ(メインメモリやキャッシュなど)の内容を表示し、その値を変更することができます。メモリ管理ユニット(MMU)を備えたCPUの場合、プログラムから見た「論理アドレス」だけでなく、実際の物理的なメモリアドレスを指定して操作することも可能です。これにより、ハードウェアレジスタへのアクセスや特定のメモリ領域の状態確認が柔軟に行えます。多くの場合、ソースコード上の変数名などを指定してメモリ内容を操作します。

ブレークポイント: プログラムの実行を意図的に停止させる条件を指定する機能です。ソフトウェアデバッガでも可能な命令指定ブレークに加え、ICEはハードウェアによる実現のため、より多様な条件でブレークを設定できます。例えば、「特定の命令の実行前」だけでなく「実行後」に停止させたり、「特定のメモリアドレスへのデータアクセス」が発生した際に停止させたり、「指定したイベントが設定回数発生」した後に停止させる「カウントブレーク」、「実行経路の追跡(トレース)」が完了した時点で停止させるといった、高度なブレーク条件を設定できます。

ステップ実行: プログラムを機械語の1命令ずつ、あるいはソースコードの1行ずつ実行して、その都度停止させる機能です。ソースコード行単位のステップ実行では、関数呼び出しをまるごと1ステップとするか、関数内部に踏み込むかを選択できる場合があります。また、一部のICEでは、ブレークした状態から過去の実行経路を逆戻りするようなステップ実行が可能なものもあります。コンパイラの最適化によってソースコードの特定の行に対応する機械語が存在しない場合、その行がステップ実行で飛ばされるように見えることがあります。

プログラムトレース: プログラムが辿った実行経路を記録・表示する機能です。実行開始からブレークまでの命令列を機械語またはソースコードで確認でき、タイムスタンプが付加されることで各命令がいつ実行されたかを知ることができます。高度なICEでは、CPUとメモリなどの間で発生したバス信号の動きまで時系列で記録・表示することも可能です。長時間の実行全てを記録することは難しいため、特定の重要なポイント(トリガ)を指定し、その前後または以降の経路を記録するといった使い方が一般的です。主に、予期せぬ例外発生時の原因特定や、リアルタイムなデータアクセスの確認に役立ちます。

プロファイル解析: デバッグとは異なり、プログラムの性能や信頼性を測定する機能です。例えば、特定の処理ブロックの実行時間測定、複数の関数の実行時間の比較、オペレーティングシステムのタスク切り替え状況の表示、コードの網羅率(カバレッジ)測定などが行えます。これらの機能の詳細はICEメーカーによって異なることが多いです。

ICEの変遷



ICEは、対象となるCPUの構造や開発環境の変化に伴い、その形態を変えてきました。

初期のフルICE: CPUの内部回路を基板上に再現する形で実現されたものが存在しました。しかし、CPUの集積度向上や高速化に伴い、この方式はすぐに限界を迎え、比較的短命に終わりました。

高性能CPU用フルICE: 量産型CPUチップにデバッグ用の内部機能が組み込まれるようになり、これを利用して高性能なフルICEが開発されました。しかし、CPUのさらなる高速化により、外部に信号を引き出すこと自体が技術的に困難になり、現実的な方式ではなくなっていきました。

8ビット等のフルICE: 8ビットマイコンなど、比較的低速なCPUを対象としたICEは、外部回路でデバッグ支援機能を実現しやすかったため、プローブ交換で様々なCPUに対応できる製品が存在し続けました。

EVAチップによるICE: CPUメーカーが開発初期段階で提供する評価用チップ(EVAチップ)にデバッグ回路が内蔵されるようになり、これを利用したICEのような開発装置が登場しました。1980年代から2000年頃にかけて、フルICEに代わる形で普及しました。しかし、高価であること、特定のCPUにしか対応しないこと、高速化への対応が難しいこと、組み込みシステムASIC(特定用途向け集積回路)の採用が増加しICEが利用できないケースが増えたことなどの理由から、次第に姿を消していきました。

JTAG ICE: 電子回路の高密度化に伴い、物理的なピンからの信号観測が難しくなったことを受け、回路内部にデバッグ用の専用インターフェースとして標準化されたJTAG(Joint Test Action Group)が広く使われるようになりました。JTAG端子を備えたCPUでは、このインターフェースを通じてレジスタやメモリへのアクセス、ブレークポイント設定、実行制御といったオンチップデバッグ機能が提供可能となりました。JTAGを利用した開発装置は、従来のフルICEに比べて簡便に接続できるため普及が進み、「JTAGエミュレータ」や「オンチップ・エミュレータ」などと呼ばれる中で、「ICE」と名乗る製品も存在しており、分類上は多少の混乱が見られます。

関連項目



デバッガ
オンチップ・エミュレータ
JTAG

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。