# Caravel チップの動作確認
本ドキュメントでは,サンプル回路に AES 8-bit S-Box を追加し,efabless 社 chipignite シャトルサービスを利用して作製したチップの動作確認を行います.
```{note}
efabless 社では(2025年1月現在)Caravel template をそのまま試用して製造されたチップと,動作確認用ボードの入門セットがあり,本ドキュメントの動作確認手順で入門セットを用いた試用も行うことができます.入門セットの詳細については,efabless 社へお問い合わせ下さい.
```
## 動作環境
ホストOS : Windows11 23H2
使用ソフトウェア : VirtualBox 7.1.4, Ubuntu 22.04.5 LTS
本ガイドでは,Ubuntu 22.04 LTS に Rootless mode の Docker がセットアップされており,ユーザ名が openeda を前提としており,また,Caravel template セットアップが行われている前提としています.
なお,efabless 社のテストボードはバージョン 5A (後期型,UART 観測ピンが RX のみのもの)を利用しています.テストボードのバージョンによってIO 34~37 ピンとリセット・GND・vddio ピンの配置が異なる場合があり,ご注意下さい.
このほか,動作確認やファームウェアROMを更新するソフトウェア,ハードウェア情報を含む efabless 社 caravel_board レポジトリでは Release/Tag が無く最新(2024/11/13, commit 2812dfd)のものを利用しています.
## 動作確認の概要
Caravel template の制御用 RISC-V はチップ外部の SPI ROM に格納されたファームウェア(命令)を実行しています.本ドキュメントでは動作確認にあたり,環境の構築,ファームウェアコードの生成,SPI ROM の書き込みを行います.
efabless 社提供のボードは SPI ROM の書き込み方法が特殊であり,チップを外部から管理する Housekeeping SPI 機能を介して行います.Housekeeping SPI 機能の操作は efabless 社提供のソフトウェアを利用します.
提供されている SPI ROM 書き込みソフトウェアは,ボード搭載の FTDI 社チップを通じて Housekeeping SPI を操作し,チップから SPI ROM へ書き込みますが,ホスト計算機に FTDI 社チップが複数接続されている場合に正しく動作しない場合があります.
このため,VirtualBox を利用して VM 上には FTDI 社チップが1つだけ接続されている環境を構築します.
## 環境の構築
あらかじめセットアップされている VirtualBox 上の Ubuntu 22.04 LTS へ FTDI 関連のソフトウェアの導入や RISC-V クロスコンパイラを導入し,環境構築を行います.
### Miniforge のインストール と仮想環境の作成
FTDI を利用するライブラリ pyFTDI を導入する仮想環境を構築します.
Miniforge の github レポジトリから最新の Miniforge3-Windows-x86_64 インストーラを取得し,これを実行します.
```
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
bash Miniforge3-$(uname)-$(uname -m).sh
```
インストーラでは下記の設定を行います.オープンソースライセンスの確認,インストールディレクトリは ```$HOME/miniforge3``` の標準設定,シェルスクリプト実行時に conda init 実行をしない,とします.
```
license: yes
directory: default
conda initialization: no
```
インストール後,.bashrc へ conda コマンドを初期化する設定を追加します.
```
# Miniforge
source "${HOME}/miniforge3/etc/profile.d/conda.sh"
```
次に base 環境を呼び出し,conda 本体や基本パッケージのアップデートを行います.(なおインストール直後では .bashrc の変更が反映されていないため,conda.sh 呼び出しをおこなっています)
```
source "${HOME}/miniforge3/etc/profile.d/conda.sh"
conda activate
conda update conda
conda update -all
```
次に,仮想環境(名称は env_board とします)を作成し,仮想環境に移行します.
```
conda create -n env_board python=3.12
conda activate env_board
```
### pyFTDI の導入
pyFTDI パッケージを導入します.(pyFTDI に必要な libusb も導入します)
```
pip install pyftdi
apt-get install libusb-1.0
```
ユーザ空間から FTDI のデバイスへアクセスできるよう,udev の設定を /etc/udev/rules.d/11-ftdi.rules へ行います.
```
touch 11-ftdi.rules
(編集)
sudo cp 11-ftdi.rules /etc/udev/rules.d/11-ftdi.rules
```
11-ftdi.rules
```{literalinclude} ./files/11-ftdi.rules
```
udev の設定を反映させます.
```
sudo udevadm control --reload-rules
sudo udevadm trigger
```
pyFTDI 利用にあたり,ユーザーを plugdev グループに登録します.また,ボードへ別途 UART 接続するにあたり,dialout グループへも登録を行います.
```
sudo adduser $USER plugdev
sudo adduser $USER dialout
```
### RISC-V クロスコンパイラの導入
チップ作製データの生成環境 Caravel template (mpw-9k) と同じタグ (2022.02.12) のクロスコンパイラを利用します.
まず,クロスコンパイラのビルドに必要なパッケージを導入します.
```
sudo apt install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
```
ソースコードを '''$HOME/tools''' へクローンしてビルドを行い,'''/opt/riscv/toolchain''' へインストールします.
ビルドオプションについて
ビルドでは,32-bit/64-bit 両対応,newlib/linux 両対応と設定します.コンパイラのバイナリは RISC-V の 32-bit/64-bit に対応していますが,デフォルト設定では 64-bit のみライブラリが生成されるため,--enable-multilib オプションを指定して 32-bit/64-bit の newlib/linux ライブラリを生成します.
コンパイラのバイナリ名は riscv64-unknown-elf-gcc となりますが,-march -mabi により Caravel 制御用の RISC-V 32-bit へ対応するバイナリを生成することが可能です.
```
sudo mkdir /opt/riscv
sudo chown openeda:openeda /opt/riscv
mkdir /opt/riscv/toolchain
mkdir $HOME/tools
cd $HOME/tools
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
cd riscv-gnu-toolchain
git checkout 217e7f3debe424d61374d31e33a091a630535937
./configure --prefix=/opt/riscv/toolchain --enable-multilib
make -j
```
クロスコンパイラのパス設定を '''$HOME/.bashrc''' へ追加します.
```
export PATH=/opt/riscv/toolchain/bin:$PATH
```
追記後,パス設定の変更を反映します.
```
source ~/.bashrc
```
### caravel_board レポジトリの導入
実機の様々な情報を含む caravel_board レポジトリをクローンし,ファームウェア生成や ROM の書き込み機能を利用できるようにします.繰り返しとなりますが,caravel_board ではリリース・タグが割り当てられていないために最新版を利用しており,利用方法が変更される場合があります.
'''$HOME''' ディレクトリへ caravel_board レポジトリをクローンします.
'''
cd $HOME
git clone https://github.com/efabless/caravel_board
'''
ソフトウェアは caravel_board/firmware/chipignite に格納されています.
## ボードの動作確認
ボード上の M.2 形状コネクタへチップが搭載されたドータボードを搭載します.

ボードに USB ケーブルを接続すると,D4 LED が点灯します.また,あらかじめ LED を点滅するコードが SPI ROM に格納されており,チップ上の Caravel 制御 RISC-V が正しく動作すると,D3 LED が点滅します.
## LED 点滅ソフトウェアの改変と ROM 書き込み
ボード動作確認の LED 点滅させるファームウェアのソースコードが caravel_board の firmware/chipignite/demos に提供されています.
本項目では,Caravel 制御 RISC-V のファームウェア生成方法として,LED 点滅の間隔を変更したバイナリの生成から SPI ROM の書き込みの手順を紹介します.
### Makefile の修正
本ドキュメントの手順で用意した RISC-V クロスコンパイラを利用する Makefile の修正を行います.
ソースコードが格納されているディレクトリへ移動し,パッチファイル Makefile_demos.patch を用意します.
```
cd $HOME/caravel_board/firmware/chipignite/demos
```
Makefile_demos.patch
```{literalinclude} ./files/Makefile_demos.patch
```
パッチを適用します.
```
patch --dry-run Makefile < Makefile_board.patch
patch Makefile < Makefile_board.patch
```
パッチでは,クロスコンパイラの変更のほか,ターミナルソフトウェア名の修正(miniterm から pyserial-miniterm)を行っています.
### ソースコードの修正
demos.c の 166行目辺りに blink() 関数が定義されており,関数内の delay(800000); 文の数値を 800000 から 1600000 へ変更します(二か所).
修正後,ビルドを行います.
```
make
```
SPI ROM 用の demo.hex が生成されます.
### SPI ROM への書き込み
ボードを USB 接続し,USB からチップ経由で SPI ROM を更新します.
まず,ボードを USB 接続し,VirtualBox の デバイスメニュー > USB から 「FTDI」を含むデバイス(例:```FTDI Single RS232-HS [0900]```)を選択し,VM へボードを接続します.
接続に成功すると, /dev/ttyUSB0 が現れます.
```
ls /dev/ttyUSB0
```
demo.hex を SPI ROM へ書き込みます.
```
make flash
```
下記のようなメッセージとともに SPI ROM の書き込みが行われ,書き込み後,LED の点滅間隔が長くなっていることを確認します.
```
python3 ../util/caravel_hkflash.py demos.hex
Success: Found one matching FTDI device at ftdi://ftdi:232h:2:2/1
Caravel data:
mfg = 0456
product = 11
project ID = 23047a49
project ID = 925e20c4
Resetting Flash...
status = 0x00
JEDEC = ef4016
Erasing chip...
...........................done
status = 0x00
setting address to 0x0
addr 0x0: flash page write successful
(中略)
setting address to 0x1100
addr 0x1100: flash page write successful
total_bytes = 4608
status reg_1 = 0x0
status reg_2 = 0x2
************************************
verifying...
************************************
status reg_1 = 0x0
status reg_2 = 0x2
setting address to 0x0
addr 0x0: read compare successful
(中略)
setting address to 0x1100
addr 0x1100: read compare successful
total_bytes = 4608
pll_trim = b'ffefff03'
```
## ボードの取り外し方法
ボードを取り外す際は,VirtualBox の デバイスメニュー > USB から 「FTDI」を含むデバイスを再度選択して VM から切り離した後に,計算機から取り外します.
VM からの切り離しを行わず取り外した際,VM の動作が極端に低下する,VM のプロセスの CPU 利用率が極端に上がる,VirtualBox の操作ができなくなる,など不具合が起こる場合があります.