FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Western DigitalのRISC-VコアSweRV-EH1 (3. オリジナルプログラムを動かす)

Western DigitalからオリジナルのRISC-VコアSweRVがリリースされ、テストベンチが動かせるようになった。 構造が分かってきたので、今度は自分のプログラムを動かしてみたい。

github.com

マニュアルのメモリマップを見ても正しいようには思えないのだが、とりあえずテキストは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モードでコンパイルしてしまわないように。

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

正しく動いたぞ!

f:id:msyksphinz:20190205002042p:plain
自作プログラムが動作し、"Helo, msyksphinz"と表示された。