12/3-6のRISC-V Summit@Santa Claraにて、Western Digitalが開発中のRISC-Vコアを「SweRV」と名付けてオープンソース化することを発表しました。RTLの公開は1月になるとのことですが、ISSは即日githubに上がったので動作を確認してみます。
#実行環境
Windows10 VirtualBox5上でのUbuntu 18.04
#1. github
Western DigitalのgithubからSweRV-ISSをcloneします。
$ git clone https://github.com/westerndigitalcorporation/swerv-ISS.git
#2. Boostライブラリ
Boostが必要になるということなので、https://www.boost.org/ からboostライブラリの最新版をDownloadしてインストールします。
$ tar zxvf boost_1_69_0.tar.gz
$ cd boost_1_69_0/
$ ./bootstrap.sh
/optにインストールすることにしたのでroot権限でインストール。
$ sudo ./b2 install -j2 --prefix=/opt/boost
結構時間がかかる。。。Warningも結構。。。
#3. SweRV ISSのビルド
githubのREADMEに従うまま進めます。
$ cd swerv-ISS
$ vi GNUmakefile
BOOST_DIR := /opt/boost <--boostインストール場所を指定
$ make
whisper*ができました。
#4. RISC-Vバイナリの準備
ISSに食わせるRISC-Vバイナリは、RISC-V用GNUツールチェインで作られたものを想定します。
例になっているWestern DigitalのRISC-VはRV32IMCです。
例題プログラム(test3.c)
#include <stdio.h>
int
main(int argc, char* argv[])
{
printf("hello world\n");
return 0;
}
RISC-V用バイナリをビルド
$ riscv32-unknown-elf-gcc -mabi=ilp32 -march=rv32imc -static -O3 -o test3 test3.c
#5. ISSの実行(旧バージョン)
$ ./whisper --emulatelinux test3
hello world
Target program exited with code 0
Retired 1853 instructions in 0.00s 13828358 inst/s
$
実行できたようです。
--logを付けると実行ログが出ます。
$ ./whisper --emulatelinux --log test3
#1 0 0001008c 00004197 r 03 0001408c auipc x3, 0x4
#2 0 00010090 fb418193 r 03 00014040 addi x3, x3, -0x4c
#3 0 00010094 81418513 r 0a 00013854 addi x10, x3, -0x7ec
#4 0 00010098 86c18613 r 0c 000138ac addi x12, x3, -0x794
#5 0 0001009c 40a60633 r 0c 00000058 sub x12, x12, x10
#6 0 000100a0 00000593 r 0b 00000000 addi x11, x0, 0x0
#7 0 000100a4 278000ef r 01 000100a8 jal x1, 0x278
#8 0 0001031c 00f00313 r 06 0000000f addi x6, x0, 0xf
#9 0 00010320 00050713 r 0e 00013854 addi x14, x10, 0x0
#10 0 00010324 02c37e63 r 00 00000000 bgeu x6, x12, 0x3c
(中略)
#1845 0 00010200 00040513 r 0a 00000000 addi x10, x8, 0x0
#1846 0 00010204 071020ef r 01 00010208 jal x1, 0x2870
#1847 0 00012a74 00000593 r 0b 00000000 addi x11, x0, 0x0
#1848 0 00012a78 00000613 r 0c 00000000 addi x12, x0, 0x0
#1849 0 00012a7c 00000693 r 0d 00000000 addi x13, x0, 0x0
#1850 0 00012a80 00000713 r 0e 00000000 addi x14, x0, 0x0
#1851 0 00012a84 00000793 r 0f 00000000 addi x15, x0, 0x0
#1852 0 00012a88 05d00893 r 11 0000005d addi x17, x0, 0x5d
Target program exited with code 0
Retired 1853 instructions in 0.02s 97209 inst/s
$
interactiveモードで、対話的なシミュレーションができます。
$ ../whisper --interactive test3
whisper> step
#1 0 0001008c 00004197 r 03 0001408c auipc x3, 0x4
whisper> step
#2 0 00010090 fb418193 r 03 00014040 addi x3, x3, -0x4c
whisper> step 5
#3 0 00010094 81418513 r 0a 00013854 addi x10, x3, -0x7ec
#4 0 00010098 86c18613 r 0c 000138ac addi x12, x3, -0x794
#5 0 0001009c 40a60633 r 0c 00000058 sub x12, x12, x10
#6 0 000100a0 00000593 r 0b 00000000 addi x11, x0, 0x0
#7 0 000100a4 278000ef r 01 000100a8 jal x1, 0x278
whisper> peek pc
0x0001031c
whisper> peek all
pc: 0x0001031c
x0: 0x00000000
x1: 0x000100a8
x2: 0x00000000
x3: 0x00014040
x4: 0x00000000
x5: 0x00000000
x6: 0x00000000
x7: 0x00000000
x8: 0x00000000
x9: 0x00000000
x10: 0x00013854
x11: 0x00000000
x12: 0x00000058
x13: 0x00000000
x14: 0x00000000
x15: 0x00000000
x16: 0x00000000
x17: 0x00000000
x18: 0x00000000
x19: 0x00000000
x20: 0x00000000
x21: 0x00000000
x22: 0x00000000
x23: 0x00000000
x24: 0x00000000
x25: 0x00000000
x26: 0x00000000
x27: 0x00000000
x28: 0x00000000
x29: 0x00000000
x30: 0x00000000
x31: 0x00000000
csr value reset mask pokemask
mstatus(0x300): 0x00000000 0x00000000 0x007ff9bb 0x007ff9bb
misa(0x301): 0x40001104 0x40001104 0x00000000 0x00000000
mie(0x304): 0x00000000 0x00000000 0x00000fff 0x00000fff
mtvec(0x305): 0x00000000 0x00000000 0xfffffffd 0xfffffffd
mhpmevent3(0x323): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent4(0x324): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent5(0x325): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent6(0x326): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent7(0x327): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent8(0x328): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent9(0x329): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent10(0x32a): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent11(0x32b): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent12(0x32c): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent13(0x32d): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent14(0x32e): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent15(0x32f): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent16(0x330): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent17(0x331): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent18(0x332): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent19(0x333): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent20(0x334): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent21(0x335): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent22(0x336): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent23(0x337): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent24(0x338): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent25(0x339): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent26(0x33a): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent27(0x33b): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent28(0x33c): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent29(0x33d): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent30(0x33e): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmevent31(0x33f): 0x00000000 0x00000000 0x00000000 0x00000000
mscratch(0x340): 0x00000000 0x00000000 0xffffffff 0xffffffff
mepc(0x341): 0x00000000 0x00000000 0xfffffffe 0xfffffffe
mcause(0x342): 0x00000000 0x00000000 0xffffffff 0xffffffff
mtval(0x343): 0x00000000 0x00000000 0xffffffff 0xffffffff
mip(0x344): 0x00000000 0x00000000 0x00000000 0x00000fff
pmpcfg0(0x3a0): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpcfg1(0x3a1): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpcfg2(0x3a2): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpcfg3(0x3a3): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr0(0x3b0): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr1(0x3b1): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr2(0x3b2): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr3(0x3b3): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr4(0x3b4): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr5(0x3b5): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr6(0x3b6): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr7(0x3b7): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr8(0x3b8): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr9(0x3b9): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr10(0x3ba): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr11(0x3bb): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr12(0x3bc): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr13(0x3bd): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr14(0x3be): 0x00000000 0x00000000 0xffffffff 0xffffffff
pmpaddr15(0x3bf): 0x00000000 0x00000000 0xffffffff 0xffffffff
tselect(0x7a0): 0x00000000 0x00000000 0xffffffff 0xffffffff
tdata1(0x7a1): 0x23e00000 0x00000000 0xffffffff 0xffffffff
tdata2(0x7a2): 0x00000000 0x00000000 0xffffffff 0xffffffff
dcsr(0x7b0): 0x40000003 0x40000003 0x00008e04 0x00008fcc
dpc(0x7b1): 0x00000000 0x00000000 0xfffffffe 0xfffffffe
mrac(0x7c0): 0x00000000 0x00000000 0xffffffff 0xffffffff
mcpc(0x7c2): 0x00000000 0x00000000 0x00000000 0x00000000
dmst(0x7c4): 0x00000000 0x00000000 0x00000000 0x00000000
mpmc(0x7c6): 0x00000000 0x00000000 0x00000000 0x00000000
dicawics(0x7c8): 0x00000000 0x00000000 0x0130fffc 0x0130fffc
dicad0(0x7c9): 0x00000000 0x00000000 0xffffffff 0xffffffff
dicad1(0x7ca): 0x00000000 0x00000000 0x00000003 0x00000003
dicago(0x7cb): 0x00000000 0x00000000 0x00000000 0x00000000
mgpmc(0x7d0): 0x00000001 0x00000001 0x00000001 0x00000001
mitcnt0(0x7d2): 0x00000000 0x00000000 0xffffffff 0xffffffff
mitbnd0(0x7d3): 0xffffffff 0xffffffff 0xffffffff 0xffffffff
mitctl0(0x7d4): 0x00000001 0x00000001 0x00000007 0x00000007
mitcnt1(0x7d5): 0x00000000 0x00000000 0xffffffff 0xffffffff
mitbnd1(0x7d6): 0xffffffff 0xffffffff 0xffffffff 0xffffffff
mitctl1(0x7d7): 0x00000001 0x00000001 0x00000007 0x00000007
micect(0x7f0): 0x00000000 0x00000000 0xffffffff 0xffffffff
miccmect(0x7f1): 0x00000000 0x00000000 0xffffffff 0xffffffff
mdccmect(0x7f2): 0x00000000 0x00000000 0xffffffff 0xffffffff
mcgc(0x7f8): 0x00000000 0x00000000 0x000000ff 0x000000ff
mfdc(0x7f9): 0x00000000 0x00000000 0x000007ff 0x000007ff
mcycle(0xb00): 0x00000007 0x00000000 0xffffffff 0xffffffff
minstret(0xb02): 0x00000007 0x00000000 0xffffffff 0xffffffff
mhpmcounter3(0xb03): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter4(0xb04): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter5(0xb05): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter6(0xb06): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter7(0xb07): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter8(0xb08): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter9(0xb09): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter10(0xb0a): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter11(0xb0b): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter12(0xb0c): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter13(0xb0d): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter14(0xb0e): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter15(0xb0f): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter16(0xb10): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter17(0xb11): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter18(0xb12): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter19(0xb13): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter20(0xb14): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter21(0xb15): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter22(0xb16): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter23(0xb17): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter24(0xb18): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter25(0xb19): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter26(0xb1a): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter27(0xb1b): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter28(0xb1c): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter29(0xb1d): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter30(0xb1e): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter31(0xb1f): 0x00000000 0x00000000 0x00000000 0x00000000
mcycleh(0xb80): 0x00000000 0x00000000 0xffffffff 0xffffffff
minstreth(0xb82): 0x00000000 0x00000000 0xffffffff 0xffffffff
mhpmcounter3h(0xb83): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter4h(0xb84): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter5h(0xb85): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter6h(0xb86): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter7h(0xb87): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter8h(0xb88): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter9h(0xb89): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter10h(0xb8a): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter11h(0xb8b): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter12h(0xb8c): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter13h(0xb8d): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter14h(0xb8e): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter15h(0xb8f): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter16h(0xb90): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter17h(0xb91): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter18h(0xb92): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter19h(0xb93): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter20h(0xb94): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter21h(0xb95): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter22h(0xb96): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter23h(0xb97): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter24h(0xb98): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter25h(0xb99): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter26h(0xb9a): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter27h(0xb9b): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter28h(0xb9c): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter29h(0xb9d): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter30h(0xb9e): 0x00000000 0x00000000 0x00000000 0x00000000
mhpmcounter31h(0xb9f): 0x00000000 0x00000000 0x00000000 0x00000000
mdeau(0xbc0): 0x00000000 0x00000000 0x00000000 0x00000000
meivt(0xbc8): 0x00000000 0x00000000 0xfffffc00 0xfffffc00
meipt(0xbc9): 0x00000000 0x00000000 0x0000000f 0x0000000f
meicpct(0xbca): 0x00000000 0x00000000 0x00000000 0x00000000
meicidpl(0xbcb): 0x00000000 0x00000000 0x0000000f 0x0000000f
meicurpl(0xbcc): 0x00000000 0x00000000 0x0000000f 0x0000000f
cycle(0xc00): 0x00000000 0x00000000 0xffffffff 0xffffffff
time(0xc01): 0x00000000 0x00000000 0xffffffff 0xffffffff
instret(0xc02): 0x00000000 0x00000000 0xffffffff 0xffffffff
mvendorid(0xf11): 0x00000000 0x00000000 0x00000000 0x00000000
marchid(0xf12): 0x00000000 0x00000000 0x00000000 0x00000000
mimpid(0xf13): 0x00000000 0x00000000 0x00000000 0x00000000
mhartid(0xf14): 0x00000000 0x00000000 0x00000000 0x00000000
mdseac(0xfc0): 0x00000000 0x00000000 0x00000000 0xffffffff
meihap(0xfc8): 0x00000000 0x00000000 0x00000000 0xfffffffc
trigger0: 0x23e00000 0x00000000 0x00000000 0x081818c7 0xffffffff 0x00000000 0x081818c7 0xffffffff 0x00000000
trigger1: 0x23e00000 0x00000000 0x00000000 0x081818c7 0xffffffff 0x00000000 0x081818c7 0xffffffff 0x00000000
trigger2: 0x23e00000 0x00000000 0x00000000 0x081818c7 0xffffffff 0x00000000 0x081818c7 0xffffffff 0x00000000
trigger3: 0x30000000 0x00000000 0x00000000 0x08fffe3f 0x00000000 0x00000000 0x08fffe3f 0x00000000 0x00000000
whisper> step
#8 0 0001031c 00f00313 r 06 0000000f addi x6, x0, 0xf
whisper> step
#9 0 00010320 00050713 r 0e 00013854 addi x14, x10, 0x0
whisper> quit
$
動いているようです。
現在はRISC-Vの A, C, D, F, I, M, S, U の仕様に対応しています。