RISC-Vのシステムレジスタの仕様は、RISC-V Privileged ISA Manual に記載されている。 ここにはシステムレジスタCSRの定義がいくつか記述されている。このなかには、いくつかの略語が使われており、CSR内部のフィールドの扱い方が説明されている。
自分でもよくわからなくなりそうだったのでまとめておいた。
CSRフィールドの仕様
CSR内のフィールドの動作を記述するために、以下の定義と略語を用いる。
Reserved Writes Ignored, Reads Ignore Values (WIRI)
いくつかのRead-only および Read/Writeレジスタには、将来の仕様のためのRead-onlyレジスタを保持している。これらのRead-onlyフィールドは、読み込み時には無視されるべきである。このフィールドへの書き込みは何の効果もないが、CSRレジスタフィールド全体がRead-onlyレジスタの場合は、そのレジスタへの書き込みが発生すると不定命令例外が発生する。これらのフィールドはWIRIと呼ばれる。
Reserved Writes Preserve Values, Reads Ignore Values (WPRI)
いくつかのRead/Writeフィールドは、将来のために予約されている。ソフトウェアはこのフィールドの値は無視するべきであるし、同じレジスタ内の別の有効なフィールドへの書き込みが発生した場合は、あらかじめ設定された値が保持されているべきである。これらのフィールドはWPRIと呼ばれる。
Write/Read Only Legal Values (WLRL)
いくつかのRead/Writeフィールドは、可能なビットエンコーディングのうち一部のみが有効であり、他の値は予約されている場合がある。ソフトウェアは、このフィールドに対して有効な値以外は書くべきではないし、そのフィールドに無効な値を書き込んでから、他の操作(リセットなど)により有効な値が設定されるまでは、意味のある値が読み込まれることを想定すべきではない。
ある命令がサポートされない値をCSRフィールドに書き込んだ場合、例外を発生することができるが必須ではない。ハードウェア実装は、過去に不定な値を書き込んだ場合に任意の値を返すことができるが、その読みだされる値は過去に書き込んだ値に対して確定的でなければならない。
Write Any Values, Reads Legal Values (WARL)
いくつかのRead/Write CSRフィールドは、可能なビットエンコーディングのうち一部のみが有効であるが、任意の値を書き込むことができ常に有効な値を返すことができるものがある。CSRへの書き込みに副作用が存在しない場合、書き込んだ値を読み直すことにより、そのフィールドの有効範囲を知ることができる。このようなフィールドをWARLと呼ぶ。
WARLフィールドにサポートしない値を書き込んでも、例外は発生しない。無効な値を書き込んでも、読み込み動作でほ常に確定的な有効な値が読みだされる。
つまり以下のようになる?
有効値書き込み | 無効値書き込み | 有効値書き込み→読み込み | 無効値書き込み→読み込み | |
---|---|---|---|---|
WIRI | 無視(CSR全体がRead-onlyの場合例外が発生する) | 無視(CSR全体がRead-onlyの場合例外が発生する) | 正常読み込み | - |
WPRI | 無視 | 無視 | 正常読み込み | - |
WLRL | 正常書き込み | 不定 | 正常読み込み | 不定 |
WARL | 正常書き込み | 正常値に修正される | 正常読み込み | 正常読み込み |