FPGA開発日記

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

RustでRISC-Vの命令セットシミュレータを作ったので(いちおう)公開する

f:id:msyksphinz:20190224185310p:plain

といっても大昔に作ってみたもので、BitBucketの肥やしにしておくのももったいないし、最終的にどうにかして発展させたいので公開する。

今のところデコーダはあるが逆アセンブラはついていないのでspike-dasm頼みである。

github.com

大した実装ではなく、一応テストパタンを通すことができる程度だが、公開したのは今後色々と拡張をしたいから。今時点の私の知識ではこれが限界で、これ以上Rustっぽく書くためにはどうしたらいいのか良く分からない。

RustでRV32とRV64を上手く切り分ける方法はあるか?

もともとRustの勉強を始めたのはこのあたりだが、Scalaを通じてTraitなどの概念を知って、じゃあRV32とRV64で処理内容を同一のトレイトで管理して、実際のCPUのモデルのみを切り替えるという方法は上手く行くだろうかと思って始めた。

ただ、Rustの本質も良く分かっていないし、解説書などを読めば読むほど「それジェネリクスでi32とi64の両方作っておけば良いだけじゃない?」という気分もしてくるので、Rustっぽい綺麗な書き方というのはどうすればよいだろう、という疑問がある。

メモリ管理の厳しいRustで、シミュレータのメモリを効率的に管理する方法はあるか?

もともとC++で書いていたときは、シミュレータは一般的にどのアドレスにメモリアクセスするかは分からないので、ハッシュでメモリ空間を大雑把に管理しており、

  1. これまでにアクセスしたことのない場所へのアクセスが発生すると、ある程度の大きさで新たなメモリ領域を確保し、ハッシュに格納しておく(ある程度の大きさを確保するのは隣接する領域でのアクセスでこのルーチンを繰り返したくないから)。
  2. 別の機会に同じ領域へのアクセスが発生するとハッシュからこの領域を取り出してアクセスする。

という風にして最初から大容量のメモリを確保しなくても良い実装にしている。で、Rustはメモリ管理に厳しい、というか、アクセスの予測ができないメモリアクセスはどうやって実現すればよいのだろう?というのではたと止まってしまった。 でもこれは「実践Rust入門を見ていると、配列とVecを上手く使いながらメモリ領域を管理すると上手く行きそうな気がしてきた。。。

浮動小数点の実装はどうする?

まず一つはC++の実装をライブラリとして組み込む、という方法が挙げられるのと、Rustのモジュールにすでにsoftfloatがあるのでこれを使うという方法。 どちらが大変なのかは見積もりができないが、何か芸がないなあ...


という訳で全然完成形ではないが、いろんな人のアドバイスが欲しいので公開してしまおう。最終的には今管理しているC++RISC-Vシミュレータを、Rustに移行できれば楽しそうだ。

※ おまけ:今管理している自作RISC-Vシミュレータ。C++で記述しておりLinuxもブートできるよ!

github.com