論理シミュレーション¶
rv_core の動作を論理シミュレーションで確認する。
rvsim の動作と比較し、RTL のデバッグを行う。
├── rv_core
│ ├── hdl/ # HDL source
│ └── sim/ # 論理シミュレーション環境
│ ├── convmem.py # .mem ファイルを prog_u.mem/prog_l.mem に変換する
│ ├── compile.sh # HDL を読み込んで vivado の xelab で elaboration → xsim.dir/tb_rvc
│ ├── run.sh # シミュレーション実行 (xsim command line)
│ ├── sim.sh # シミュレーション実行 (xsim GUI)
│ ├── regression.sh # いくつかのプログラム(.mem)をシミュレーション実行し、結果を .ref と比較
│ ├── tb_rvc.prj # HDL source list
│ ├── rvc.sv # rv_core と dpram を実装した module
│ └── tb_rvc.sv # rvc のテストベンチ
│
└── rv-test # テストプログラム
├── Makefile
├── crt0.S # startup routine
├── *.c # program C source
├── rv32ldscr.x # linker script
├── include/
└── lib/ # mini stdio (printf etc)
シミュレーション手順¶
テストプログラムをクロスコンパイル¶
$ cd rv32emc/rv-test
$ make # クロスコンパイル → 実行バイナリ生成
:
/opt/rv32e/bin/riscv32-unknown-elf-gcc -g -Wall -O2 -march=rv32emc -mabi=ilp32e -nostartfiles -I./include -c pi.c
/opt/rv32e/bin/riscv32-unknown-elf-gcc -o pi crt0.o pi.o -march=rv32emc -mabi=ilp32e -Wl,-Map,pi.map,-T,rv32ldscr.x -nostdlib -L./lib -lmc -lm -lc -lgcc
:
$ make install # 実行バイナリから RAMの初期値ファイル(.mem)、ISS での実行結果(.ref) を作成
:
/opt/rv32e/bin/riscv32-unknown-elf-objcopy -O binary -S -R .stack pi pi.bin # 実行バイナリ pi をRAMの初期値ファイル pi.mem に変換
od -An -tx4 -v pi.bin > pi.mem
:
rvsim -r pi 2> pi.ref # ISS(rvsim) で実行バイナリ pi を実行し、printf() 出力を pi.ref にセーブ
reset_pc()
exit(): 19
Total clock cycles: 26717123 stall - bra: 1093043 [ 4.1%] data: 346613 [ 1.3%] exec: 10115680 [37.9%]
:
cp -p hello.mem fptest.mem gauss.mem pi.mem ecc.mem mul.mem hello.ref fptest.ref gauss.ref pi.ref ecc.ref mul.ref ../rv_core/sim/
# .mem .ref を、シミュレーション実行 dir ../rv_core/sim/ にコピー
論理シミュレーション¶
$ cd rv32emc/rv_core/sim
$ ./convmem.py pi.mem # 実行するプログラムの .mem ファイルを dpram の初期値ファイル prog_u.mem/prog_l.mem に変換
$ ./compile.sh # elaboration
$ ./run.sh # xsim 実行 (command line)
($ ./sim.sh) # xsim 実行 (GUI)
# printf() 出力は、"stderr.out" に出力される