インサーキット・エミュレータ(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