Skip to content

kamiyaowl/rv32i-sim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

45 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

rv32i-sim

ss

アーキテクチャ理解を深めるために、RISC-V 基本整数ISAであるrv32iとELFローダーをC++で実装しています。 gccでコンパイルした生成物を直接読み込んで実行することができます。

プレゼン資料

https://kamiyaowl.github.io/presentation/dist/lets-impl-rv32i.html#1

制約(+Known Issue)

  • ELFファイルの種類に動的リンクが含まれるものは使用できない

ElfLoaderはProgram Headerのp_typeがLOADのものだけをMemにロードします。

  • 使用できる命令セットはiのみ

マシンモードを実装していないため、例外であったり例えば_exit()ecallでもプロセッサは停止します。CSRも実装されていないので割り込みや例外の取得などは行うことはできません。

テスト方法

rv32i向けテストコードのビルド

ビルドツールを実行できるDockerfileを用意しています。

$ cd /rv32i-sample-src
$ docker-compose up

hello.cからhello.shello.oを生成し、objdumpした結果を表示します。

エミュレータ本体のビルド

必要なソースコードはすべて/srcに配置しています。bazelを使用していますが、vscode用のtaskを用意しているのでこちらでもビルド可能です。

また実行時に上書き可能ですが、バイナリの所在をハードコードしてしまっているので気になるようでしたら修正してください。 またデバッグ情報の表示レベルも変更可能です。

/src/main.cpp

$ make build

実行

先にバイナリのパスを変更していない場合、実行時の第1引数にhello.oの場所を指定して実行してください。

License

MIT License