FPGA開発日記

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

RISC-Vのキャッシュ・ブロック命令について

RISC-Vのキャッシュ・ブロック命令について、マニュアルを読みながらまとめていこう。

Zicbom: キャッシュ・ブロック管理命令

キャッシュ・ブロック管理命令は、コヒーレントなエージェント群で動作するソフトウェアが、ノンコヒーレントなエージェント群と通信することを可能にする命令である。これらの命令は、以下のいずれかの操作を実行する。

  • インバリデート操作: ノンコヒーレントなエージェント群によるストア操作のデータを、コヒーレントなエージェント群が共通して認識できる時点で、コヒーレントなキャッシュ群から該当キャッシュ・ブロックの全コピーを解放することで可視化する。
  • クリーン操作: コヒーレントなエージェント群によるストア操作のデータを、ノンコヒーレントなエージェント群が共通して認識できる時点で、キャッシュ・ブロックのコピーを書き戻すことで可視化する。ただし、直前のインバリデート、クリーン、フラッシュ操作以降にコヒーレントなエージェントがデータを変更した場合に限る。
  • フラッシュ操作: クリーン操作の直後にインバリデート操作を原子的に実行する。

Zicbom拡張において、これらの命令はシステム内の全エージェントに共通する時点で動作する。すなわち、インバリデート操作はノンコヒーレントなエージェント群のストア操作をコヒーレントなエージェント群が認識できるようにし、クリーン操作はコヒーレントなエージェント群のストア操作をノンコヒーレントなエージェント群が認識できるようにする。

Zicbom拡張は、上記のアーキテクチャ定義に該当しないエージェントの存在を禁止しない。ただし、ソフトウェアはこれらのキャッシュ操作がそのようなエージェントに対して期待通りの効果を持つことを保証できない。

将来の拡張では、性能最適化のために異なるエージェント集合が定義される可能性がある。

これらの命令は、rs1で指定された有効アドレスに対応するキャッシュ・ブロックに対して動作する。有効アドレスは適切な変換機構により物理アドレスへ変換される。

Zicbom拡張を構成する命令は以下の通りである。

RV32 RV64 ニーモニック 命令
cbo.clean base [insns-cbo_clean]
cbo.flush base [insns-cbo_flush]
cbo.inval base [insns-cbo_inval]

Zicbop: キャッシュ・ブロック・プリフェッチ命令

キャッシュ・ブロック・プリフェッチ命令は、ソフトウェアが近い将来に特定の種類のメモリアクセス(命令フェッチ、データ読み出し(ロード)、データ書き込み(ストア))を行う意図があることをハードウェアに示すヒント(HINT)である。

これらの命令は、rs1で指定されたベースアドレスと、imm[11:0]で符号拡張されたオフセットの和として算出される有効アドレスに対して動作する。ただし、imm[4:0]は0b00000でなければならない。有効アドレスは適切な変換機構により物理アドレスへ変換される。

キャッシュ・ブロック・プリフェッチ命令は、rdが0b00000であるORI命令としてエンコードされるが、有効アドレス計算の目的では、このフィールドもストア命令のようにimm[4:0]として解釈される。

Zicbop拡張を構成する命令は以下の通りである。

RV32 RV64 ニーモニック 命令
prefetch.i offset(base) [insns-prefetch_i]
prefetch.r offset(base) [insns-prefetch_r]
prefetch.w offset(base) [insns-prefetch_w]

Zicboz: キャッシュ・ブロック・ゼロ命令

キャッシュ・ブロック・ゼロ命令は、キャッシュ・ブロックに対応するバイト集合にゼロを書き込む命令である。実装は、任意の順序・粒度・アトミシティでバイトを書き換えてもよい(個々のバイト単位でもよい)。

キャッシュ・ブロック・ゼロ命令は、該当メモリアドレスがキャッシュ可能かどうかに関わらずゼロを書き込む。また、本仕様はバイトの書き込み方法を制約しない。

これらの命令は、rs1で指定された有効アドレスに対応するキャッシュ・ブロック、またはそのメモリ領域に対して動作する。有効アドレスは適切な変換機構により物理アドレスへ変換される。

Zicboz拡張を構成する命令は以下の通りである。

RV32 RV64 ニーモニック 命令
cbo.zero base [insns-cbo_zero]