# Caravel template のシミュレーション Caravel template の環境構築,サンプル回路の合成ののちにシミュレーションを行う手順を記載します. Caravel template では論理回路,論理合成後,遅延を含めた論理合成後の3つのシミュレーションが可能ですが,本ドキュメントでは,論理回路のシミュレーションのみを行います. ```{note} 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 表示例](img/gtkwave.png) Caravel のチップでは電源投入後の初期化後,制御用 RISC-V コアにて 外部 IO などの設定することでユーザ回路から利用できるようになります.上図では,およそ 360 us 後にカウンタの値が IO へ反映されることが確認できます. 制御用 RISC-V の命令列は外部の SPI-ROM に格納されており,1命令毎に数クロックのROMの読み出しが発生しています.(実チップでも同様に1命令の実行に数クロック要します)