FPGA開発日記

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

Chiselで記述された教育用RISC-VプロセッサSodor (1. ビルドとセットアップ)

f:id:msyksphinz:20181105012126p:plain

Chiselのイントロダクションを一通りやり終えたので、次はより実践的なデザインを見ていくために、RISC-V Sodorを見ていくことにした。

Sodorは教育用に作られたRISC-Vのプロセッサで、Rocketよりも単純な構成を取っている。 デザインも1ステージのものから5ステージのものまで用意されており、徐々にスケールアップしていくには良いデザインではなかろうか。

まずはデザインをコンパイルしてからシミュレーションをするところまで進めてみる。

github.com

まずはリポジトリをダウンロードする。RISC-V Fesvrも一緒に落ちてくるので、--recurse-submodulesを付けておくとよいかもしれない。

git clone https://github.com/ucb-bar/riscv-sodor.git --recurse-submodules

fesvrのビルドをする。これはシミュレーションを行うときに必要だ。

cd riscv-sodor/riscv-fesvr
mkdir build
cd build
../configure --prefix=${PWD}/../local
make
make install

次に、Sodorの本体に戻ってビルドを実行する。

cd ${riscv-sodor repository}
./configure --with-riscv=${PWD}/riscv-fesvr/local
make

シミュレーションを実行するためには、run-emulatorを実行すればよい。

make run-emulator
...
./emulator +max-cycles=10000000 +verbose +loadmem=/home/msyksphinz/work/riscv/riscv-sodor/install/riscv-bmarks/rsort.riscv none 3>&1 1>&2 2>&3 | /home/msyksphinz/riscv64/bin/spike-dasm  > output/rsort.riscv.out
mcycle =
minstret =
mkdir -p output
./emulator +max-cycles=10000000 +verbose +loadmem=/home/msyksphinz/work/riscv/riscv-sodor/install/riscv-bmarks/towers.riscv none 3>&1 1>&2 2>&3 | /home/msyksphinz/riscv64/bin/spike-dasm  > output/towers.riscv.out
mcycle =
minstret =
mkdir -p output
./emulator +max-cycles=10000000 +verbose +loadmem=/home/msyksphinz/work/riscv/riscv-sodor/install/riscv-bmarks/vvadd.riscv none 3>&1 1>&2 2>&3 | /home/msyksphinz/riscv64/bin/spike-dasm  > output/vvadd.riscv.out
mcycle =
minstret =

  [ PASSED ] output/median.riscv.out
  [ PASSED ] output/multiply.riscv.out
  [ PASSED ] output/qsort.riscv.out
  [ PASSED ] output/rsort.riscv.out
  [ PASSED ] output/towers.riscv.out
  [ PASSED ] output/vvadd.riscv.out

make[1]: Leaving directory '/home/msyksphinz/work/riscv/riscv-sodor/emulator/rv32_ucode'
install -d emulator/rv32_ucode/generated-src/
date > emulator/rv32_ucode/generated-src/timestamp

とりあえず動作することは確認した。