実行環境の準備
SLMLET2の設計データは、https://github.com/hungalab/slmlet2/
にあるが、このリポジトリは、zipにまとめてダウンロードする手が通用しない。これは、Pulp projectのリポジトリを階層的に使っているからで、
git clone --recurse-submodules git@github.com:hungalab/slmlet2.git
でやらないとうまく行かない。ただしこれはあらかじめSSHキーを登録しておく必要がある。
次にSLMLET2のシミュレーション用のファイルでGit中にないものがあり、これは
https://drive.google.com/drive/folders/1HTac4OwyX4Mvbmj5i5vb6oQqKY18ezlS
から以下のをとって来てlibの下に置いてください。
シミュレーションを行うには、RISC-Vのプログラムを設定する必要がある。このためにはコンパイルが必要だが、東大のマシンではOSの関係でRISC-Vのクロスコンパイラが使えないため、先の記事に従ってWSL上で作ったelfファイル(axi_uart.elf)をsimディレクトリに置く。シミュレーション用のMakefileは、今までと同様に、Web上のをダウンロードして、simディレクトリにあるのと入れ替える。さらに、これは若干疑念があるのだが、Web上のaxi_lite_mux.svとaxi_lite_demux.svをrtl/axi/src上の同じ名前のファイルと入れ替える。これで準備は完了である。
シミュレーション
simディレクトリにおいて
python3 make_prog.py axi_uart.elf prog.hex
によりシミュレーションに入力するプログラムprog.hexを作る。この際、boot.vhがsimディレクトリに、boot.hexがbootディレクトリになければならないので、なければWeb上からダウンロードする。最後にsimディレクトリで
make xmverilog_sim
と打ち込むとxcelliumのシミュレーションを実行してくれる。最初に
------------------------------------------------------------
,------. ,--. ,--.
| .--. ' ,---. ,--,--. | | ,---. ,---. `--' ,---.
| '--'.'| .-. |' ,-. | | | | .-. | .-. |,--.| .--'
| |\ \ ' '-' '\ '-' | | '--.' '-' ' '-' || |\ `--.
--' '--'---'----'-----'---'- /--' `---'`---'
RISC-V Platform Level Interrupt Controller
- Configuration Report -------------------------------------
Sources | Targets | Priority-lvl | Threshold? | Event-Cnt
5 | 1 | 8 | YES | 8
- Register Map ---------------------------------------------
Address Function Mapping
0x0000 Configuration TARGETS,SOURCES
0x0004 Configuration 15'h0,TH,PRIORITIES
0x0008 Edge/Level 27'h0, EL[4:0]
0x000c Interrupt Priority 12'h0,1'b0,P[4][2:0],1'b0,P[3][2:0],1'b0,P[2][2:0],1'b0,P[1][2:0],1'b0,P[0][2:0]
0x0010 Interrupt Enable 27'h0, IE[0][4:0]
0x0014 Priority Threshold 29'h0, Th[0][2:0]
0x0018 ID 29'h0, ID[0][2:0]
- End Configuration Report ---------------------------------
が出てきて、それから初期化時におけるメモリ等のエラーが山ほどでる。これは無視してよい。そのうち
Initialize by HUNGA: 0000ffff 0000ffff
Start signal is asserted
Start sending program data via UART................................................................................................................................................................................................................Boot finished!
が出てくる。実はboot.hex中のプログラムをUARTを経由して転送しているのをそのままシミュレーションしているので非常に大きな時間がかかる。その後、
Hello,World byPuts
が出てくる。ちなみにシミュレーションはこれからも続くが、あとは空回りなので中断してもいい。
結果の確認
Web上からwavego.shをダウンロードしてsim上で、source ./wavego.shと実行する。Cadence simvisionが上がるので、データベースを読み込み、任意の信号を観測できる。今回のHelloWourldは、UARTを使うのでこの入出力を観測したのが添付の図である。前半の長い期間はプログラムのブート用であり、最後のちょっとした部分がメッセージの出力に相当する。