(57)【要約】製造されたプロセッサ上でランダムに生成され、ランダムに実行される実行ファイルの実行に基づいて、プロセッサを設計する方法を提供する。極めて特有なテスト生成制約ルールと組み合わせて、プロセッサのテストにおいて複数のレベルでランダム化を実施することによって、マイクロアーキテクチャ機能に高度にフォーカスを合わせたテストが、高度のランダム順列を、その特有の機能にストレスを加えるように同時に適用しながら実施される。これにより、従来のテスト方法では検出できなかったプロセッサのエラー及びバグの検出及び診断が可能になる。エラー及びバグが検出され、診断されると、異常が発生しないようにプロセッサを再設計することができる。プロセッサのエラー及びバグを除去することによって、計算効率及び信頼性が向上したプロセッサを製造することができる。【選択図】図１
2021521521.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサをデバッグする方法であって、
複数のテストタイプ毎にテンプレートファイルの入力を受信することと、
前記複数のテストタイプからの特定のテストタイプ毎に、
前記特定のテストタイプの各々のテンプレートファイルに従って、第１の所定数のランダム化されたサブテストを生成することと、
前記第１の所定数のランダム化されたサブテストを前記特定のテストタイプのテストバイナリにコンパイルすることと、
複数のテストタイプの各々の前記テストバイナリをリンクして、テストライブラリを形成することと、
前記テストライブラリからテストバイナリのサブセットをランダムに選択することと、
各テストバイナリの制御データ構造に従って、前記プロセッサのいくつかの物理スレッド上でテストバイナリの選択されたサブセットの各々を実行することであって、テストバイナリのサブセットの各テストバイナリから特定のランダム化されたサブテストをランダムに選択することと、選択された特定のランダム化されたサブテストの各々を実行することと、を含む、ことと、
実行中に１つ以上のエラーを検出することと、
検出された１つ以上のエラーに基づいて前記プロセッサを再設計することと、を含む、
方法。
【請求項２】
前記特定のランダム化されたサブテストをランダムに選択することは、置換ポリシーを有するサンプルを使用して実行される、
請求項1の方法。
【請求項３】
前記特定のランダム化されたサブテストをランダムに選択することは、置換ポリシーを有していないサンプルを使用して実行される、
請求項１の方法。
【請求項４】
前記特定のランダム化されたサブテストをランダムに選択することは、任意に選択されたサブテストの一時的なプールを生成し、前記一時的なプールからランダムにピッキングすることによって実行される、
請求項１の方法。
【請求項５】
前記制御データ構造は、前記選択された特定のランダム化されたサブテストを実行するためのページングモードをさらに指定し、
前記実行することは、前記ページングモードに従って実行される、
請求項１の方法。
【請求項６】
前記ページングモードは、各テストバイナリ全体で使用されるデフォルトのページングモードである、
請求項５の方法。
【請求項７】
前記ページングモードは、前記特定のランダム化されたサブテストの各々が実行された後にランダムに切り替えられる、
請求項５の方法。
【請求項８】
前記実行することは、前記特定のランダム化されたサブテストの各々が行われた後に、前記特定のランダム化されたサブテストの物理コードを可変数のバイトだけランダムにシフトすることをさらに含む、
請求項１の方法。
【請求項９】
前記制御データ構造は、前記実行することのタイムアウトを指定し、
前記方法は、
前記タイムアウトが満了した後に、前記テストライブラリからテストバイナリの新たなサブセットをランダムに選択することをさらに含む、
請求項１の方法。
【請求項１０】
前記特定のテストタイプの各々のテンプレートファイルは、前記テンプレート内の演算の相対頻度を指定する重み付けファイルを含み、
前記第１の所定数のランダム化されたサブテストは、前記相対頻度に基づいて生成される、
請求項１の方法。
【請求項１１】
前記特定のテストタイプの各々のテンプレートファイルは、前記テンプレート内のループのサイズ及び反復範囲を指定する重み付けファイルを含み、
前記第１の所定数のランダム化されたサブテストは、前記ループのサイズ及び反復範囲に基づいて生成される、
請求項１の方法。
【請求項１２】
前記特定のテストタイプの各々のテンプレートファイルは、前記テンプレート内の巡回符号ブロックを指定する重み付けファイルを含み、
前記第１の所定数のランダム化されたサブテストは、前記巡回符号ブロックに基づいて生成される、
請求項１の方法。
【請求項１３】
前記特定のテストタイプの各々のテンプレートファイルは、前記テンプレート内のレジスタ使用を指定する重み付けファイルを含み、
前記第１の所定数のランダム化されたサブテストは、前記レジスタ使用に基づいて生成される、
請求項１の方法。
【請求項１４】
前記特定のテストタイプの各々のテンプレートファイルは、前記テンプレート内の分岐予測動作を指定する重み付けファイルを含み、
前記第１の所定数のランダム化されたサブテストは、前記分岐予測動作に基づいて生成される、
請求項１の方法。
【請求項１５】
前記プロセッサのデータ空間は、前記実行する前にランダム化される、
請求項１の方法。
【請求項１６】
前記制御データ構造は、選択された特定のランダム化されたサブテストの各々を実行するために、前記データ空間のデータアドレス空間をさらに指定し、
選択された特定のランダム化されたサブテストの各々を実行することは、前記データアドレス空間内で実行される、
請求項１５の方法。
【請求項１７】
前記データアドレス空間は、前記データ空間の仮想エイリアスである、
請求項１６の方法。
【請求項１８】
前記実行することは、前記特定のランダム化されたサブテストの各々が実行された後に、前記データ空間を元の内容に復元することをさらに含む、
請求項１５の方法。
【請求項１９】
前記実行することは、前記特定のランダム化されたサブテストの各々が実行された後に、前記データ空間を再ランダム化することをさらに含む、
請求項１５の方法。
【請求項２０】
前記実行中に１つ以上のエラーを検出することは、前記データ空間において巡回冗長検査を実行することを含む、
請求項１５の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
（関連出願の相互参照）
本願は、２０１８年４月１０日に出願された米国特許出願第１５／９５０，１４７号の利点を主張するものであり、当該出願の内容は、参照により本明細書に援用される。
【背景技術】
【０００２】
プロセッサのテストは、時間とコストのかかるプロセスである。従来のプロセッサ設計のテストには、プレシリコン検証（pre-silicon verification）及びポストシリコンバリデーション（post-silicon validation）の２種類のテストがある。
【０００３】
プレシリコン検証は、仮想環境でプロセッサのシミュレーションを実行して、設計の異常を検出する。プロセッサが遭遇する可能性のある実際のトラフィックシナリオを再現するために、定期的な間隔でトランザクションのシーケンスを生成するために疑似ランダムテスト生成がよく使用される。これらの疑似ランダムテストは、ＩＳＡ（命令セットアーキテクチャ）命令セットだけでなく、プロセッサモード、仮想化、特権リング、システムの管理及び例外をランダムにカバーする。しかしながら、プレシリコン検証ツールは、プロセッサコアの特定の内部機能を対象とするのに必要な、はっきりとしたフォーカス（sharp focus）及び強力な順列（intense permutation）を提供しない。代わりに、これらのツールは、内部ノードの大部分がいつ刺激によって動かされたのかを伝えるために、内部カバレッジツールを使用しながら膨大な数のランダムサイクルを使用する。このプロセスは信じられないほど遅いだけではなく、仮想テスト環境の厳密なタイミング動作によって根本的に制限されている。
【０００４】
ポストシリコンバリデーションは、実際のアプリケーション環境で製造したプロセッサチップを動作させて、指定された動作条件で正しい動作を検証する。バリデーションの目的は、製品が性能及び機能に関して目標レベルのカスタマーエクスペリエンスを提供することを保証することである。バグを発見することは、その主要な目標ではない。しかしながら、バリデーションは、実際のアプリケーション環境が反復的で予測可能に動作するという事実によって、バグを発見する能力に制限がある。診断アプリケーション及びランダムエクササイザは、バリデーションプロセスの一部として使用されることがあるが、これらには重大な不利益がある。診断及びエクササイザは、合格／不合格の測定基準としてデータ完全性自己チェックを実行する必要があるため、その有効性に制限がある。これにより、マルチプロセッシング環境でテストがどのように機能できるのかについて、非常に制限的なルールの負担が課される。結果として、これらのデータ一貫性及び共有規則が、設計における機能的なバグを発見するのに重要な順列空間を制限する。
【０００５】
プロセッサの設計にバグ及びエラーがあると、これらがインストールされているコンピュータで望ましくない動作が発生する。例えば、プロセッサのバグは、デッドロック、例外、ストール及びデータ整合性の不具合が発生する場合がある。プロセッサを利用しているコンピュータでデッドロックが発生すると、コンピュータを再起動する必要があり、ユーザの保存されていないデータが全て失われる可能性がある。バグによる例外が発生すると、ユーザのアプリケーションが直ぐに終了したり、オペレーティングシステムがクラッシュしたりする可能性があり、何れもデータの損失やコンピュータのサービスの損失に繋がる可能性がある。同様に、バグによる他の例外やストールが発生すると、障害に対処するために追加のコンピュータリソースが必要になるので、コンピュータの速度が低下する。さらに、データ整合性に不具合が生じると、誤ったデータがユーザのファイル又はデータベースに書き込まれる可能性がある。これにより、コンピュータ上の安全なデータにアクセスするためにデータ整合性の不具合が悪用される場合があるので、コンピュータのセキュリティの脆弱性をもたらす場合がある。
【０００６】
従来技術に見られる制約によって制限されない、製造されたプロセッサに存在するバグを効率的に識別する方法の必要性が存在する。製造されたプロセッサのバグを識別した結果、プロセッサの設計を改善して、識別したバグを生成しなくなり、プロセッサがインストールされているコンピュータの動作を改善することができる。
【０００７】
添付の図面と併せて例として示される以下の説明から、より詳細な理解を得ることができる。図面における同様の符号は、同様の要素を示す。
【図面の簡単な説明】
【０００８】
【図１】特定の実施形態による、プロセッサ再設計プロセスのフロー図である。
【図２】特定の実施形態による、テストタイプのためのランダムサブテスト生成プロセスのフロー図である。
【図３】特定の実施形態による、ランダムランタイム実行プロセスのフロー図である。
【図４】特定の実施形態による、テストライブラリと制御データ構造との関係をグラフで表した図である。
【図５Ａ】特定の実施形態による、例示的なテンプレートファイルの一部を示す図である。
【図５Ｂ】特定の実施形態による、例示的なテンプレートファイルの一部を示す図である。
【図６】特定の実施形態による、プロセッサのデバッグを実行するためにプロセッサを利用することができるコンピュータのブロック図である。
【発明を実施するための形態】
【０００９】
デバッグ方法の例示的な実施形態は、複数のテストタイプを有するテンプレートファイルの入力を受信することを含む。次に、複数のテストタイプ毎に、テンプレートファイルに基づくいくつかのランダム化されたサブテストが生成され、コンパイルされて、テストバイナリを形成する。次いで、各テストタイプのテストバイナリがリンクされて、テストライブラリを形成する。テストバイナリのサブセットは、テストライブラリからランダムに選択される。テストバイナリのサブセット内のテストバイナリは、各テストバイナリに関連する制御データ構造に従って、物理スレッドでランダムに実行される。テストバイナリのランダム実行においてバグ及びエラーが検出される。検出されたエラー及びバグに基づいてプロセッサが再設計される。
【００１０】
本開示の実施形態の実施態様は、製造されたプロセッサ上でランダムに生成され、ランダムに実行された実行ファイルを実行することによって、プロセッサのマイクロアーキテクチャのエラーを診断する。極めて特有なテスト生成制約ルールと組み合わせて、プロセッサのテストにおいて複数のレベルでランダム化を実施することによって、開示された実施形態の実施態様は、マイクロアーキテクチャ機能に高度にフォーカスを合わせたテストを実施することができ、同時に、その特有な機能を強調するように高度なランダム順列を適用することができる。これにより、従来のテスト方法では検出することができなかったプロセッサのエラーやバグを検出し、診断することが可能になる。エラー及びバグが検出され、診断されると、異常が生じないようにプロセッサを再設計することができる。プロセッサのエラー及びバグを除去することによって、計算効率及び信頼性が向上したプロセッサを製造することができる。
【００１１】
開示された実施形態によって提供される高度なフォーカスからの別の利点は、実際のプロセッサデバッグ環境において、未だ修正されていないいくつかの非常に広範なバグが存在する場合があるという点である。このような状況では、標準的なバリデーション技術は、既知の既存のバグに繰り返し遭遇するので、追加の新たなバグを見つけることができない。したがって、開示された実施形態の多くの実施態様は、マイクロアーキテクチャ構造に厳密にフォーカスを合わせることによってバイパスする（つまり、既知のバグ状態を刺激しない）ように容易に調整することができ、これにより、さらなる詳細なテストを実行することが可能になる。マイクロアーキテクチャ機能に厳密にフォーカスを当てる機能によって、デバッグプロセス中に進展した学習に基づいてテストを「調整」し、適合させることを可能にする。
【００１２】
開示された実施形態は、アプリケーション及び診断ソフトウェアの動作と比較して、全く異例であるソフトウェア動作を可能にし、促進する。このようにして、開示された実施形態は、従来技術では発見できないバグを抱えている可能性があるプロセッサのマイクロアーキテクチャのコーナーケース領域に容易にストレスを加える。
【００１３】
開示された実施形態は、多段階ランダムテストプロセスを実行することによって従来技術の欠点を克服することができ、その結果、より信頼性が高く、より高い計算効率を有するプロセッサが得られる。
【００１４】
図１は、特定の実施形態による、図２〜図６を参照して説明するプロセッサ再設計プロセス１００のフロー図である。所定数Ｎのテストバイナリ２０５（図２に示す）を、テストタイプ毎にランダムサブテスト生成プロセス２００に従ってランダムに生成する（ステップ１１０）。多くの実施形態では、数Ｎは、テストされているマイクロアーキテクチャに適切なコード順列の程度を提供するように構成されている。例えば、テスト実行時間が問題となるプレシリコンエミュレーション環境では、多くの場合、より少ないサブテスト（８〜１６の間のＮの値）が望ましい。実行時間が問題ではないポストシリコン環境では、数Ｎは百単位である。そして、所定数のテストバイナリ２０５を互いにリンクして、図４に示すテストライブラリ４０５を形成する（ステップ１２０）。
【００１５】
次に、プロセッサ６０２（図６に示す）のデータ空間は、ランタイム監視プログラム（runtime executive）によってランダム化される（ステップ１３０）。ランタイム監視プログラムは、テストライブラリ４０５からＭ個のテストバイナリ２０５をランダムに選択する（ステップ１４０）。Ｍの値は、所定のテストタイプに指定され、ランタイム監視プログラムによって実装される「ピック（pick）」順列制御によって決定される。ピック制御は、置換を伴うサンプル、置換を伴わないサンプル、スレッド数未満のサブテストのサブセットのサンプリング、又は、全てのスレッド上で行う単一のサブテストのサンプリング等のアルゴリズムを含む。選択されるピッキングのタイプは、テストの目的と、テストするマイクロアーキテクチャと、に依存する。例えば、クロス修正コード（cross modifying code）（ＣＭＣ）テストは、全てのコア及びスレッドで行う同じサブテストをピックすることを望むであろう。そして、Ｍ個のテストバイナリ２０５の各々が、ピックアルゴリズムに従ってＭＸ個の物理スレッドに割り当てられる（ステップ１５０）。テストバイナリ２０５の各々は、図３に示すランダムランタイム実行プロセス３００に従って、各々の物理スレッド上で実行される（ステップ１６０）。次に、ＭＸ個の物理スレッドが実行され、エラー（例えば、例外、ストール、データ整合性の不具合）が１つ以上のスレッドで検出されるまで、ランタイム監視プログラムによって監視される（ステップ１７０）。検出されたエラーに基づいて、プロセッサ６０２は、検出されたエラーを生成しないように再設計される（ステップ１８０）。
【００１６】
プロセッサ再設計プロセス１００は、追加のエラーを除去するために反復して繰り返されることが多い。多くの実施形態では、再設計プロセス（ステップ１８０）は、実験室での調査と、シミュレーション調査と、の組み合わせを含む。調査は、バグの行動特性を特徴付け、要因のセットサイズを演繹的に低減するために行われる。これは、バグの性質及び範囲を制限し、潜在的に問題のある設計コンポーネントを絞り込むのに役立つ。次に、これらの調査の結果を利用して、後続の反復で使用されるテストバイナリ２０５を生成するのに利用されるテンプレートファイル５００（図５Ａ及び図５Ｂに示す）を生成する。次いで、これらの調査の結果を利用して、プロセッサ再設計プロセス１００を通して後続の反復の調査から得られる技術的学習を組み込む新たなテストバイナリ用のテンプレートファイル５００を生成する。
【００１７】
実験室調査では、様々なオンチップデバッグツール（例えば、ＩＥＥＥ  １５００及びＰ１６８７規格を実装するツール等）が使用されている。具体的なツールの例は、参照により本明細書に援用されている、StollonによるInstrumentation Design and Debug for Systems on Chip（Stollon、Neal. On-Chip Instrumentation Design and Debug for Systems on Chip. Springer US, 2011）に教示されている。スキャンツールを使用してデッドロックを分析し、不具合の時点で殆どの内部フロップの状態をダンプすることができる。例外及びライブロックは、（ＪＴＡＧ：Joint Test Action Group）バス等を介して外部から制御されるマイクロコード化されたモニタツールを使用して検出することができる。このようなツールを用いて、メモリ及び内部プロセッサ構造（例えば、Ｌ１／Ｌ２キャッシュ、分岐予測器及びパイプライントランスレーションルックアサイドバッファ（ＴＬＢ））をプローブし、レジスタの内容を見ることができる。不具合ポイントのかなり上流で発生すると判断されたバグは、多くの場合、内部信号トレースキャプチャツールを使用して分析される。
【００１８】
バグの根本的な原因の仮説を、シミュレーションでテストする。次に、シミュレーションテストの結果に基づいて、バグを排除するために、プロセッサの新たなゲートモデルが開発される。
【００１９】
バグが完全に除去されると、プロセッサの新たなゲートモデルが製造され、プロセッサ６０２の新たな修正されたリビジョンのためのシリコンの新たな「スピン（spin）」が生成される。プロセッサ６０２の新たな修正されたリビジョンは、プロセッサ再設計プロセス１００を使用してテストされる。その結果、プロセッサ再設計プロセス１００は、現場（生産）に入る前に、発見が困難なバグを識別することができ、バグの識別と根本的原因との間のコストのかかるデバッグ時間を短縮することができる。
【００２０】
図２は、特定の実施形態による、特定のテストタイプのためのランダムサブテスト生成プロセス２００の一実施形態を示す図である。特定のテストタイプのテンプレートファイル５００が受信される（ステップ２１０）。いくつかの実施形態では、ランダム化のための任意のシードも受信される。テンプレートファイル５００が解析され、テンプレートで指定されたルールに従って単一のアセンブリ言語ソースファイルが生成される（ステップ２２０）。ステップ２２０は、生成されるｉ個のサブテストの各々について繰り返される。
【００２１】
例えば、テンプレートファイル５０５において、ｔｅｓｔ＿ｂｏｄｙは「ｒａｎｄ  １００  １００  １」として定義される。これにより、パーサは、（重み付け係数に従って）ｔｅｓｔ＿ｂｏｄｙブロックから正確に１００個の命令をランダムに取り込む。さらに、パーサは、マクロのような操作（つまり、ＡＤＤ＿ＲＥＧ＿ＭＥＭｍの後に「ｌｉｎｋ＿ｒｅｇ１６」、「ｂａｓｅ」、「ｄｉｓｐ」、「ｌｏｃｋ」等の名前のリストが続く）に遭遇すると、それを使用してインスタンス化されたオブジェクトを検索し、そのオブジェクトの制約及びルールによって定義された値をランダムに選択する。これらは、整数（イミディエートクラス）又は文字列（トークンクラス）とすることができる。これは、Ｘ８６命令の構築方法である。命令マクロのタイプがオペレーション（ＯＰＳ）ブロック５１０から選択され、これに関連するキー名を使用して、ソースレジスタ名及び宛先レジスタ名、即値（整数定数）、ロックプレフィックス、並びに、ラベルを生成又はラベルが命令に自動的に割り当てられるのを禁止するのに使用される特別な制御等のマクロのパラメータが選択される。例では、Ｘ８６命令が示されているが、同じ技術を、他のプロセッサアーキテクチャ（例えば、Ｘ６４、ＡＲＭ又はＡＲＭ６４）に一般化することもできる。
【００２２】
例えば、プロセッサ再設計プロセス１００をＡＲＭアーキテクチャに適合させるには、テンプレートファイル５００を新たなアーキテクチャの命令セットに適合させる必要がある。この結果、新たなプロセッサのマイクロアーキテクチャのユニークな機能をターゲットとする所定のテストバイナリ２０５が得られる。結果として、プロセッサ再設計プロセス１００は、Ｘ８６環境における場合と同様に動作し、デバッグツールと同じ値を提供する。
【００２３】
次に、コンパイラは、テンプレートファイル５００に指定されたルールに従って動作するｉ個のアセンブリ言語ソースファイルの各々を受信する（ステップ２３０）。次いで、コンパイラは、ｉ個のアセンブリソースファイルをグループ化して所定のテストバイナリ２０５を形成する。所定のテストバイナリ２０５は、個別に実行されるｉ個のサブテストを含む。
【００２４】
ランダムサブテスト生成プロセス２００は、Ｎ個のテストタイプの各々について繰り返される。したがって、各テンプレートで指定されたルールに従って、Ｎ個の所定のテストバイナリ２０５がランダム化され、生成される。例えば、特定の実施形態では、Ｎ個の所定のテストバイナリ２０５の各々が、特定のマイクロアーキテクチャ機能をテストするために生成される。その結果、Ｎ個の所定のテストバイナリがランタイムに実行されると、マイクロアーキテクチャの特定の機能の欠陥を検出することができる。
【００２５】
例えば、特定の実施形態では、Ｎ個の所定のテストバイナリ２０５の各々が、プロセッサのパイプラインの長さに亘ってマイクロアーキテクチャの特定の機能を個別にターゲットとする。多くの場合、Ｎ個の所定のテストバイナリ２０５は、プロセッサ６０２の分岐予測器、命令フェッチユニット、デコーダ、ｏｐキャッシュ、スケジューラ、実行ユニット、ロード／ストアユニット及びＬ１キャッシュ内の要素をカバーするテストも含む。
【００２６】
多くの実施形態では、Ｎ個の所定のテストバイナリ２０５のうち１つ以上は、共通のオペレーティングシステム相互排他的構造を使用する多くのスレッド間のメモリリソース共有、ランダムに及び従来のプロデューサ／コンシューマモデルの両方で実装された多数のスレッドに亘る監視／ｍｗａｉｔシナリオ、マイクロｏｐキューループバッファリング（micro op queue loop buffering）、非一時的なロード／ストアのフェンシング（fencing）、コード再解釈とコードシフトの両方による分岐予測器エイリアシング、コード／データ仮想エイリアシング、ｏｐキャッシュフェッチモーディング、予測を阻止するためのディープ実行（deep execution）スケジューラ（ＥｘＳｃ）依存チェーン、予測を促す低ＥｘＳｃ依存状態（low ExSc dependency conditions）、スペックロックマップ状態（spec-lock-map conditions）及びスペックロックマップ中断（spec-lock-map aborts）、大量の分岐予測（heavy branch prediction）及び大量の予測ミス（heavy mis-prediction）、ストアからロードへのインターロック（store-to-load interlocks）及びストアからロードへの転送状態（store-to-load forwarding conditions）、整列／不整列クロッサによるＤサイドテーブルウォークストーム（D-side table walk storms with aligned/misahgned crossers）、キャッシュ及びバスのロック、多くのスレッドで共有されている少ないキャッシュラインがロックや容量のエビクションと競合している激しい競合、及び、他の類似した状態を含む、いくつかの機能をテストする。
【００２７】
図３は、特定の実施形態による、Ｍ個の物理スレッドの各々によって実行されるランダムランタイム実行プロセス３００の実施形態のフロー図である。ランダムランタイム実行プロセス３００が動作する方法は、Ｎ個のテストタイプの各々に存在する制御データ構造４１０によって定義される。制御データ構造４１０は、Ｎ個の所定のテストバイナリ２０５の各々について生成される。
【００２８】
以下のコードスニペットは、制御データ構造４１０の例を示す。
ｃｏｎｔｒｏｌ  ｄａｔａ  ｓｔｒｕｃｔｕｒｅ  ｄｅｃｌａｒａｔｉｏｎ
ｓｔｒｕｃｔ  ｔｅｓｔ＿ｌｉｓｔ｛
ｉｎｔ  ａｒｒａｙ＿ｓｉｚｅ；
ｉｎｔ  ｔｉｍｅｏｕｔ；
ｉｎｔ  ｄａｔａ＿ｐａｒｍｓ；
ｉｎｔ  ｔｅｓｔ＿ｓａｍｐｌｉｎｇ；
ｉｎｔ  ｄａｔａ＿ｍａｌｌｏｃ＿ｓｉｚｅ；
ｖｏｉｄ（＊ｍｅｍｉｎｉｔ）（ｕｎｓｉｇｎｅｄ  ｉｎｔ＊，ｉｎｔ）；
ｆｕｎｃｐｔｒ＊ｔｅｓｔ＿aｒｒ；
ｆｕｎｃｐｔｒ＊ｔｅｓｔ＿eｎｄ＿aｒｒ；
ｉｎｔ  ｃoｄe＿ｐaｒｍｓ；
ｉｎｔ  eｘeｃ＿ｆｌaｇｓ；
｝；
／／Ｅｘａｍｐｌｅ  ｏｆ  ｔｈｅ  ｓｔｒｕｃｔｕｒｅ  ｄｅｆｉｎｉｔｉｏｎ  ｆｏｒ  ｔｅｓｔ  ｔｙｐｅ  ２０．（ｓｅｍａｐｈｏｒｅ  ｐｉｎｇ−ｐｏｎｇ  ｔｅｓｔ）
｛ＮＵＭ＿ＴＹＰＥ２０＿ＴＥＳＴＳ，
４０，
ＳＨＡＲＥＤ＋ＲＥＳＴＯＲＥ＋ＤＡＴＡ＿ＡＬＩＡＳ，
ＳＡＭＰＬ＿ＦＥＷ，
０ｘ２００００，
＆ｍｅｍｉｎｉｔＲａｎｄ９６ｋ，
ｐｒｅｄｅｔｅｒｍｉｎｅｄ＿ｔｅｓｔ＿ｔｙｐｅ２０，
ｐｒｅｄｅｔｅｒｍｉｎｅｄ＿ｔｅｓｔ＿ｔｙｐｅ２０＿ｅｎｄ，
ＡＬＴ＋ＡＬＩＡＳ＋ＲＥＬＯＡＤ＋ＳＨＩＦＴ，
ＭＵＴＥ｝，
【００２９】
制御データ構造４１０は、所定のテストバイナリ２０５の各々の中から個々のサブテストを選択する方法を指定する（ステップ３１０）。例えば、特定の実施形態では、制御データ構造４１０は、サブテストのプールからサブテストをピッキングするための置換ポリシーを有するサンプルを指定する。代わりに、他の実施形態では、制御データ構造４１０は、サブテストをピッキングするための置換ポリシーを持たないサンプルを指定する。他の代替例では、制御データ構造４１０は、個々のサブテストが、任意に選択されたサブテストの小さな一時的なプールを生成することによって選択され、次いでこのプールからランダムにピックしてサブテストをスレッドに割り当てることを指定する。この結果、複数の物理スレッドに亘ってサブテストが複製される。また、いくつかの実施形態での制御データ構造４１０は、全ての論理スレッド及び物理スレッドに同じサブテストを投入することを指定する。
【００３０】
多くの実施形態では、制御データ構造４１０は、テストバイナリが実行されるときに利用されるアドレス空間も定義する（ステップ３２０）。例えば、特定の実施形態では、制御データ構造４１０は、デフォルトデータ空間の仮想エイリアスである代替データアドレス空間を指定する。代わりに、他の実施形態では、制御データ構造４１０は、テストバイナリのサブテストの仮想エイリアスである代替サブテストアドレスを指定する。
【００３１】
多くの実施形態では、制御データ構造４１０は、テストバイナリについてページングがどのように処理されるかを定義する（ステップ３３０）。例えば、特定の実施形態では、制御データ構造４１０は、デフォルトページングモード（例えば、４ｋＢ、２ＭＢ、１ＧＢなど）が、このテストバイナリにおけるサブテストの実行を通して使用されることを要求する。さらに、多くの実施形態では、制御データ構造４１０は、代替のページングモードがサブテスト反復間でランダムに切り替えられることも指定する。
【００３２】
次に、選択されたサブテストが実行される（ステップ３４０）。いくつかの実施形態では、全てのサブテストは、同時に実行を開始するように同期される。これにより、テストが相互作用する最大の機会が与えられる。例えば、特定の実施形態では、サブテストは、異なる時間に完了するが、新たな反復毎にサブテストが同時に起動又は再起動される。特定の実施形態では、制御データ構造４１０は、ＣＯＤＥ  ＷＲＩＴＡＢＬＥ値を含む。ＣＯＤＥ  ＷＲＩＴＡＢＬＥ値は、自己書き換えコード（ＳＭＣ：Self Modifying Code）テスト／クロス書き換えコード（ＣＭＣ：Cross Modifying Code）テストのために、オペレーティングシステム（ＯＳ）からの書き込み可能コード許可を設定する。また、自己書き換えテスト後にテストを元の状態に復元するために、ＲＥＬＯＡＤコマンドを用いてサブテストコードを再ロードすることもできる。さらに、多くの実施形態での制御データ構造４１０は、ＳＨＡＲＥＤ  ＭＥＭ値を含む。ＳＨＡＲＥＤ  ＭＥＭ値は、単一のデータ空間が所定のテストタイプの全てのサブテストによって共有されることを指定する。いくつかの場合、制御データ構造４１０は、巡回冗長検査（ＣＲＣ）フラグも含む。ＣＲＣフラグは、データ画像のＣＲＣが各サブテストの反復後に実行されることを指定する。
【００３３】
また、多くの場合、制御データ構造４１０は、各サブテスト実行中にデータ空間がどのように構成されるかを定義する（ステップ３５０）。例えば、特定の実施形態では、データ制御ファイルは、ＲＥＳＴＯＲＥ  ＤＡＴＡをいう値を含む。この値は、サブテストの各反復間にデータ空間を元の内容に復元するようにスレッド管理関数に指示する。ＲＥＳＴＯＲＥ  ＤＡＴＡの値は、各反復後に確定的なデータ画像が予想される状況で使用される。代わりに、他の実施形態では、制御データ構造４１０は、サブテスト反復間で共有データ空間のランダム化を引き起こす値ＲＥ−ＲＡＮＤ  ＤＡＴＡを含む。この値は、算術論理ユニット（ＡＬＵ）の動作、アドレスシーケンス、及び、プロセッサ６０２内のコードフローパスを連続的に変化させるために利用される。
【００３４】
また、多くの場合、制御データ構造４１０は、後続の反復のために物理サブテストコードがどのように格納され、実行されるかを確立する（ステップ３６０）。例えば、多くの実施形態では、制御データ構造４１０は、値ＳＨＩＦＴ  ＰＨＹＳ  ＣＯＤＥを含む。ＳＨＩＦＴ  ＰＨＹＳ  ＣＯＤＥ値は、サブテスト反復間で可変（小さい）数のバイトだけ物理サブテストコードをシフトする。ＳＨＩＦＴ  ＰＨＹＳ  ＣＯＤＥは、分岐予測器のテストによく使用される。また、ＤＡＴＡ＿ＡＬＩＡＳ及びＣＯＤＥ＿ＡＬＩＡＳ等の制御データ構造には、各反復間にサブテストがコード及び／又はデータにアクセスする仮想アドレスをランダムに切り替えるように動作するスイッチも存在する。コード及びデータは、一定の物理空間を占有するので、これらのアドレスは、監視プログラムによって選ばれ、割り当てられる仮想エイリアスである。仮想アドレス空間の動的シフトは、仮想アドレス（つまり、キャッシュ、トランスレーションルックアサイドバッファ（ＴＬＢ）、分岐ターゲットバッファ（ＢＴＢ）等）によってインデックス／タグ付けされるマイクロアーキテクチャ構造にストレスを加える。
【００３５】
多くの場合、制御データ構造４１０にはタイムアウトも含まれる。ＴＩＭＥＯＵＴ値は、所定のテストタイプのランタイムの秒数を設定する。例えば、サブテストの新たなセットは、１０秒毎にピックされる。したがって、タイムアウトが満了していない場合（ステップ３７０）、プロセス３００が繰り返される。タイムアウトが満了すると、スレッドでエラーが検出される（ステップ３８０）。
【００３６】
図４は、特定の実施形態による、テストライブラリ４０５を形成するようにリンクされた個々のテストバイナリ２０５と、個々の制御データ構造４１０と、の関係をグラフで表した図である。具体的には、図４は、所定のテストバイナリ２０５の各々が、関連する制御データ構造４１０を有することを示している。
【００３７】
図５Ａ及び図５Ｂは、特定の実施形態による、テンプレート５００用の例示的なテンプレート５０５の一部を示す図である。テンプレートファイル５００は、特定のテストタイプの構造及び確率的ルールを記述する。具体的には、テンプレートファイル５００は、マクロの使用及びその頻度に関する命令をさらに含む。また、多くの場合、テンプレート５００は、演算の動作（制限、ストライド、高頻度ターゲット及び低頻度ターゲット）に対処するためのルールも含む。特定の実施形態では、テンプレート５００は、レジスタの使用を指定又は制限する。さらに、多くの実施形態のテンプレートファイル５００は、分岐動作（予測、分岐／分岐せず、前進／後退、ターゲット距離）及びループ構造（サイズ及び反復範囲）のためのルールも指定する。さらに、テンプレートファイル５００は、巡回符号ブロック、並びに、パブリック及びプライベート命令リンクの生成も可能にする。また、多くの場合、テンプレートファイル５００は、スレッド間通信のルールも指定する。
【００３８】
例えば、特定の実施形態では、テンプレートファイル５００は、若いｏｐが古いｏｐよりも前に推測的に発行され実行されることがないように全て順序に依存するロード及びロードｏｐストアとして、様々な算術論理ユニット（ＡＬＵ）演算を利用するように設計される。これにより、スケジューラキューは、非常に迅速にバックアップされ、ディスパッチストールが強制される。高い推測の程度と低い推測の程度の両方とも、実行ユニットのスケジューラにとってのマイクロアーキテクチャ境界条件である。したがって、これらは、フォーカス及びストレスを必要とする「危険信号」シナリオである。このタイプのテストは、マイクロプロセッサ６０２の設計検証エンジニアが直面する問題の非常に現実的な例を提供する。
【００３９】
テンプレートファイル５００は、３つのタイプのブロックを含む。これらのブロック関数の各々は、Ｃ＋＋又はＲｕｂｙ等の任意のオブジェクト指向言語で使用される「クラス」構造に類似している。「クラス」構造と同様に、ブロックはそれぞれ独自のメソッド及びインスタンス変数を有し、開始／終了ブロックによってインスタンス化される。他のオブジェクトプログラミング言語と同様に、オブジェクトには名前が付けられる。これらの名前は、ウェイトファイル内のインスタンス化された全てのオブジェクトのハッシュテーブルへのキーとして機能する。具体的には、ウェイトファイルは、ｏｐ、イミディエート及びトークンを含む。
【００４０】
ＯＰＳブロック５１０は、命令のブロックを指定する。ＯＰＳブロック５１０内の各エントリは、通常、命令マクロの名前及び入力パラメータである。第１のパラメータ（整数）は、その特定のｏｐの相対的な重み付け係数である。これは、ｏｐがそのブロックのリストからランダムに選択されている場合にのみ重要である。ランダム化は、以下のキーワードが「ｒａｎｄ」の場合に発生する。「ｒａｎｄ」の後に、ブロックからピックされるｏｐの合計数を定義する３つの数値パラメータが続く。名前に続くキーワードが「ｓｅｑｕｅｎｔｉａｌ」である場合、重み付けパラメータが無視され、そのブロック内の各ｏｐが選択され、表示される順序でテストファイルに配置されることを意味する。これにより、テンプレートファイル５００は、インラインコードスニペット又はサブルーチンを含むことができる。
【００４１】
ＯＰＳブロック５１０では、第２のパラメータ（例えば、ＡＤＤ＿ＲＥＧ＿ＭＥＭｍ）は、命令マクロの名前であり、そのラインの全ての後続の要素は、そのマクロに対する入力パラメータである。マクロパラメータの各パラメータは、（先頭に＄符号が付く）リテラル、又は、オブジェクトのハッシュテーブルへのキー、言い換えると、ウェイトファイルの他のブロックの名前である。例えば、図５Ａに示すように、相対的な重み付け係数（１、２、３等）の後に命令マクロ（例えば、ＡＤＤ＿ＲＥＧ＿ＭＥＭｍ）の名前が続き、その後に名前（「ｌｉｎｋ＿ｒｅｇ１６」、「ｂａｓｅ」、「ｄｉｓｐ」、「ｌｏｃｋ」等）のリストが続く。さらに、これらの各々は、ウェイトファイル内に独自のブロックを有する。全てのマクロは、テキストヘッダファイルで定義される。このヘッダファイルは、パーサによって読み込まれ、その内容は、パーサが生成するサブテスト毎にソースコードの先頭にプリペンド（pre-pended）される。ソースファイル内のこれらのマクロ定義によって、コンパイラ／アセンブラは、各マクロインスタンスを１つ以上のアセンブリ言語命令に展開できる。プロセス全体で１つの予約されたキー名しかなく、それは、テスト実行が始まるＯＰＳブロック５１０を示すために使用される「ｍａｉｎ」である。
【００４２】
また、ＯＰＳブロックは、ＳＥＣＴＩＯＮと呼ばれるｏｐクラス内の特別な「命令」もサポートする。この特別なｏｐ  ＳＥＣＴＩＯＮは、別のＯＰＳブロック５１０への再帰呼び出しであるかのように使用される。例えば、「ｍａｉｎ」が連続して実行され、ＳＥＣＴＩＯＮコマンドが検出されると、ｔｅｓｔ＿ｂｏｄｙのｏｐの処理を始めるようにパーサに指示する。この場合、これらのｏｐが連続してピックされない。ＳＥＣＴＩＯＮは、ＳＥＣＴＩＯＮＳがＳＥＣＴＩＯＮＳ内のＳＥＣＴＩＯＮＳ内に存在できるという意味で再帰的である。これにより、様々なｏｐの組み合わせをテスト内に埋め込み、ユニークなセクションを相互にネストすることができる。この特定の再帰構造は、マイクロｏｐキューループバッファのテストに適している。
【００４３】
また、テンプレートファイル５００は、トークンブロック５２０も含む。トークンは、関連する相対的な重み付け係数を有する英数字文字列である。トークンブロック５２０は、レジスタのグループ、オペランドサイズの上書き、及び、他のプレフィックスを定義する。例えば、インデックスレジスタの選択を不均一にバイアスすることは、特定のアドレス領域にロード／ストアアクティビティをフォーカスさせるために使用できる。異なるタイプの命令によって使用されるソースレジスタ及び宛先レジスタのセットを制御することは、これらの相互依存性を強める又は弱めることができる。
【００４４】
例えば、図５Ａ及び図５Ｂは、依存性テスト用のテンプレートファイル５０５を示している。この例では、インデックスレジスタ及び宛先レジスタは、１６又は６４ビットサイズのＲＡＸに制限されている。さらに、ソースと宛先の両方としてＲＡＸを暗示的に使用する演算ＣＭＰＸＣＨＧが利用される。したがって、あらゆるｏｐの宛先は、シリアライズする依存性チェーンを生成する次の若いｏｐのソースオペランドでもある。
【００４５】
また、多くの実施形態では、トークンブロック５２０はロックトークン５３０も含む。このロックトークン５３０は、ロードｏｐストア演算にアトミック（ロック）動作を強制するために使用されるＸ８６  ＬＯＣＫプレフィックスの重み付け係数を指定する。ロックは、マシンの任意の他のトランザクションが、読み出し／修正／書き込みプロセス中にその特定のメモリ位置（キャッシュライン）にアクセスするのを妨げる。ロックされた演算は、マシンの困難なコヒーレンシ機能にストレスを加えるため、テストするために重要である。例えば、図５Ｂは、ＬＯＣＫプレフィックスが付加された９個のロードｏｐストアを示している。
【００４６】
また、テンプレートファイル５００はイミディエートブロック５４０も含む。イミディエートブロック５４０は、イミディエートブロック内のライン毎に使用される以下の構文を介してランダムに生成される整数である。構文は、重み、開始、終了、ステップサイズ、ａｎｄ＿ｍａｓｋ、及び、ｏｒ＿ｍａｓｋの値を含む。重み値は、ブロック内の他の重み付けされた要素に対する、イミディエートブロック内のこの特定の式の相対的な重みを設定する。例えば、ブロックに３つの要素があり、第１の要素が１の重みを有する場合、第２の要素は３の重みを有し、第３の要素は４の重みを有する。つまり、これらがピックされる確率は以下のとおりである。つまり、第１の要素は１／８の確率を有し、第２の要素は３／８の確率を有し、最後の要素は４／８の確率を有する。
【００４７】
開始値は、値をランダムにピックする範囲の開始する（数値的に最小の）整数値を設定する。終了値は、範囲の終了する（数値的に最大の）整数値を設定する。ステップサイズ値は、ランダムピックを行うストライドのサイズを設定する。例えば、あるアドレス指定方式で変位フィールドに使用する、０−＞０ｘＦＦＦの範囲の６４バイトのキャッシュライン整列値をランダムにピックするには、０の開始値、０ｘ１０００の終了値、０ｘ４０のステップサイズが使用される。このイミディエートオブジェクトに対してｒａｎｄ（）メソッドを呼び出すと、集合｛０、０ｘ４０、０ｘ８０、０ｘｃ０．．．０ｘＦＣ０｝の内のランダム整数が返される。
【００４８】
ａｎｄ＿ｍａｓｋ値は、開始、終了及びステップサイズを使用して計算された数に対して適用されるビットマスク（ビット単位のＡＮＤ）である。例えば、特定の実施形態では、ａｎｄ＿Ｍａｓｋは、アドレスビット４８：１２のランダム変動が、そのインデックスで８つすべての方向（ｗａｙｓ）を迅速に満たしてエビクションを強制するように、単一の特定の線形インデックス（アドレスビット１１：６）へのアドレス指定を制限することによって、Ｌ１データキャッシュ容量のエビクションを強制するために使用される。さらに、キャッシュライン内での整列の他の保証無しに、Ｌ１データキャッシュ（ＤＣ）の線形インデックス０を常にターゲットとする３２ビットアドレスを生成するために、０ｘＦＦＦＦＦ０３Ｆのａｎｄ＿ｍａｓｋが利用される。さらに、線形インデックス０をターゲットとし、ＤＷＯＲＤ（４バイト）整列も強制するために、０ｘＦＦＦＦＦ０３Ｃのマスクが利用される。
【００４９】
ｏｒ＿ｍａｓｋ値は、開始、終了、ステップサイズ及びａｎｄ＿ｍａｓｋを使用して計算された数に対して適用されるビットマスク（ビット単位のＯＲ）である。例えば、クワッドワード（８バイト）アクセスのために４ｋｂのページが不整列であるアドレスを常に生成する乱数を生成するために、０ｘＦＦ９のｏｒ＿ｍａｓｋが利用される。
【００５０】
特定の実施形態では、ランダムランタイム実行プロセス３００は、ファームウェアベースであり、オペレーティングシステム、ビデオ、キーボード又はハードドライブを必要としない。これらの実施形態では、ランダムランタイム実行プロセス３００は、リセット直後に自動的に呼び出され、ＢＩＯＳ  ＲＯＭから人間の介入なしに実行されるメインメモリにロードされる。例えば、メモリ、スレッド、ページング管理及び例外処理等のように以前にＯＳにより提供されていたサービスは、修正又は再コンパイル無しにテストすることができ、ランタイム監視プログラムルーチンが利用できない場合がある。これらの実施形態では、ランタイム監視プログラムは、メモリ、スレッド、ページ管理及び例外処理に独自のサービスを提供する必要があるかもしれないが、サブテストバイナリ自体は修正を必要としない。これらの実施形態は、コンピュータがオペレーティングシステムを起動するのを妨げるほど深刻なバグを有するプロセッサをデバッグできるようにする。結果として、プロセッサ６０２をデバッグするために必要とされるのは、実行ファイルを保持するためのＲＯＭと、実行ファイルをロードして実行することができるメモリだけである。また、これらの実施形態は、ＧＰＵのデバッグにも適している。
【００５１】
図６は、プロセッサ６０２がプロセッサ再設計プロセス１００を使用して再設計される例示的なデバイス６００のブロック図である。デバイス６００は、例えばサーバ、コンピュータ、ゲーム機、ハンドヘルドデバイス、セットトップボックス、テレビ、携帯電話又はタブレットコンピュータを含む。デバイス６００は、プロセッサ６０２と、メモリ６０４と、ストレージ６０６と、１つ以上の入力装置６０８と、１つ以上の出力装置６１０と、を含む。また、デバイス６００は、オプションで入力ドライバ６１２及び出力ドライバ６１４も含む。デバイス６００が、図６に示されていない追加の構成要素を含むことを理解されたい。
【００５２】
プロセッサ６０２は、中央演算処理装置（ＣＰＵ）、グラフィックス処理ユニット（ＧＰＵ）、同じダイ上に配置されたＣＰＵ及びＧＰＵ、又は、１つ以上のプロセッサコア６０２を含むことができ、各プロセッサコア６０２は、ＣＰＵ又はＧＰＵであってよい。メモリ６０４は、計算ノード又はプロセッサ６０２と同じダイ上に配置されてもよいし、計算ノード又はプロセッサ６０２とは別に配置されてもよい。一実施形態では、メモリ６０４は、例えば、ランダムアクセスメモリ（ＲＡＭ）、ダイナミックＲＡＭ若しくはキャッシュ等の揮発性又は不揮発性メモリを含む。
【００５３】
ストレージ６０６は、例えば、ハードディスクドライブ、ソリッドステートドライブ、光ディスク若しくはフラッシュドライブ等の固定記憶装置又はリムーバブル記憶装置を含む。入力装置６０８は、キーボード、キーパッド、タッチスクリーン、タッチパッド、検出器、マイク、加速度計、ジャイロスコープ、生体認証スキャナ又はネットワーク接続（例えば、無線ＩＥＥＥ８０２信号の送信及び／若しくは受信のための無線ローカルエリアネットワークカード）を含む。出力装置６１０は、ディスプレイ、スピーカ、プリンタ、触覚フィードバックデバイス、１つ以上のライト、アンテナ又はネットワーク接続（例えば、無線ＩＥＥＥ８０２信号の送信及び／若しくは受信のための無線ローカルエリアネットワークカード）を含む。
【００５４】
入力ドライバ６１２は、計算ノード又はプロセッサ６０２及び入力装置６０８と通信し、計算ノード又はプロセッサ６０２が入力装置６０８から入力を受信するのを可能にする。出力ドライバ６１４は、計算ノード又はプロセッサ６０２及び出力装置６１０と通信し、プロセッサ６０２が出力装置６１０に出力を送信するのを可能にする。入力ドライバ６１２及び出力ドライバ６１４がオプションの構成要素であり、入力ドライバ６１２及び出力ドライバ６１４が存在しない場合にはデバイス６００が同様に動作することに留意されたい。
【００５５】
本明細書の開示に基づいて多くの変形が可能であることを理解されたい。機能及び要素は、特定の組み合わせで上述されているが、各機能又は要素は、他の機能及び要素無しに単独で使用されてもよいし、他の機能及び要素を伴う又は伴わない様々な組み合わせで使用されてもよい。
【００５６】
提供される方法は、汎用コンピュータ、プロセッサ６０２又はプロセッサコアにおいて実施されてもよい。プロセッサ６０２の例は、汎用プロセッサ、専用プロセッサ、従来のプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、複数のマイクロプロセッサ、ＤＳＰコアに関連する１つ以上のマイクロプロセッサ、コントローラ、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）回路、任意の他のタイプの集積回路（ＩＣ）、及び／又は、ステートマシンを含む。このようなプロセッサは、処理されるハードウェア記述言語（ＨＤＬ）命令及びネットリストを含む他の中間データ（コンピュータ可読媒体上に記憶可能な命令）の結果を用いて製造プロセスを構成することによって製造されてもよい。このような処理の結果は、実施形態の態様を実施するプロセッサを製造する半導体製造プロセスにおいて用いられるマスクワークであってもよい。
【００５７】
本明細書で提供される方法又はフローチャートは、汎用コンピュータ又はプロセッサ６０２による実行のために非一時的なコンピュータ可読記憶媒体に組み込まれたコンピュータプログラム、ソフトウェア又はファームウェアにおいて実施されてもよい。非一時的なコンピュータ可読記憶媒体の例としては、読み出し専用メモリ（ＲＯＭ）、ランダムアクセスメモリ（ＲＡＭ）、レジスタ、キャッシュメモリ、半導体メモリデバイス、内蔵ハードディスク及びリムーバブルディスク等の磁気媒体、光磁気媒体、ＣＤ−ＲＯＭディスク及びデジタル多用途ディスク（ＤＶＤ）等の光学媒体が挙げられる。
【図１】
2021521521.tif 000003
【図２】
2021521521.tif 000004
【図３】
2021521521.tif 000005
【図４】
2021521521.tif 000006
【図５Ａ】
2021521521.tif 000007
【図５Ｂ】
2021521521.tif 000008
【図６】
2021521521.tif 000009
【国際調査報告】
2021521521.tif 000010
2021521521.tif 000011
2021521521.tif 000012