fence
lyszt.netはfenceおよびその他のRISC-V命令をより詳しく扱っています。
説明
FENCE命令は、他のRISC-Vハートや外部デバイスまたはコプロセッサから見たデバイスI/Oおよびメモリアクセスの順序付けに使用されます。デバイス入力(I)、デバイス出力(O)、メモリ読み出し(R)、メモリ書き込み(W)の任意の組み合わせを、同じ組み合わせの任意の組み合わせに対して順序付けることができます。非公式には、他のRISC-Vハートや外部デバイスは、FENCEに先行するpredecessorセット内の任意の操作の後に、FENCEに後続するsuccessorセット内の任意の操作を観測することはできません。memorymodelは、RISC-Vメモリ一貫性モデルの正確な記述を提供します。
FENCE命令はまた、外部デバイスによるメモリ読み出しおよび書き込みによって観測される、ハートによるメモリ読み出しおよび書き込みの順序も付けます。ただし、FENCE命令は、他のシグナリング機構を使用して外部デバイスが行うイベントの観測を順序付けません。
EEIは、どのI/O操作が可能か、特に、ロード命令およびストア命令によってアクセスされたときにどのメモリアドレスがメモリ読み出しおよび書き込みではなくそれぞれデバイス入力およびデバイス出力操作として扱われ順序付けられるかを定義します。例えば、メモリマップドI/Oデバイスは通常、RビットおよびWビットではなくIビットおよびOビットを使用して順序付けられる、キャッシュされないロードおよびストアでアクセスされます。命令セット拡張は、FENCE命令のIビットおよびOビットを使用して順序付けられる新しいI/O命令も記述する場合があります。
フェンスモードのエンコーディング
FENCEモードフィールドfmは、FENCE命令のセマンティクスを定義します。FENCE(fm=0000)は、そのpredecessorセット内のすべてのメモリ操作を、そのsuccessorセット内のすべてのメモリ操作より前に順序付けます。
FENCE.TSO命令は、fm=1000、predecessor=RW、successor=RWのFENCE命令としてエンコードされます。FENCE.TSOは、そのpredecessorセット内のすべてのロード操作を、そのsuccessorセット内のすべてのメモリ操作より前に順序付け、そのpredecessorセット内のすべてのストア操作を、そのsuccessorセット内のすべてのストア操作より前に順序付けます。これにより、FENCE.TSO'sのpredecessorセット内のnon-AMOストア操作は、そのsuccessorセット内のnon-AMOロードと順序付けされないままになります。
FENCE命令の未使用フィールド--rs1 and rd--は、将来の拡張におけるより細かいフェンスのために予約されています。前方互換性のために、基本実装はこれらのフィールド#を無視するものとし、標準ソフトウェアはこれらのフィールドをゼロにするものとします。同様に、多くのfmおよびpredecessor/successorセット設定も将来の使用のために予約されています。基本実装は、そのような予約された構成をすべてFENCE命令(fm=0000)として扱うものとし、標準ソフトウェアは非予約構成のみを使用するものとします。