FPGA開発日記

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

RISC-V の Privileged Instruction Set の仕様書Ver1.7が公開 (Control Status Registers)

いわゆるシステムレジスタ群がこのCSR (Control Status Register)に相当する。 CSRはシステムレジスタIDでマッピングされており、これらのアドレスを指定することでアクセスする。

CSRにアクセスできるのは以下の命令になる。

(以下のアーキテクチャ仕様書から抜粋) http://www.eecs.berkeley.edu/Pubs/TechRpts/2015/EECS-2015-49.pdf

f:id:msyksphinz:20150510144708j:plain

基本的に上記の命令は全てアトミックな命令になっている! どのCSRにアクセスするかは、上位の12ビットのアドレスによって規定されている。後の章になって登場してくるのだが、 このアドレスマップは以下のようになっている。

f:id:msyksphinz:20150510144913j:plain

さらに細かなエンコーディングは後の章で出てくる。

CSRRW (Atomic Read/Write CSR) は、指定されたCSRレジスタの内容と指定した整数レジスタの内容をスワップする。 CSRRWはCSRレジスタ値を読み取り、整数レジスタのサイズまでゼロ拡張を行って、整数レジスタに値を書き込む。 それと同時に、整数レジスタの値がCSRに書き込まれる。

CSRRS (Atomic Read and Set Bit in CSR) は、CSRの値を読み込み整数レジスタに書き込む。 整数レジスタCSRの値を読み込み、整数レジスタに格納されているビットポジションのCSRの値を1に更新する。 仕様書の記述があいまいだが、おそらく整数レジスタ側に書き込まれる値は変化せずに、CSR側の値を一方的に更新するのだと思う。 ここらへんは抽象的な表現が多すぎてあまり良く分からない。

CSRRC (Atomic Read and Clear Bit in CSR) は、CSRの値を読み込み整数レジスタに書き込む。CSRRSの逆。 整数レジスタCSRの値を読み込み、整数レジスタに格納されているビットポジションのCSRの値を0に更新する。

CSRRWI/CSRRSI/CSRRCI はrs1の変わりに、CSRの値をzimm[4:0] で示される即値をゼロ拡張する値を使って更新する。 その再、zimm[4:0]が0の場合は、書き込みを行わないらしい(使いどころが良くわからない。。。5ビットだけ書き込めて何が嬉しいんだ?)