News and Views 2015 Spring / Vol. 13: 上流設計&組込み

検証IPを用いたキャッシュコヒーレンシの検証容易化

はじめに

マルチコアシステムでは複数のキャッシュが同一のデータを共有することから、キャッシュ間のデータ一貫性(コヒーレンシ)を保つメカニズムが必要となり、インターコネクト設計が極めて複雑になりました。最新のキャッシュコヒーレンシのプロトコル仕様では、キャッシュに関するバススティミュラスは、ローカルキャッシュの初期ステートと整合している必要があります。またトランザクション終了時にキャッシュラインステートとデータの更新が必要になることもあります。トランザクションの始めと終わりには必ずキャッシュメモリにアクセスしなくてはなりません。テストのためのスティミュラスを生成する場合、キャッシュメモリや、システムのアドレスマップに基づく設定までも意識しなくてはならず、そのシーケンスは非常に複雑になります。

例えば、キャッシュメンテナンス(CMO: Cache Maintenance Operation)を実行する手続きは以下のようになります。

  • アドレスマップをチェックして、アドレスが正しく共有領域にあることを確認
  • マスタキャッシュにアクセスしてキャッシュラインの初期ステートを確認
  • 同じIDで進行中のキャッシュラインのトランザクションが順番通りに実行されていることを確認
  • プロコトルに準拠するように、トランザクションのアトリビュートを詳細に設定
  • 必要に応じてキャッシュデータ/キャッシュステートを更新

メンター・グラフィックスの検証IPは、マスタシーケンスと、マスタキャッシュコントローラを備えたエージェントを搭載しています。キャッシュにアクセスして更新したり、アドレスマップにアクセスしたりといった面倒な作業は、キャッシュコントローラ内部で処理されるため、キャッシュコヒーレンシが求められるインタフェースに対するスティミュラスを簡単に生成できます。

今回は、汎用マスタシーケンス、汎用リード/ライトのインストラクションレベルAPI、コヒーレンシAPI、マスタキャッシュコントローラ、さらにVIPのエージェントについてご紹介します。またキャッシュコヒーレンシを含むオンチップバスの機能検証については、News and Views online 2014年 Vol. 10を併読すると効果的です。

図1. 汎用マスタシーケンス図1. 汎用マスタシーケンス
図2. 汎用リード/ライトのトランザクションクラス図2. 汎用リード/ライトのトランザクションクラス
図3. 汎用リード/ライトのインストラクションレベルAPI図3. 汎用リード/ライトのインストラクションレベルAPI
図4. 汎用リード/ライトのインストラクションAPI宣言図4. 汎用リード/ライトのインストラクションAPI宣言
図5. コヒーレンシAPI図5. コヒーレンシAPI
図6. コヒーレンシAPIの宣言コード図6. コヒーレンシAPIの宣言コード
図7. マスタキャッシュコントローラ図7. マスタキャッシュコントローラ
図8. 検証IPのUVMエージェント図8. 検証IPのUVMエージェント

汎用マスタシーケンス

まずご紹介する汎用のマスタシーケンスは、図1の通り、単純かつ再利用可能な複数のAPI群を提供します。インスラクションレベルやトランザクションレベルのリード/ライト、バリア、コヒーレンシなどがこれに相当します。この汎用シーケンスのAPIは、キャッシュコントローラAPIを用いてトランザクションを実行し、必要なオペレーションを行います。キャッシュコントローラは、キャッシュメモリやアドレスマップへのアクセスなど、必要なオペレーションを処理してからバス上でのトランザクションを実行します。トランザクション終了後には、必要となるキャッシュメモリの更新を行います。

インストラクションレベルの汎用リード/ライトAPIは、プロセッサベースのインタフェースの検証に向いています。複雑なプロトコルや、プロトコル固有のトランザクション項目に含まれる膨大なアトリビュートを気にすることなく、メモリデータの読み書きに集中できます。図2はリード/ライトAPIに渡す汎用的なトランザクションです。この中のシーケンスアイテムには、所定のバイト数のデータをシステムメモリ、もしくはキャッシュメモリに対してリード/ライトするリクエストがエンキャプスレーションされています。

このAPIを使うと、プロセッサ上で動作中のプログラムが命令しているかのように基本的なリード/ライトを実行できます。マスタキャッシュコントローラは、この基本的なインタフェースを介して、現在のキャッシュステートとターゲットとするメモリの種類(スヌープ可/不可など)をベースにプロトコルに最適なバストランザクションを選択します。このAPIメソッドで定義される引数(コマンド、アドレスとデータ)の数は限られており、バス固有のアトリビュートを意識する必要はありません。バス固有のアトリビュートであるアドレスマップやアトリビュートAPIは頻繁に変更するものではないため、コンフィギュレーションとして決定されます。

この汎用マスタシーケンスによって使用可能なインストラクションレベルのリード/ライトAPIについて、基本ブロックを図3に、コードを図4に示します。

コヒーレンシAPI

これまで説明してきたインストラクションレベルとトランザクションレベルのリード/ライトAPIは、再利用可能な汎用マスタシーケンスの中で宣言されます。これらのAPIに加えて、プロトコル固有のコヒーレンシのためのトランザクションを実行するAPIが必要です。コヒーレンシAPIは、CMOやコピーバック(CB: Copy Back)、Dalvik仮想マシン(DVM: Dalvik Virtual Machine)、バリアといったコヒーレンシに関するトランザクションを実行します。

CMO実行にあたっては、プロトコルに関連する膨大なトランザクションのアトリビュートに煩わされることなく、選択したキャッシュラインを対象にCMOを実行します。コヒーレンシAPIにユーザが入力する項目は、CMOトランザクションのタイプと、キャッシュラインのアドレス、そしてオプションとしてトランザクションストリームIDのみです。CBについても同様です。

汎用コヒーレンシAPIの他に、バス固有のトランザクション/シーケンスアイテムを直接実行できるAPIも用意されており、トランザクションのアトリビュートを自由に設定できます。図5は汎用マスタシーケンスで使用可能なコヒーレンシAPIの一覧です。また、図6はコヒーレンシAPIの宣言コードです。

マスタキャッシュコントローラ

キャッシュコントローラは、マスタとなる検証IP上で常時動作するバックグラウンドのプロセスです。これは、ユーザシーケンスからリード/ライトのリクエストを受け取って実行します。プロトコルに準拠しているかどうか、スティミュラスが正しい順番で生成されているかなどを自動チェックし、キャッシュを更新します。

実装コードは、スティミュラスを実行しキャッシュを用いたマスタ検証IPの動作を制御するベースクラスです。キャッシュのモデルと検証IPのコンフィギュレーションクラスのオブジェクトにはハンドルが付けられています。図7に示すように、コントローラは基本的にはキャッシュラインステートに基づいてリード/ライトチャネルでトランザクションを開始します。

トランザクションは、開始するプロトコルに準拠し、コントローラによって順番通りに自動的に実行されます。例えば、スティミュラス生成中は前のCMOトランザクションが終わらない限り、次のCMOトランザクションを開始しません。

マスタキャッシュコントローラは、リード/ライトのリクエストチャネルに送出するトランザクションスティミュラスを生成し、スヌープ仮想チャネル上のスヌープリクエストに対応します。プロセッサは各チャネルのスヌープリクエストに応える必要があり、コントローラは個別にスヌープハンドリングのロジックを実行して処理します。

また、コントローラのスヌープシーケンスロジックは、スヌープリクエストの仮想チャネル経由でリクエストを受け取って処理します。必要に応じてローカルキャッシュのキャッシュラインステートを修正し、レスポンス仮想チャネルに適切な応答を返します。データ転送が必要な場合には、データ仮想チャネルで送出します。

キャッシュモデルとシステムアドレスマップ

上記のように汎用マスタシーケンスは、汎用リード/ライトのインストラクション、リード/ライトのトランザクション、そしてコヒーレンシのAPIから構成されています。トップレベルのトランザクションにはバスの振舞いを正確に制御する多くのアトリビュートがあります。APIに対するユーザ設定を最小限に抑えられるよう工夫されていて、ユーザ設定項目ではないアトリビュートのすべてを以下から取得します。

  • マスタのローカルキャッシュ
    トランザクション開始時にマスタのローカルキャッシュにアクセスし、実行するトランザクションが初期ラインステートと整合しているかどうかを確認し、以下の情報を取得してからトランザクションを実行します。
    • キャッシュラインステート
    • キャッシュラインデータ
  • システムアドレスマップ
    マスタ用のアドレスマップを定義したもので、多数のアドレス領域が登録されています。個々の項目にはアドレスの範囲と登録されたアドレスに対する以下のアトリビュートが定義されています。
    • ターゲット: このメモリ領域に対するリクエストを処理するスレーブ
    • ドメイン: 共有可能(対内部/対外部)か共有不可かどうか
    • 領域: メモリが属するオプション領域
    • 保護: 保護機構のアトリビュート(アドレスマップで付与)
    • メモリタイプ: 通常メモリかデバイスメモリかどうか
  • アトリビュートAPI
    キャッシュモデルとシステムアドレスマップから入手できないトランザクションのアトリビュートが上記以外にいくつかあります。このようなアトリビュートに対するset/getメソッドによるAPIが個別に用意されています。汎用マスタシーケンスを一度設定すると、変更するまでは他のトランザクションでも共有できます。設定されていない場合にはデフォルト値が使われます。

検証IPのエージェント

検証IPのエージェント構造を図8に示します。エージェントは以下を自動的に実行します。

  • キャッシュメモリモデルの作成とメンテナンス
  • キャッシュコントローラの自動起動

まとめ

今回の上流設計&組込みトピックでは、特に複雑で作業が煩雑になりがちなキャッシュコヒーレンシを持つバスに注目し、実際の検証IPからAPIリストを抽出して解説を加えました。トランザクションには膨大なアトリビュートが含まれ、キャッシュモデルや他のテストベンチオブジェクトにアクセスすることが必要ですが、マスタのAPIを使うと、あまり手をかけることなくスティミュラスの生成が可能になります。

また、メンター・グラフィックスの検証IPは、シミュレーションでもエミュレーションでも使用でき、検証IPの本来の価値である再利用性を最大限まで高めます。