HiFive1(Arduino互換RISC-Vボード) を動かしてみる

HiFive1 は32bitのRISCVプロセッサを搭載したArduino互換ボードです。Arduino IDEを利用してRISC-Vプロセッサを使ったアプリの開発が簡単にできます。Arduino IDEからのUploadはOpenOCD(JTAG)になります。

HiFive1の仕様

- SiFive Freesim E310
- RISC-V 32bit, RV32IMAC
    - RV32I Base Integer Instruction Set, Version 2.0
    - “M” Standard Extension for Integer Multiplication and Division, Version 2.0
    - “A” Standard Extension for Atomic Instructions, Version 2.0
    - “C” Standard Extension for Compressed Instructions, Version 1.9
    - RISC-V Privileged ISA Specification, Version 1.9.1
    - RISC-V External Debug Support, Version 0.11
- Speed:320+MHz
- Performance: 1.61 DMIPs/MHz
- Memory:
    - 16KB L1 Instruction Cache
    - 16KB Data SRAM scratchpad
- UART, QSPI, PWM
- JTAG


![HiFive1](https://www.sifive.com/assets/images/products/hifive1/hifive1-top-view.png)

### HiFive1の入手方法

- Crowd Supply から
    - https://www.crowdsupply.com/sifive/hifive1
    - 応募は2016年12月29日で終了し、現在は Pre-Order の状態
- マルツオンラインもしくはマルツ店頭で （2017年3月から扱ってるようです）
    - https://www.marutsu.co.jp/pc/i/836016/ 

### この記事で用いた開発環境

- Ubuntu 16.04 64bit
- Arduino 1.8.0


### 開発環境のセットアップ

- Arduino IDEのインストール （すでに導入済みの場合は省略）
    - https://www.arduino.cc/en/Main/Software から Linux 64bit (arduino-1.8.0-linux64.tar.xz) をダウンロード
    - コンソールで以下を実行
        - tar -xvf arduino-1.8.0-linux64.tar.xz
        - cd arduino-1.8.0/
        - ./install.sh
- Arduino IDEにHiFive1を追加(RISCVのToolchainなどが追加されます)
    - Arduino IDE を実行
    - File -> Preferences -> Settings で下記を追加し、OKボタンを押す
        - Additional Board Manager URLs: http://static.dev.sifive.com/bsp/arduino/package_sifive_index.json
    - Tools -> Board -> Boards Manager で下記を選択し、Installボタンを押す
        - "SiFive Freesom Boards by SiFive"
    - Tools -> Board で  HiFive 1 を選択
    - Tools -> Programmer で SiFive OpenOCD を選択
- USB の設定
    - sudoしなくても使えるように、plugdevグループにアカウントを追加
        - sudo usermod -a -G plugdev $USER
    - HiFive1を自動認識するように、下記のUDEVルールを追加
        - sudo vi /etc/udev/rules.d/99-openocd.rules

#### /etc/udev/rules.d/99-openocd.rules

    # These are for the HiFive1 Board
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0403",ATTRS{idProduct}=="6010", MODE="664", GROUP="plugdev"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="0403",ATTRS{idProduct}=="6010", MODE="664", GROUP="plugdev"
    # These are for the Olimex Debugger for use with E310 Arty Dev Kit
    SUBSYSTEM=="usb", ATTRS{idVendor}=="15ba",ATTRS{idProduct}=="002a", MODE="664", GROUP="plugdev"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="15ba",ATTRS{idProduct}=="002a", MODE="664", GROUP="plugdev"



     

### 動作確認

PCとボードをUSBケーブで接続。他に接続されたUSBシリアルデバイスがない場合、/dev/ttyUSB1 にシリアル接続されるので、ScreenコマンドでHiFive1にアクセスする。

    sudo apt install screen
    sudo screen /dev/ttyUSB1 115200

PCとボードを接続した状態で、ボード上のリセットボタン（赤いボタン）を押すと下記のメッセージが表示される。


                    SIFIVE, INC.

             5555555555555555555555555
            5555                   5555
           5555                     5555
          5555                       5555
         5555       5555555555555555555555
        5555       555555555555555555555555
       5555                             5555
      5555                               5555
     5555                                 5555
    5555555555555555555555555555          55555
     55555           555555555           55555
       55555           55555           55555
         55555           5           55555
           55555                   55555
             55555               55555
               55555           55555
                 55555       55555
                   55555   55555
                     555555555
                       55555
                         5
    
                   'led_fade' Demo
    
    
    
    55555555555555555555555555555555555555555555555
    5555555 Are the LEDs Changing? [y/n]  555555555
    55555555555555555555555555555555555555555555555
    y
    PASS






screen から抜けるには C-a k (Ctrl+aを押した後に k)。


### サンプルコードのコンパイルとボード上での実行

- File -> Examples -> Basics から Blink を選択
- Sketch -> Upload Using Programmer を実行

![Screenshot from 2017-01-01 07-06-52.png](https://qiita-image-store.s3.amazonaws.com/0/157475/daefd71d-f8e8-90a6-3472-09757a603b3b.png)

LEDが緑で点滅すればOK.

### HiFive1の起動の仕組み

ノーマルブート

- POR もしくはリセットボタン
- SPI Flash (0x20000000) に書き込まれたブートローダーを起動し初期化を実施、緑のLEDが点灯
- SPI Flash (0x20400000) に書き込まれたユーザーアプリケーション実行
- ユーザーアプリケーション実行中にユーザーアプリケーションの更新が（JTAG経由で）可能

セーフブート（ダメなユーザーアプリケーションが書き込まれた際に、再プログラム実施）

- POR もしくはリセットボタン
- SPI Flash (0x20000000) に書き込まれたブートローダーを起動し初期化を実施、緑のLEDが点灯
- 緑のLEDが点灯の際にリセットボタンを押す
- 赤のLEDが点滅（ユーザーアプリケーションは実行されない）
- ユーザーアプリケーションの更新

### HiFive1の動作周波数

HiFive1の動作周波数は、Arduino IDEのToolsメニューから１６MHz、256MHz、 320MHzの３種類が選べます。

### HiFive1のXIP (QSPI Flash上のアプリ実行）

HiFive1はXIP（eXecute-In-Place）でQSPI Flash上のアプリを実行します。CPUからQSPIメモリへのアクセスは遅いため、２Wayのインストラクションキャシュ１６KBが搭載されています。ただし、QSPIメモリへのアクセスは通常はシングルモードですので、DualかQuadに変更すれば実行速度が速くなります。現在のチップはQuadモードにバグがありDualでしか動きませんが、アプリのSetupで下記を追加すればFlashからの命令コードの読み込みが速くなります。

    SPI0_REG(SPI_REG_FFMT) =
       SPI_INSN_CMD_EN         |
       SPI_INSN_ADDR_LEN(3)    |
       SPI_INSN_PAD_CNT(4)     |
       SPI_INSN_CMD_PROTO(0)   |
       SPI_INSN_ADDR_PROTO(1)  |
       SPI_INSN_DATA_PROTO(1)  |
       SPI_INSN_CMD_CODE(0xbb) |
       SPI_INSN_PAD_CODE(0x00);





### 参照

- SiFive（https://www.sifive.com/products/hifive1/）
- CrowdSupply (https://www.crowdsupply.com/sifive/hifive1/)
- セットアップガイド （https://dev.sifive.com/hifive1/hifive1-getting-started-guide/）