Chipignite チップ作製に向けた,Caravel のサンプル回路へ自作回路の付加 その1(mpw-9g)

(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~ 程度)

Caravel フォルダの構成

$HOME/
|-- Caravel_mpw-9g/
    |-- caravel_mpw-9g/
    |-- dependencies/
    |   |-- openlane_src/
    |   |-- pdks/
    |-- mpw-9g_precheck/
    |setenv.sh

Caravel 環境の設定

環境変数を設定する.

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"
    ]

GPIOのRTLシミュレーション

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を含めたデザインのビルドまで実施した.


  1. なお,サンプル回路ではWishboneバス・内部ロジックアナライザの読み書きの値の検証は難しい構成である.これは,RISC-V から Wishboneバス・内部ロジックアナライザを通じて値を書き込んだ後にカウンタがフリーランし続けるため.[-^1] ↩︎