Caravel template のシミュレーション

Caravel template の環境構築,サンプル回路の合成ののちにシミュレーションを行う手順を記載します. Caravel template では論理回路,論理合成後,遅延を含めた論理合成後の3つのシミュレーションが可能ですが,本ドキュメントでは,論理回路のシミュレーションのみを行います.

注釈

Caravel template 環境の回路合成はシャトルサービス向けのユーザ領域のみが対象ですが,シミュレーションではチップ全体と対象が異なります.

動作環境

本ドキュメントで対象としている mpw-9k では,論理合成後・遅延情報を含めた論理合成後のシミュレーションに不具合が発生する場合があります(mpw-9c など異なるリビジョンをお試し下さい).なお,論理合成後のシミュレーションでは大量のメモリや計算量を要します.

シミュレーション環境の設定

環境変数の設定を行い,シミュレーション環境の設定や波形表示ソフトウェア gtkwave を導入します.

cd Caravel_mpw-9k/caravel_mpw-9k
source ../setenv.sh
make simenv
sudo apt install -y gtkwave

Caravel template のシミュレーション範囲

Caravel の環境では,ユーザ回路だけでなく,Caravel 制御回路(RISC-Vプロセッサなど)や IO ポートを含んだチップ全体のシミュレーションが実行されるため,大きい計算時間を要します.また,複雑なシミュレーションでは制御回路の RISC-V のコードを記載することが必要となります.RISC-V のコードは,シミュレーションベクタで定義されている疑似 SPI-ROM に hex データとして格納します.(本ドキュメントでは RISC-V のコードはデフォルトのものを利用します)

Caravel template のシミュレーション呼び出し方法

Caravel template のサンプル回路では,外部 IO (GPIO),制御回路との Wishbone バス接続,内部ロジックアナライザの3つの入出力経路それぞれにシミュレーションが用意されています.

それぞれの入出力経路に対して,3つ(論理回路・回路合成後・タイミング)の方式でシミュレーションでき,計9種類のシミュレーションが行えます.

シミュレーション対象の入出力経路と方式の選択は,make コマンドのオプションで verify-(シミュレーション対象)-(方式) として指定することができます.

外部 IO の 論理回路シミュレーション

本ドキュメントは,外部 IO の論理回路シミュレーションを実行し,ユーザ回路(カウンタ)の値がユーザ用 IO へ反映されることを確認します.

make verify-io_ports-rtl

シミュレーションが実行され,下記のように外部 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 = zzzz1zzz 
MPRJ-IO state = zzzz1zz0 
MPRJ-IO state = zzzz1z00 
MPRJ-IO state = 01001111 
MPRJ-IO state = 01010000 
MPRJ-IO state = 01010001 
MPRJ-IO state = 01010010 
MPRJ-IO state = 01010011 
...
MPRJ-IO state = 11111011 
MPRJ-IO state = 11111100 
MPRJ-IO state = 11111101 
MPRJ-IO state = 11111110 
MPRJ-IO state = 11111111 
Monitor: Test 1 Mega-Project IO (RTL) Passed
io_ports_tb.v:182: $finish called at 360462500 (1ps)
mv io_ports.vcd RTL-io_ports.vcd
rm io_ports.vvp

動作波形は,verilog/dv/(シミュレーション対象)/ のディレクトリに (方式)-(シミュレーション対象).vcd のファイル名で保存されます.本例では verilog/dv/io_ports/RTL-io_ports.vcd となります.

シミュレーションの動作波形の表示

動作波形を gtkwave に表示させて確認します.

gtkwave verilog/dv/io_ports/RTL-io_ports.vcd

ウィンドウ中の SST から io_ports_tb を選択し,Type/Signals に表示される信号を選択して Append ボタンを押すことで,波形表示する信号を登録します.

gtewave 表示例

Caravel のチップでは電源投入後の初期化後,制御用 RISC-V コアにて 外部 IO などの設定することでユーザ回路から利用できるようになります.上図では,およそ 360 us 後にカウンタの値が IO へ反映されることが確認できます.

制御用 RISC-V の命令列は外部の SPI-ROM に格納されており,1命令毎に数クロックのROMの読み出しが発生しています.(実チップでも同様に1命令の実行に数クロック要します)