2018年8月13日月曜日

RISCVを動かしてみる(環境設定)

今更ながらRISCVをいじってみる.まずは環境構築.OSはCentOS7です.
% echo /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
ちなみにUbuntuを想定しているらしく,パッケージが古いCentOSでは動かすのは一苦労です...

長いのでオチだけ:
CentOS 7.4の場合,以下のパッケージが必要.
yumで入る:javac(openjdk), dtc,他にもあるかも
ソースをダウンロードしてコンパイル:LOBTOOL(2.6.4),automake(1.1.4),GCC(4.9)

基本は
https://www.aps-web.jp/academy/risc-v/05/
のサイトの通り.

適当に作業ディレクトリを作って,まずはgit clone
% git clone https://github.com/freechipsproject/rocket-chip.git
% cd rocket-chip
% git submodule update --init --recursive

RISCVのツールチェーンのパスを環境変数に入れる.
% export RISCV=~/rocket-chip/
% export PATH=$PATH:$RISCV/bin/
この地点では~/binは無いが,後でgccなどができる.

デフォルト設定でScalaからVerilogへ変換.
% cd vsim
% make CONFIG=DefaultConfig
初回Makeでは
[error] sbt.librarymanagement.ResolveException: unresolved dependency: org.apache.maven#maven-plugin-api;3.3.9: jgit-repo: unable to get resource for org/apache#apache;17: res=http://download.eclipse.org/jgit/maven/org/apache/apache/17/apache-17.jar: java.net.SocketException: Connection reset
とでて止まった.
何故か2回目は最後まで終了した,大丈夫かこれ.

自分の環境では,javacとdtc(device tree compiler)が必要だった.javacはopenjdk-develに入っているようだ.
% sudo yum install openjdk-devel.x86_64 dtc.x86_64

してもう一度Make.Makeはできたが,VCSが走らない.
% make CONFIG=DefaultConfig
  "/home/****/design/riscv/rocket-chip/riscv-tools/lib/libfesvr.so"
  cannot be opened for reading due to 'No such file or directory'.
  Please fix this issue and compile again.

ここで,READMY.mdを読み,riscv-toolsのディレクトリでBuildしていないことに気がつく.こっちを先にしないといけないっぽい.
% cd ..
% cd rocket-chip/riscv-tools
% git submodule update --init --recursive
% export MAKEFLAGS="$MAKEFLAGS -j4"
% ./build.sh
config.status: error: cannot find input file: `Makefile.in'

riscv-openocdのBuildがうまくいかない.
LIBTOOLとautomakeもVersionが古いとうまくいかない.
LIBTOOLは2.6.4,automakeは1.1.4以上にする必要がある.
yumでは入らないのでソースからコンパイル.
/usr/local/share/aclocal/に/usr/share/aclocalのdirlistを作る.
% su
% echo /usr/share/aclocal >> /usr/local/share/aclocal/dirlist
% exit

ねんのためlibtoolizeしてから再度Build
% libtoolize
% ./build.sh
gcc: エラー: オプション ‘-mcmodel=medany’ 内で認識できない引数です
gcc: 備考: ‘-mcmodel=’ への有効な引数は次の通りです: 32 kernel large medium small
gmake: *** [file.o] エラー 1

調べると,GCCのVersionが4.9以上である必要があるっぽい.
% gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

https://qiita.com/yn-misaki/items/601e260bec0b6eaaa74e
を参考に4.9を自分でビルド.

% sudo yum remove gcc libgcc
% curl -O ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-4.9.3/gcc-4.9.3.tar.bz2
% tar xvfj gcc-4.9.3.tar.bz2
% cd gcc-4.9.3
% mkdir build
% cd build
% ../configure --prefix=/usr  --disable-multilib --enable-languages=c,c++
% make -j 4
% sudo make install

と思ってやってみたけれどだめだった.
% ./build.sh
gcc: エラー: オプション ‘-mcmodel=medany’ 内で認識できない引数です
gcc: 備考: ‘-mcmodel=’ への有効な引数は次の通りです: 32 kernel large medium small
gmake: *** [file.o] エラー 1
もっと調べると,そもそもtargetが上手く指定できていないっぽい.

ググると,=medanyオプションが上手く動かないとき,RISCVのコンパイラが作れていない可能性があるらしい.
https://riscv.org/software-tools/

ためしにbinを見てみたら,64bit版しかなかった.32bit版がよかったのだけれど,build.shの編集の仕方がおかしかったらしい.
もう64bit版で良いか,と64を指定し治してコンパイル
% ./build.sh
うごいた.
Hello Worldしてみる.
% cd ..
%  ./bin/riscv64-unknown-elf-gcc -o hello hello.c
%  spike pk hello
Hello world!\n%             


よくみたら32bit版は別のスクリプトがあった.結局関数に与える引数の与え方が
おかしかっただけだった.てへぺろ

%  ./build-rv32ima.sh
うごいた.
Hello Worldしてみる.
%  ./bin/riscv64-unknown-elf-gcc -o hello hello.c
%  spike pk hello
Hello world!\n%

32bit版もうごいたっぽい.
コンパイラとシミュレータが動いたので,RTLシミュレーションに移動する.
Rocketchipでいくか,PULPinoにするか悩みます.

韓国の先生?の資料がだいぶ役に立った.ハングル勉強したいのう.
http://www.e4ds.com/webinar_tech_dn.asp?idx=279