# Caravel template へのユーザ回路追加
本ドキュメントでは,サンプル回路の16-bitカウンタに AES の 8-bit S-Box のテーブルを追加し,ユーザ回路の追加からチップ作製データの作成やシミュレーションを行います.
```{note}
なお,本ドキュメントでは,efabless 社 chipignite シャトルサービスを利用しました際のチップ作製データの生成手順を記述しています.チップ作製の詳細については,efabless 社へお問い合わせ下さい.
```
## Caravel template 環境のディレクトリ構成
Caravel template 環境は下記のディレクトリ上に構築されているとします.
以下の項では,setenv.sh により環境設定がなされており,また,操作などは全て Caravel_mpw-9k/caravel_mpw-9k ディレクトリ上で実行することを想定しています.
```
$HOME/
|-- Caravel_mpw-9k/
|-- caravel_mpw-9k/
|-- dependencies/
| |-- openlane_src/
| |-- pdks/
|-- precheck_mpw-9k/
|setenv.sh
```
## ユーザ回路のソースコードの修正・追加
Caravel template (Caravel_mpw-9k/caravel_mpw-9k) へユーザー回路を追加する際は,次のディレクトリへの操作を行います.
- verilog/rtl,ユーザ回路のRTLファイルの追加・修正を行います.
- openlane,ビルド対象のRTLファイルなどの設定を行います.
- verilog/rtl/user_defines.v ファイルは環境構築時に修正されているとしています.
また,論理シミュレーションでは,別途,次のディレクトリへの操作を行います.
- verilog/dv,シミュレーションのベクタなどの追加・修正を行います.
- verilog/includes_folder,シミュレーション対象のRTLファイルを設定します.
```{note}
RTLファイルの指定はビルドとシミュレーションで独立しており,シミュレーション結果と作製するチップ間で異なるRTLの組み合わせでない事に注意が必要です.
```
### RTL ファイルの追加と修正
verilog/rtl のユーザ領域コードの修正や S-box テーブルの Verilog HDL ファイルを追加します.
ファイルの追加: AES_SBOX_ENC.v を verilog/rtl ディレクトリへ追加します.
AES_SBOX_ENC.v
```{literalinclude} ./files/AES_SBOX_ENC.v
```
ユーザ領域コードの修正: verilog/rtl/
パッチファイルを利用して,ユーザ領域の回路本体 user_proj_example.v,制御回路との接続記述 user_project_wrapper.v を修正します.
user_proj_example.v では標準で 16-bit カウンタが実装されています.このカウンタの下位 8-bit を S-box モジュールへ入力し,8-bit の出力を得たのち,入出力の計 16-bit を出力するように修正します.また,Wishbone バスや内部ロジックアナライザの接続も同様に変更します.
```$HOME/Caravel_mpw-9k``` ディレクトリに下記の内容の user_proj_example.v.patch を作成し,適用します.
user_proj_example.v.patch
```{literalinclude} ./files/user_proj_example.v.patch
```
```
patch --dry-run caravel_mpw-9k/verilog/rtl/user_proj_example.v < user_proj_example.v.patch
patch caravel_mpw-9k/verilog/rtl/user_proj_example.v < user_proj_example.v.patch
```
user_project_wrapper.v では,ユーザ IO の出力を [37:30] [7:0] から [23:8] へ変更します.これは,ユーザ IO の先頭 8-bit が Caravel 制御回路の GPIO や SPI ROM,UART にも割り当てられており,チップの動作テストではこれら機能を利用するためです.
```$HOME/Caravel_mpw-9k``` ディレクトリに下記の内容の user_project_wrapper.v.patch を作成し,適用します.
user_project_wrapper.v.patch
```{literalinclude} ./files/user_project_wrapper.v.patch
```
```
patch --dry-run caravel_mpw-9k/verilog/rtl/user_project_wrapper.v < user_project_wrapper.v.patch
patch caravel_mpw-9k/verilog/rtl/user_project_wrapper.v < user_project_wrapper.v.patch
```
### ビルド設定ファイルの修正
user_proj_example のビルド時に AES_SBOX_ENC.v を含める設定を openlane/user_proj_example/config.json へ追加します.
verilog/rtl のユーザ領域コードの修正や S-box テーブルの Verilog HDL ファイルを追加します.
```$HOME/Caravel_mpw-9k``` ディレクトリに下記の内容の config.json.patch を作成し,適用します.
config.json.patch
```{literalinclude} ./files/config.json.patch
```
```
patch --dry-run caravel_mpw-9k/openlane/user_proj_example/config.json < config.json.patch
patch caravel_mpw-9k/openlane/user_proj_example/config.json < config.json.patch
```
### シミュレーション設定ファイルの修正
RTL シミュレーション実行時に AES_SBOX_ENC.v を含める設定を verilog/includes/includes.rtl.caravel_user_project へ追加します.
このほか,IO ポートのシミュレーション用ベクタ verilog/dv/io_ports/io_ports_tb.v のピン配置修正を行い,Caravel 制御 VexRiscv プロセッサの起動ファームウェアのコード verilog/dv/io_ports/io_ports.c を修正します.
```$HOME/Caravel_mpw-9k``` ディレクトリに下記の内容の3つのファイルを作成します.
includes.rtl.caravel_user_project.patch
```{literalinclude} ./files/includes.rtl.caravel_user_project.patch
```
io_ports_tb.v.patch
```{literalinclude} ./files/io_ports_tb.v.patch
```
io_ports.c.patch
```{literalinclude} ./files/io_ports.c.patch
```
パッチのチェックを行います.
```
patch --dry-run caravel_mpw-9k/verilog/includes/includes.rtl.caravel_user_project < includes.rtl.caravel_user_project.patch
patch --dry-run caravel_mpw-9k/verilog/dv/io_ports/io_ports_tb.v < io_ports_tb.v.patch
patch --dry-run caravel_mpw-9k/verilog/dv/io_ports/io_ports.c < io_ports.c.patch
```
パッチを適用します.
```
patch caravel_mpw-9k/verilog/includes/includes.rtl.caravel_user_project < includes.rtl.caravel_user_project.patch
patch caravel_mpw-9k/verilog/dv/io_ports/io_ports_tb.v < io_ports_tb.v.patch
patch caravel_mpw-9k/verilog/dv/io_ports/io_ports.c < io_ports.c.patch
```
## 回路合成の実行
ユーザ回路の追加・修正やビルド・シミュレーション設定の修正後,ユーザ回路本体(user_proj_example)と Caravel へ接続するラッパー(user_project_wrapper)の合成を実行します.
```
make user_proj_example
make user_project_wrapper
```
エラーなど表示されず回路合成が成功すると「Flow complete」と表示され,gdsフォルダ下に user_progect_wrapper.gds ファイルが生成されます.
## チップ作製データのチェック
回路合成により得られるチップ作製データの整合性などのチェックを行います.
チェックではチップ製造の工程との整合性チェックのほか,説明ファイル README.md の内容についてもチェックされます.
### README の修正
README.md を下記の例のように書き換えます.
```
This project is minimally modified to mpw-9k caravel template.
The function are a 16-bit counter and an S-box table. 16-bit IOs are set to OUTPUT.
```
### チェックの実行
下記コマンドによりチェックを実行します.
チェック中に不具合が見つかった場合でも全ての項目が確認され,1時間程度要します.
```
make run-precheck
```
全て項目のチェックに合格すると All Checks Passed !!! と表示されます.