Western DigitalからオリジナルのRISC-VコアSweRVがリリースされ、テストベンチが動かせるようになった。 構造が分かってきたので、今度は自分のプログラムを動かしてみたい。
マニュアルのメモリマップを見ても正しいようには思えないのだが、とりあえずテキストは0x0000_0000から格納しておけば良いらしい。 以下のようなプログラムを作成し、文字を表示するようにした。 以下は、コンソールに"Hello, msyksphinz"と表示する、つもり。
- testbench/tests/startup.S
.section .text _start: ... li x10, 0xd0580000 la x11, character loop: lb x1, 0(x11) sw x1, 0(x10) addi x11, x11, 1 bnez x1, loop finish: j finish ... character: .ascii "Hello, msyksphinz"
以下のようにしてrv32モードでコンパイルする。SweRVはRV32なので、64bitモードでコンパイルしてしまわないように。
- testbench/tests/Makefile
all: program.hex data.hex program.hex: program.elf elf2hex 8 128 $< > $@ data.hex: program.elf elf2hex 8 128 $< > $@ program.elf: startup.S riscv32-unknown-elf-as -march=rv32im $< -c -o $<.o riscv32-unknown-elf-ld $<.o -Tlink.ld -o $@
hexファイルは、64bit毎にプログラムを並べておけばよい。また、ハーバードアーキテクチャのようなので、プログラム用のprogram.hexと、データ用のdata.hexを用意する。ただし実体は全く同じものだ。
- program.hex
0000011300000093 0000021300000193 0000031300000293 0000041300000393 0000051300000493 00000597d0580537 0005808303458593 0015859300152023 0000006ffe009ae3 0000001300000013 0000001300000013 0000001300000013 6d202c6f6c6c6548 6e696870736b7973 000000000000007a 0000000000000000
これをreadmemhされるように配置し、さらにテストベンチの実行時間も伸ばす。
diff --git a/testbench/test_tb_top.cpp b/testbench/test_tb_top.cpp index 92dd89e..7538ecf 100644 --- a/testbench/test_tb_top.cpp +++ b/testbench/test_tb_top.cpp @@ -47,7 +47,7 @@ int main(int argc, char** argv) { // Simulate - for(auto i=0; i<200; ++i){ + for(auto i=0; i<2000; ++i){ clkCnt++; if(i<10) { tb->reset_l = 0;
これでシミュレーションを実行した。
make -f $RV_ROOT/tools/Makefile verilator-run
cp /home/msyksphinz/work/riscv/swerv_eh1/testbench/tests/*.hex . ./obj_dir/Vtb_top Start of sim Hello, msyksphinz End of sim
正しく動いたぞ!