English

基礎知識編

ディペンダブルシステム学研究室で取り組んでいるテーマの一つにLSIのテストがあります。 具体的な研究テーマを理解するために、ここでは、LSIのテストとは何か、なぜ重要なのか、どのように実現しているのか、考えるべき問題・課題は何か という基礎となる部分について議論したいと思います。

テストとは

まず初めに、「テスト」とは何かについて考えたいと思います。 テストは、試験、検査、試練といった意味があり、テスト対象物が ある基準を満たしているか(テストにパスするかどうか)を見極める作業のことを指します。 このテストは、生産物を生産者から消費者へ引き渡すという物が世に出る物流において必須の工程で、 いわば卒業試験のようなものになります。 テストにおける基準値やその判別方法は様々ですが、その目的は共通しており、 消費者へ引き渡された生産物が一定の基準値を満たしていることを生産者が保証することです。

では、テストの重要性を簡単な例を考えて見ましょう。 農家(=生産者)がりんご(=生産物)を消費者に販売する場合を考えます。 農家はすべてのりんごを同じように育てますが、 収穫されるりんごは、色、形、大きさ、味にばらつきがあり、1個1個その価値が異なります。 農家Aでは、これらのりんご全てを1個100円(価値の平均値)で販売しているとします。 100円以上の価値のあるりんごもあれば、100円未満の価値しかないりんごもあるとします。 これに対し、農家Bでは、テストを実施し、100円以上の価値のあるりんごのみを 100円で消費者に販売しています。 この場合、当然ですが、消費者は農家Bからりんごを購入するでしょう。 さらに、両農家A,Bが別の果物であるみかんの新規生産を開始し、 同じ価格で販売した場合はどうなるでしょうか? どちらも新製品にも関わらず、やはり農家Bのみかんを消費者は購入するでしょう。

これが、ブランドイメージであり、「テスト」という工程が商品の信頼性や競争力を生み出す原動力となっているといっても過言ではありません。

LSIのテストとは

まず初めに、設計の話からします。 LSIの回路データは、計算機上でプログラミング言語とCADツールを用いて設計されます。 この設計過程では、様々な抽象度、ステップで厳密な検証を重ね、最終的な回路データが製造工程に渡されます。 回路の設計フローを知らない人は、是非一度ウェブで検索してみて下さい。

設計工程の後にはく製造工程があり、電子的な回路データから物理的なLSIが多数製造されます。 LSIの製造はとても複雑で、数多くの工程があります。 興味がある人は、Rnesas Electronics Co. が提供している バーチャル工場見学をチェックしてみて下さい。 最新のLSIはナノメートルレンジの微細なテクノロジで製造されており、1cm角のLSIに数億ものトランジスタが集積されます。 このため、回路の電子データは1つであるにも関わらず、製造工程におけるばらつきや欠陥の混入により、 製造された個々のLSIの特性は異なります。

この製造された特性の異なるLSIから基準値(機能、速度、消費電力等)を満たす(出荷するに値する)LSI(良品)を判別する作業がLSIのテストになります。 このLSIのテストは製造後に最後に1回だけ実施されるわけではなく、ウエハの状態、パッケージ後、バーンイン後と製造工程の様々な段階で実施されます。 これは製造の早い段階で不良品を識別することにより、不良品に対するその後の無駄な製造工程を省略し、製造コストを削減するためです。

このように製造工程では100%完璧な同一を大量にLSIを造り出すことが不可能なので、テストによって出荷に値するLSIを選別することが非常に重要になります。 最先端のテクノロジで製造された製品では、大量の不良品から少量の良品をテストによって選別するというイメージに近い製品もあるそうです。 LSIは、ゲーム機器や家電製品から、IT社会・通信インフラを支える機器や、宇宙・航空といったセーフティクリティカル分野等でも使用されています。 不良品の市場流通は、ブランドイメージや競争力の低下だけにとどまらず、我々の生活に甚大な被害をもたらす可能性があります。 これより、LSIのテストが安心・安全な社会のために非常に重要な技術であることがわかると思います。

LSIをテストする方法

原理的にはとても簡単です。LSIの入力端子に対し、考えうる全ての組み合わせをLSIに印加し、 LSIからの応答とシミュレーションで得られた正しい値である期待値とを比較することでテストが可能です。

具体的な例で考えて見ます。 2入力1出力のANDゲートのみで構成されるLSIがあるとします。 この場合、考えうる全ての入力の組み合わせは、00、01、10、11の4通りで、これに対する期待値は0、0、0、1となります。 製造されたLSIにこの4通りを入力し、全ての出力が期待値と一致すれば良品、そうでなければ不良品と判定されます。

では、128入力1出力のANDゲートで構成されるLSIの場合はどうなるでしょうか? 入力の組み合わせ総数は2^128となり、1GHzのスピードで(1ナノ秒に1個の)パターンを印加した場合でも10^22年の時間を必要とします。 これは現実的な方法とは言えません。では、どのように実際の製品はテストされるのでしょうか?

故障モデル

製造工程で問題となるのは欠陥の混入です。 ここでは、電子的な回路データと製造後のLSIの間の意図しない差異を欠陥とします。 起こり得る欠陥のバリエーションは無限にあり、それらを数え上げる・取り扱うことは不可能なので、結果的に、先程述べたように全ての入力の組み合わせを印加するしかありません。 しかし、これは現実的な解ではありません。

そこで、LSIのテストでは、欠陥の振る舞いを簡略化した扱いやすいモデルを考えることが一般的です。 この欠陥の振る舞いを簡略化したモデルを故障モデルと言います。 故障モデルにも数多くの種類がありますが、代表的なものとして単一縮退故障モデルがあります。 この故障モデルでは、回路中の1本の信号線が0または1に固定されてしまう故障(0縮退故障または1縮退故障)のみを考えます。 つまり、考えるべき故障数は回路中の信号線数の2倍となり、故障を数え上げることが可能となります。 そして、この各故障に対して、その故障を検出するテストパターンを用意しテストを行います。 故障を検出するテストパターンとは、先に述べたように、そのパターンをLSIに印加したときの出力が、 故障のある場合とない場合で異なるパターン、すなわち故障の有無の判別が可能なパターンのことを言います。

再び、先に述べた128入力1出力のANDゲートのみで構成される回路を考えます。 信号線は129本(入力信号線128本と出力信号線1本)ですので、258個の故障が考えられます。 ここで、ある入力信号線の0縮退故障を考えてみましょう。 この故障は128本全ての入力信号線を1とするテストパターンで検出可能であることがわかると思います。 理由は、この故障が存在すればオール1を印加した時の出力が0となり、そうでなければ1となるからです。 この例では、全258個の故障は、たった129個のテストパターンで検出可能ということになります。 その理由は、是非一度考えてみてください。

Stuck at 0

単一縮退故障は、非常にシンプルな故障モデルですが、この故障を検出するテストパターンを用いることで、数多くの欠陥を検出可能であることが知られています。 しかし、この故障モデルで全ての欠陥をモデル化できるわけではありませんので、他の故障モデルと併用されるのが一般的です。 もちろん、実際の欠陥に近い故障も出るであればあるほど、その欠陥検出能力も高くなりますが、逆に取り扱いやすさが低下する傾向にあります。 したがって、どのような故障モデルを想定するかによって、テストの品質(良品と不良品の判別精度)やテストのコストに大きな影響を与えることになります。

故障シミュレーションとテスト生成

次に、LSIのテストの研究をするにあたり必ず勉強する技術である「故障シミュレーション」と「テスト生成」について説明します。 これらの技術に関しては、多くの教科書にも書かれていますし、多くの研究がありますので、詳細はそれらを参考にして下さい。

故障シミュレーションを簡単に説明すると以下のようになります。

各故障に対し、その故障が存在する場合の回路と故障のない回路2つの回路を考えます。 その2つの回路に与えられた入力パターンを印加したときの出力値が異なれば、その故障は検出可能と判定されます。 逆に出力値が同じであれば、その入力パターンではその故障は検出できないと判定されます。 故障リストとしては、想定している故障モデルの全故障の場合もありますし、その部分集合の場合もあります。 また、上記では単一の入力パターンとしましたが、パターン集合として考えることもあります。 このプロセスにより、想定した故障のうち、何個の故障が検出可能かという割合がわかります。この割合のことを故障検出率と呼びます。 近年の回路には、数百万ものゲートが含まれており、数百万から数千万個の故障からなる故障リストを故障シミュレーションで扱う必要があり、 故障シミュレーションの高速化、特に並列化に関する研究が数多くされています。

次にテスト生成です。テスト生成を簡単に説明すると以下のようになります。

言い換えると、その故障が存在する場合としない場合で、異なる出力値を持つ入力パターンを生成することと言えます。 こちらも、故障ではなく故障リストを与えて、テストパターン集合を生成することとして考えることもあります。 実際には、冗長故障と呼ばれる検出不可能な故障が存在する場合がありますので、常にテストパターンが生成可能であるわけではありません。 また、数百万以上のゲートで構成される大規模回路では、テストパターンが存在するにも関わらず、 現実的な時間ではテストパターンを生成することができない場合もあることに注意が必要です。 テスト生成においても、様々な故障モデルに関するテスト生成アルゴリズムやその高速化に関して数多くの研究が行われています。 基本的な考え方をこちらに書きましたので、興味がある方は読んでみてください。

テスト容易化設計:スキャン設計

では次に、代表的なテスト容易化設計であるスキャン設計について説明します。 これらの技術に関しても、多くの教科書にも書かれていますし、多くの研究がありますので、詳細はそれらを参考にして下さい。

テスト容易化設計とは、テストのことを考慮して回路設計を行うことです。 以下では、スキャン設計が、(1) テストのどのようなことを考慮しているのか、(2) どのような回路設計か、 その設計が考慮したことをどのように反映・解決しているか、という順序で説明します。

テストのどのようなことを考慮しているか

順序回路(ほぼ全ての実用回路は順序回路)では、テスト生成が難しく(膨大な計算時間を必要とするこため)、 現実的な時間で高い故障検出率を達成するテストパターンを生成することが困難であるという問題点があります。 この問題点を克服するため、つまり順序回路のテスト生成を容易(現実的な時間で高い故障検出率を達成可能)にするための設計がスキャン設計になります。

では、なぜ順序回路のテスト生成が難しいのかを説明します。 まずは、組合せ回路と順序回路の違いから説明します。 組合せ回路とは、出力が現在の入力の値により定まる論理回路のことで、 順序回路は、出力が現在の入力の値と内部状態の両方により定まる論理回路のことです。 そして、組合せ回路はテスト生成が容易、つまり大規模な回路であっても現実的な時間で高い故障検出率を達成する テストパターンを生成することが可能であるという経験的観測があります。

実は、このページのここまでの部分では、暗黙的に組合せ回路をターゲットにして議論していました。 例えば、故障シミュレーションの説明では、

「各故障に対し、その故障が存在する場合の回路と故障のない回路2つの回路を考えます。 その2つの回路に与えられた入力パターンを印加したときの出力値が異なれば、その故障は検出可能と判定されます。」

と説明していました。 組合せ回路では、その定義より、入力にパターンP1を印加すると、その出力は常にR1となります。 しかし順序回路では、状況が異なります。 2つの異なる時刻にP1を印加した場合、その各時刻での内部状態が異なれば、当然出力値も異なる可能性があります。 繰り返しになりますが、順序回路は現在の入力と内部状態(FFの値)によって、次の時刻の内部状態(FFの値)と出力が決定されます。 上記の故障検出に関する記述を単純に順序回路で言い換えると、以下のようになります。

「各故障に対し、その故障が存在する場合の回路と故障のない回路2つの回路を考えます。 2つの回路に対し、同一の内部状態で同一の入力を印加したときに、その出力値または次の時刻の内部状態が異なれば、その故障は検出可能と判定されます。」

これは正しい記述ではありません。 テスト時にパターンを印加できるのは外部入力のみで、その出力を観測できるのは外部出力のみです。 内部状態は回路外部から直接制御したり、観測することが出来ません。 ある内部状態に設定するためには、複数のサイクルにおよぶ入力パターンの時系列(初期状態からその状態へ内部状態を遷移させるための系列)が必要になります。 同様に、内部状態の観測も、複数サイクルにおよぶ入力パターンの時系列の印加が必要で、その際の出力系列を観測することで内部状態を判定します。 このような入力系列を生成し、LSIに印加した際の出力応答系列がその期待値と異なって初めて故障の有無の判定が可能となります。

組合せ回路では、その時刻での入力パターンを考えればよいのに対し、順序回路では複数の時刻におよぶ入力パターン系列を考えなくてはならず、 これがテストが困難(現実的な時間で高い故障検出率を達成することが困難)である原因となっています。

どのような回路設計か、どのように問題を解決しているか

スキャン設計は、内部状態を回路の外部から直接制御したり、観測することを可能とするテスト容易化設計です。 これにより問題であった、複数の時刻におよぶ入力パターン系列を探索する必要がなくなり、テスト生成が容易(現実的な時間で高い故障検出率を達成可能)になります。

では次に、具体的にどんな回路設計かを説明します。 スキャン設計では、回路の通常動作に加えて、テスト専用の動作を追加します。 このために、新たな1ビットの外部入力であるスキャンイネーブル(SE: Scan Enable)を追加します。 SE=0の場合は通常動作を実現し、SE=1の場合にテスト専用動作を実現します。 このテスト専用動作として、回路中の全てのFFがシリアルに接続されたシフトレジスタ機能を追加します。 また、このシフトレジスタの始点・終点となる外部入力・出力を追加します。 この外部入出力をスキャン入力(SI: Scan Input)・スキャン出力(SO: Scan Output)と呼び、追加されたシフトレジスタをスキャンチェーンと呼びます。

これにより、テスト専用動作では、スキャンチェーンを用いて以下のことが可能となります。

テスト生成時には、回路内部のFFは擬似的に外部入力・外部出力として考えることが可能となるため、 問題であった複数の時刻におよぶ入力パターン系列を探索する必要がなくなり、テスト生成が容易(現実的な時間で高い故障検出率を達成可能)になります。 また、先程の記述である以下も正しくなります。

「各故障に対し、その故障が存在する場合の回路と故障のない回路2つの回路を考えます。 2つの回路に対し、同一の内部状態で同一の入力を印加したときに、その出力値または次の時刻の内部状態が異なれば、その故障は検出可能と判定されます。」

スキャン設計では、故障が存在する場合の回路と故障のない回路に対して、その出力値または次の時刻の内部状態が異なる、 内部状態と外部入力のペアをテストパターンと呼びます。 テスト実行時には、まずテストパターンの内部状態に相当するデータをテスト専用動作を用いてFFに設定します。 これと同時に、テストパターンの外部入力に相当するデータも外部入力に設定します。 この状態でテスト専用動作から通常動作に切り替え、1クロックサイクルだけ通常動作を実行します。 するとその応答は、外部出力と次の時刻の内部状態(FFに新しい値が取り込まれる)となります。 ここで外部出力を観測後、再び通常動作からテスト専用動作に切り替えることで、次の時刻の内部状態(テスト応答)を観測し、故障の有無を判定します。

テストコストについて

このページの最後にテストをするためのコストについて議論したいと思います。

テストはタダではありません。もちろんコストがかかります。 本ページの一番最初のりんごの例に戻ると、 > 「100円の価値のあるりんごを100円のコストをかけて非常に品質のよい選別(テスト)しました。だから、100円の価値のりんごを200円で売ります。」

と言われても、誰もそのりんごを買わないでしょう。 本ページの「テスト」とはで説明したように、テストの品質が重要なのはもちろんですが、そのコストも非常に重要となります。

テスト容易化設計やテスト生成といった追加の設計工程が必要です。 さらに、テスタを用いたテスト実行という工程も必要になります。 これらのテストに関わる工程にかかる設備、ソフトウェア、時間、人件費等がコストとなります。 また、テスト容易化設計では、一般的にテスト専用の機能を追加するため、通常動作の性能低下や回路面積の増加が問題となります。 回路面積の増加は、ウェハ1枚から取れるLSIの個数の減少、つまりLSI1個あたりの製造コストの増加につながります。

そして、このテストコストは、下記に示すテスト品質に関連する項目と一般にトレードオフの関係にあります。

例えば、高い故障検出率を実現しようとすると、テスト生成時間が長くなり、 生成されたテストパターン数も増加します。 このテストのためのデータ量が増加は、テスタのメモリサイズの増加やテスト実行時間の増加にもつながります。 複数の故障モデルを用いて様々な欠陥を検出したい場合も、同様の傾向にあります。 テスト時の過度の電力消費によるIRドロップや温度変動は、回路遅延に影響を与えます。 これらのことを考慮すると、やはりテストデータ量が増加したり、テスト実行時間が長くなるという傾向にあります。

逆に、テストデータ量やテスト実行時間の削減およびテスト品質の向上のためにテスト容易化設計を行う研究も数多くなります。 しかし、この場合は、先に述べたように、テスト容易化設計による回路面積の増加が伴い、LSI1個あたりの製造コストが増加する傾向にあります。

このように、LSIのテストの研究では、テストの品質だけでなく、テストのコスト、製造コスト、さらには製品の性能までを統合的に考えることが非常に重要となります。