FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

AMBA5 の CHI (Coherence Hub Interface)についての調査 (6. コヒーレンスプロトコル2)

developer.arm.com

developer.arm.com

インターコネクト間のプロトコルフローについて

次に、CHIのプロトコルフローについて見ていく。

Read Transaction flows

Read transactions with DMT and without snoops

DMTというのはDirect Memory Transferであるということを思い出しておく。つまりリクエスタの要求に対して、データはHomeノードを介さず直接変換される。

  1. RN-FがHN-FにReadリクエストを送る
  2. HN-FがSN-FにReadリクエストを送る
    • ReadリクエストのIDフィールドは送られるデータレスポンスをベースにしている。データはリクエスタもしくはHN-Fに返される。
  3. SN-FはデータレスポンスをRN-Fに直接返信する
  4. 最初のリクエストがReadSharedの場合、RN-FはHN-FにCompAckを送信する。
f:id:msyksphinz:20210815231655p:plain:w400

この図を見てわかる通り、RN-Fのキャッシュラインの状態はI(Invalid)からUC(Unique Clean)状態になる。

Read transactions with DMT and with snoops

DMTにおけるスヌープ付きのリードリクエストについてフローを確認する。このためには、ReadSharedトランザクションを送出する。

下記のダイアグラムにおいて、ノードの役割は以下のとおりである。

  • RN-F0 : リクエストノード。リクエストを送出する。
  • RN-F1 : リクエストノード。今回はリクエストを送出せず、ホームノードからスヌープを受け取る。
  • HN-F : ホームノード。スヌープ処理とスレーブへのリクエスト送出を取り扱う。
  • SN-F : スレーブノード。データリクエストを受け取りレスポンスを返す。

いかのような順序でフローが実行される。

  1. RN-F0がHN-Fにリードリクエストを送出する。
  2. HN-FがスヌープリクエストをRN-F1に送出する。
  3. RN-F1からスヌープレスポンスを受け取り、RN-F1にデータが存在しないことを確認した後、HN-FがSN-Fに対してリードリクエストを送出する。
  4. SN-FはデータレスポンスをRN-F0に送出する。
  5. RN-F0はCompAckをHN-Fに送出し、ReadSharedのリクエストを完了させる。
f:id:msyksphinz:20210817235553p:plain:w400

read transaction with DCT

DCTはダイレクトキャッシュ転送(Direct Cache Transfer)を用いるタイプの転送について。

ここでのポイントは、RN-F1のスヌープリクエストに対するレスポンスが、直接RN-F0に返されるということである。

  1. RN-F0はホームノードHN-FにReadSharedを送出する。
  2. HN-FはSnpSharedFwdを送出して、RN-F1に対してフォワーディングスヌープリクエストを転送する。
  3. RN-F1のキャッシュライン状態はUCからSCに更新される。
  4. RN-F1はCompData_SCをRN-F0に転送する。
  5. RN-F1はSnpResp_SC_Fwded_SC スヌープをリクエストをHN-Fに送出する。つまり、
    • データはリクエスタにフォワードされた。
    • 最終的なキャッシュライン状態はSCに変更された。
    • 新たにキャッシュラインを取得したノードはそのキャッシュ状態をSCに変更した。
  6. CompDataレスポンスをRN-F0が送信し、HN-Fは転送を完了する。
f:id:msyksphinz:20210817235618p:plain:w400