(2023/03版)efabless 社 chipignite サービスを利用したチップ作製を目指す.
チップ作製データの生成では,あらかじめ用意されたクロック・リセット生成やIOパッド・制御回路を統合した Caravel ハーネスを利用しすることでデジタル回路の設計のみ注力できる手法を用いる.
本ドキュメントでは,「Caravel 試用 1st (mpw-9g)」のセットアップ後に,Caravelのサンプル回路に自作回路を追加する.
※参考資料
efabless社: https://efabless.com
ユーザ向け公開Caravelハーネス: https://github.com/efabless/caravel_user_project
ユーザ向け公開のチップテストボード: https://github.com/efabless/caravel_board
日本有志による分かり易い情報: https://vlsi.jp/OpenMPW.html
動作環境 : Windows11 22H2, VMWare workstation pro 17.0.2, Ubuntu 22.04.4 LTS
シミュレーションでは大きくメモリを要する点に注意.(サンプルで 10GB~ 程度)
$HOME/
|-- Caravel_mpw-9g/
|-- caravel_mpw-9g/
|-- dependencies/
| |-- openlane_src/
| |-- pdks/
|-- mpw-9g_precheck/
|setenv.sh
環境変数を設定する.
cd Caravel_mpw-9g/caravel_mpw-9g
source ../setenv.sh
Caravelのサンプル回路は 16-bit カウンタであり,GPIOへの出力やWishboneバス・内部ロジックアナライザに接続された構成となっている.サンプル回路に一般的なテーブル型のAES SBOX回路を接続し,カウンタの下位8-bitの値をSBOXへ入力する回路を構成する.1
本ドキュメントの回路では,2023年12月時点のefabless社chipigniteでのチップ製造時にサービスされる動作確認用ボードに合わせてGPIOのピンを割り当てている.具体的には,GPIOの1~4ビットがボードからのチップ制御,5,6ビットがUARTに割り当てられており,回路では8~15ビットにカウンタ値,16~23ビットにSBOX出力を割り当てた.
verilog/rtl 下のソースコード,verilog/dv/io_ports 下のシミュレーションファイル,openlane/user_proj_example 下のビルド設定の3か所を下記のとおり修正する.
1)verilog/rtl 下のソースコード:AES_SBOX_ENC.vを追加し,user_prot_example.v,user_project_wrapper.v,user_defines.vを修正する.修正部分が多いため,ドキュメントに付随したコードを参照.
2)verilog/dv/io_ports/ 下のシミュレーションファイル:テストベクタ io_ports_tv.b とRISC-V 用コード io_ports.c を修正する.また,verilog/includes 下の includes.rtl.caravel_user_project に追加ファイルについて記載する.修正部分はドキュメントに付随したコードを参照.
3)openlane/user_proj_example/ 下のビルド設定 config.json に,追加ファイルについて記載する.
"VERILOG_FILES": [
"dir::../../verilog/rtl/defines.v",
"dir::../../verilog/rtl/user_proj_example.v",
"dir::../../verilog/rtl/AES_SBOX_ENC.v"
]
RTLシミュレーションを行い,上記修正が反映されているか確認を行う.
make verify-io_ports-rtl
下記のように,SBOX の入出力信号が反映されている様子を確認でれる.(例)入力が 0xA0 のとき出力は 0xE0 となる.入出力信号は指定した8~23ビット目に正しく出力されていることがわかる.
(補足)3ビット目はチップ制御用SPIのCSB信号であり,efabless社のボードではFTDIチップのIOに接続されている.
vvp io_ports.vvp
Reading io_ports.hex
io_ports.hex loaded into memory
Memory 5 bytes = 0x6f 0x00 0x00 0x0b 0x13
FST info: dumpfile io_ports.vcd opened for output.
MPRJ-IO state = zz zz : zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz1zzz
MPRJ-IO state = db 9f : zzzzzzzzzzzzzz1001111111011011zzzz1zzz
MPRJ-IO state = e0 a0 : zzzzzzzzzzzzzz1010000011100000zzzz1zzz
MPRJ-IO state = 32 a1 : zzzzzzzzzzzzzz1010000100110010zzzz1zzz
...
MPRJ-IO state = b0 fc : zzzzzzzzzzzzzz1111110010110000zzzz1zzz
MPRJ-IO state = 54 fd : zzzzzzzzzzzzzz1111110101010100zzzz1zzz
MPRJ-IO state = bb fe : zzzzzzzzzzzzzz1111111010111011zzzz1zzz
MPRJ-IO state = 16 ff : zzzzzzzzzzzzzz1111111100010110zzzz1zzz
Monitor: Test 1 Mega-Project IO (RTL) Passed
io_ports_tb.v:208: $finish called at 494862500 (1ps)
mv io_ports.vcd RTL-io_ports.vcd
rm io_ports.vvp
動作波形は,verilog/dv/io_ports/RTL-io_ports.vcd に保存される.
gtkwaveにより動作波形を確認すると,およそ 350us 後にmprj_ioへ値が反映されている様子が確認できる.
gtkwave verilog/dv/io_ports/RTL-io_ports.vcd
caravel_mpw-9g ディレクトリにてビルドを実行する.
make user_proj_example
make user_project_wrapper
ローカルでのデザインチェックを実行する.
make run-precheck
以上の手順にて,サンプルユーザデザインに簡単な回路の追加を行い,そのシミュレーション~ビルド~Caravelを含めたデザインのビルドまで実施した.
なお,サンプル回路ではWishboneバス・内部ロジックアナライザの読み書きの値の検証は難しい構成である.これは,RISC-V から Wishboneバス・内部ロジックアナライザを通じて値を書き込んだ後にカウンタがフリーランし続けるため.[-^1] ↩︎