鳥なき里のマイコン屋(98) GD32VF103の素性?

JosephHalfmoon
JosephHalfmoon

最初はSipeed社Longan nanoで、続いてSeeed社GD32VF103VBT6ボードでGiga Device社GD32VF103を触ってきました。ペリフェラルを操作している程度ならSDKのAPIを使えれば十分かと思っておりましたが、このところRISC-Vのアセンブラなども触ってみるにいたり、もう少しGD32のコアに「理解を深める」必要あり、と認めました。泥縄。

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コアのことではないかと思われます。

RISC-V Exchange: Cores&SoCs

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を読むと例外が発生する筈なのですが、読めてしまいました。多分実在する。

鳥なき里のマイコン屋(97) GD32開発ボードにRISC-Vデバッガ接続 へ戻る

鳥なき里のマイコン屋(99) GD32でAT24C02、EEPROM へ進む