最初はSipeed社Longan nanoで、続いてSeeed社GD32VF103VBT6ボードでGiga Device社GD32VF103を触ってきました。ペリフェラルを操作している程度ならSDKのAPIを使えれば十分かと思っておりましたが、このところRISC-Vのアセンブラなども触ってみるにいたり、もう少しGD32のコアに「理解を深める」必要あり、と認めました。泥縄。
※「鳥なき里のマイコン屋」投稿順Indexはこちら
GD32VF103チップは、RISC-Vコアだ、といっても
RISC-Vにもいろいろあらーね
ということで、何がどこまで実装されているかは、ベンダによります。マニュアルを読む限り、Basicな32ビットの整数演算命令のセットと、整数の乗除算拡張、16ビット幅の「縮小」命令セットなどが実装されていることが分かります。当然、そういった「何が実装」されているのかは、ソフトウエアからも確認する必要があり、「実装依存」なレジスタの値を読み出すことによってそれが可能です。RISC-Vの場合、コアを制御するためのCSR(Control Status Register)というものがあり、その中にそれらの情報が存在します。CSRは、専用のアセンブリ言語命令でアクセスするようになっています。アセンブラで書いても(例によってまた、x0レジスタが大活躍するのですが)良いのですが、ヘッダファイル
riscv_encoding.h
内で、以下のマクロが定義されているので、それを使えばCのソースからもアクセス可能です。
-
- read_csr(reg)
- write_csr(reg, val)
regにはCSRのアドレスを指定します。上記のヘッダ内でアドレスを示すマクロが定義されているので、それを参照するべきでしょうが、今回はデータシートに書いてあるアドレスをベタ書きしてアクセスしています。
さて、何回か前に書きましたが、GD32VF103は「マイコン」としてはGigaDevice社のチップですが、そのRISC-VコアはNUCLEI社のBumblebeeコアということになっています。PlatforomIOがインストールしたGD32VF103用SDKのツールチェーンを見るとNUCLEIの名が入っています。ただし、NUCELI社のドキュメントを読むとコアの開発には台湾のAndes Technologyが協力しているようなことが書いてあります。そのことを忘れずにCSRの内容を確かめてみます。
CSRにアクセスするときに最初に気になるのが、現在書いているソフトウエアがどのような特権レベルにあるのか、ということです。CSRによっては特権無には読み書きできないものがあります。今までどんな特権で動いているんじゃ、ということも知らずSDKのAPIを動かしてきましたが、反省して、確認。
当方がダウンロードできたNUCLEI社のBumblebeeコアのマニュアルは大変読みにくくて難渋しています(作業途中の版みたいでフォントがアンバランス。)特権レベルのところ、なんとか読み取りました。プリビレッジ・レベルはMachine-modeとUser-modeの2段階が実装されているようです。RISC-V自体は4段階(現状は実質3段階)のレベルを定義しているので、ハードウエアとしては最上位と最下位を実装している形です。仮想記憶などを使わないマイコン向けの「セキュアな組み込み」というスタイルかと思います。
本来はLongan nano用のGD32用SDKをつかって小さなテストプログラムを書きSeeed社GD32VF103VBT6ボードに書き込んでみました。
M-mode(最上位)で動作している
と判断しました。
-
- プリビレッジ・レベルがM-modeでないとアクセスできないCSRに問題なく書き込める
- 存在しないS-mode(Supervisor)レジスタに書き込んでみるとハングする(不正命令例外が発生している筈だが、そのハンドラなど準備していないので)
現環境では、ハード的には2レベルだけれども、最上位の特権レベルにいるということで、プリビレッジは気にせず書いて大丈夫そうです。ただし、CSRが実在することは注意する必要があります。
CSR(一部)の内容を覗いてみた
まず、コアの実装元を示すmvendoridを読んでみました。
ベンダーID=0x31eは、Andes Technology
実際にJEDECに登録のベンダIDを確認したわけでないのですが、ベンダIDはAndesと知れました。Giga DeviceでもNUCELIでもない。
marchidは, Machine Architecture IDです。MSBに1が立っているのは、商用のインプリメンテーションであることを示しています。残りのビットはAndesが決められるのだと思うのですが、以下のページの情報から推測するに、AndesのN22コアのことではないかと思われます。
Nuclei社のN200というコアがリストされており、これがGD32VF103搭載のBumblebeeになっている筈なのです。一方、Andes社も同じリストに N22, N25などというコアを登録していたりします。N25コアの資料を覗きみると、marchid=0x25になっているので、marchid=0x22というのは、N22ベースだから?などと勝手に決めつけております。コアの素性を知るためにはAndesのN22コアの資料をあさるべきなのかもしれませんで。
次のmimpidは、Machine Implementation IDということで、コアのリビジョン番号のようです。MAJOR番号1、MINOR=0、EXTENSION=0ということで、結構「初期の」インプリではないかと想像されます。
次はのmharditは、私の書いたCSR読み出しテストプログラム中のタイプミスです。私のバグ。今気が付きました。本当は、
mhartid
です。これはRISC-V特有?の概念(用語?)のHardware threadというものを示す番号です。ソフトウエアで「生成」されたthreadでない、コアに引っ付いたものらしいです。そして0番は、どのシステムにも必ず存在しなければならない模様。
mstatusは、マシンステータス。MPP=11ということらしく、これはm-modeを示す値。Reset後初期値のままじゃないかと思われます。
misaはMachine ISA。このビットを解読し、実装されているものを列挙すると以下のようです。
-
- Atomic extension
- Compressed extension
- RV32I base ISA
- Integer Multipley/Divide extension
- User mode implemented
- Non-standard extensions present
ソフトウエアから「何が使えるの?」と確認する場合は、このレジスタ読むのでしょう。なお、Non-standardというのは、独自拡張が含まれるぞ、という情報のようです。AndesのN22であれば、Andes V5/V5e拡張というものが含まれる筈。
最後のmmsc_cfgは、Misc. Configuration Registerじゃないかと思うのですが、Bumblebeeコアのマニュアルには記載されていないんじゃないかと思います。探し漏れていたらすみません。AndesのN25系のコアには存在するCSRです。不在のCSRを読むと例外が発生する筈なのですが、読めてしまいました。多分実在する。