インサーキット・エミュレータ(英語:in-circuit emulator、略称:ICE)はデジタル機器の開発装置の1つである。

## 概要

CPUとも呼ばれるマイクロプロセッサの機能をエミュレートするハードウェアを主体としており、実際のマイクロプロセッサと同じ機能を実装し、さらにブレーク・ポイントといったプログラムの実行途中で一時停止するといったデバッグ機能を操作するためのソフトウェアと組み合わされた装置である。ソフトウェアデバッガでは実時間での処理が行えないので、デジタル機器類での組み込みシステムやBIOSといった入出力動作を確認する必要がある開発環境で使用される。ICE(アイス)と呼ばれることが多い。

"In-Circuit Emulator"は、米インテル社の登録商標である。

## ICEの基本形態と動作

基本的には、本来のCPUを外したCPUソケットにICEのプローブを接続する形態をとり、外部でCPUの動作を行いながら主要な信号の変化を追うことが可能である。CPUは多様なデジタル機器に実装されるがICEをCPUソケットにつなぐために、最終製品が動作する環境でデバッグが可能となる。さらに指定したメモリアドレスへのアクセスのような特定条件でのブレークやプログラムが暴走した時に強制ブレークをかけるなどの強力なデバッグ機能を持ち、ハードウェアの動作検証用にテストプログラムを実行するなど、ソフトウェア開発だけでなくハードウェア開発においても用いられる。多くがPCと接続されて操作される。

## ICEの基本機能

ICEは、CPU上のプログラムの実行、停止(ブレーク)以外にも、次のような機能を持つ。

### レジスタの表示、変更

CPUが持っているレジスタ (コンピュータ)の値を表示し、デバッグの状況に応じて任意の値に変更することができる。
表示、変更可能なレジスタは、汎用レジスタ以外にも、SoC毎に定義されるペリフェラルレジスタも含まれる。
CPUレジスタ以外にもFPUレジスタも操作可能なICEもある。

### メモリ内容の表示、変更

CPUに接続されるメモリの値を表示し、デバッグの状況に応じて任意の値に変更することができる。
MMU(メモリ管理ユニット)実装のCPUでは、プログラムから見た論理アドレスによる操作の他、実際のメモリアドレスとなる物理アドレスでの操作も可能である。物理アドレスによるメモリ操作は、主にペリフェラルレジスタの操作に用いられる。
メインメモリの他にもキャッシュ内の値を操作するような機能を持つICEもある。
メモリ操作はアドレス指定により行うことも可能であるが、実際は変数名などのソースコードに準じた名称で行われる。

### ブレークポイント

ICEでは、CPUのプログラム実行を停止させる場所をブレークポイントと呼び、強制ブレークの他にブレークポイントを指定してブレークさせることが可能である。プログラムの任意の命令でブレークさせる機能はソフトウェアデバッガにも存在するが、ICEはハードウェアによりブレークを実現するため、様々なブレークポイントを指定することが可能になる。ICEには以下のようなブレークがある。

- 実行前ブレーク(指定された命令を実行する前にブレークが発生する。ソフトウェアデバッガのブレークポイントと同等)
- 実行後ブレーク(指定された命令を実行した後にブレークが発生する)
- メモリ操作によるブレーク(指定したアドレスをデータアクセスした時にブレークが発生する)
- カウントブレーク(または、カウンタブルブレーク。上記のブレーク発生条件が指定された回数発生した時点でブレークが発生する)
- トレース終了ブレーク(下記、プログラムトレースが終了した時点でブレークが発生する)

### ステップ実行

機械語の1命令、もしくは、ソースコードの1行のみを実行して即ブレークする。ソースコードの1行をステップ実行する場合は、関数呼び出しを1行として関数から戻った時点でブレークする方式と、関数に入ってブレークする方式がある。
またICEによっては、ブレークした時点から逆戻るステップ実行も可能である。コンパイラの最適化によってコードが別の場所に移動した結果として、該当ソース行に相当する機械語がなくなる場合があり、その場合は該当ソース行は抜かされているように見える(また、該当ソース行には相当する機械語が存在しないため、ブレークポイントは設定できない)。

### プログラムトレース

プログラムの実行経路を表示する機能である。基本は実行開始からブレーク発生までに実行した命令を機械語もしくはソースコードにより表示する。表示にはタイムスタンプも付加されるため、命令を実行したタイミングを時間により確認することができる。また、フルICEでは、実際に発生したバスの動きをタイムスタンプと共に表示するとも可能である。
長時間のプログラム実行では全ての動作をトレースすることは不可能なため、キーとなるポイント(トリガポイント)を指定し、そのポイントまで、その前後、またはそれ以降のプログラムトレースを行うように指定することもある。
主に、不正な例外が発生した場合の不正処理の発生源の特定や、リアルタイムにデータのアクセスを確認することに用いられる。

### プロファイル解析

プログラムのデバッグではなく、プログラムの性能(実行時間等のパフォーマンスや、品質の信頼性など)を測定することが可能である。
この機能は統一的な仕様が無いため、ICEメーカ各社で表現や機能が異なることが多い。代表的な機能としては、2点間実行時間測定、関数実行時間比較、タスク遷移表示、カバレッジ(コード網羅率)測定などがある。

## ICEの変遷

### 初期のフルICE

最も初期のICEでは、CPUの内部回路をいくつかに分けて基板上に再現したものが存在した。これが古典的なICEであり、CPU回路が複雑化し動作速度も向上すると、外部でフリップフロップ回路をつないでいたのでは対応できなくなり、初期のフルICEの方式は比較的短命であった。

### フルICE

量産されるCPUチップでも、動作確認用に内部回路の読み出し機能やブレークポイント機能はダイ上に設けられることが多く、僅かなボンディング操作や専用コードの実行によってEVAチップと同様にICE用に使用できるCPUチップが得られた。こういったチップを使って高性能なフルICEを作る事ができた。CPUの動作速度が早くなると、メモリアクセスでのウェイト数の増加程度では収まらなくなり、高性能CPU用のフルICEは現実的ではなくなった。

8ビットのコントローラ製品などは動作速度も遅いため、配線の引き回しや外部に置いたデバッグ支援回路が作り易い。このため、プローブの交換で幾つもの製品に対応できるICE製品が存在した。

### EVAチップによるICE

CPUメーカーでは、評価用チップ(evaluation chip)と呼ばれる、確実な動作までは保証しないが概ね量産品と似たようには動くレベルの試作品の半導体を、大口顧客である電子機器メーカーへ提供することで、量産出荷前に最終製品の開発を始められるようにすることが多い。

CPUメーカーでもこの評価用チップ上にデバッグ回路を作り込むことで、社内での半導体の検証作業を行うことが多く、こういったチップを顧客へ提供し、多少の外部回路と操作用ソフトウェアを加えることで、ICEに似た動作が行えた。これが「EVAチップ」と呼ばれるものであり、1980年代から2000年までの間は、フルICE製品に代ってこのような、ある種のニッチな需要に対する開発装置が製造されて販売されていた。

古典的なものを含めたフルICEやEVAチップを使用したICEも、ともに開発環境として使用するには最強と言えるが、

- 高価格である
- 特定のCPUにしか対応できない
- 高速化したCPUでは外部に信号線を引き回すことが難しい
- 組み込みシステムではASICを採用する例が多くなってきており、ICEを使用できない

といった事情により、1980年代中ごろから徐々に、特に高速で高性能なCPU用としてはICE製品そのものが少なくなり、1990年代を通じてEVAチップやそれと同等のチップを用いたICE製品はしだいに少なくなった。

### JTAG ICE

デジタル製品では、開発時や製造した製品の動作確認等のために外部ピンに多数のプローブを接続して信号を得ていたが、高密度実装によってピンの間隔が狭まったりBGAのような端子そのものが隠れてしまうようになった。これに対応して、デジタル回路の内部に、要所要所の信号を外部に読み出せるようにした専用端子が設けられるようになり、その仕組みは1990年に「JTAG」という名前で標準化された。

JTAG端子は内部的には数珠つなぎになっているので読み出しに時間がかかったり、回路ブロックそのものが停止すれば読み出せなくなるなど、ロジックアナライザ用やICE用の信号を得る手段としては万全ではないが、フルICEに比べて簡便なプローブで接続できるため、多くの大規模ロジック回路を持つ半導体製品用の開発装置として利用され、JTAGエミュレータやROMエミュレータなどのオンチップ・エミュレータを使用することが多くなってきている。このような開発装置の中には「ICE」と名乗るものもあり、従来型のフルICEとの違いで多少の混乱がある。

JTAG ICEでは、レジスタ読み書き、メモリ読み書き、ブレークポイント設定、実行、停止、ステップ実行などの機能回路が集積されたJTAG端子付き CPU にて、JTAG端子経由にてオンチップデバッグ機能を提供可能である。