FPGA開発日記

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

ISSでいくつものアーキテクチャをC++で実装するときに気をつけること(気をつけていきたいこと)

今日は、64ビットモードでのシミュレーションをサポートするために、汎用レジスタの64ビット拡張と、環境の修正をした。

github.com

リポジトリ名はRISC-Vを名乗ってはいるが、結局は現在RISC-V(32bit)、MIPS32、MIPS64が混在するシミュレータになっている。それらは、ビルド時に切り替えるようになっており、単一のバイナリでは一つのモードしかサポートできない。 本来、このような使い方はよろしくなく、最終的にマルチコアを実現したいならば、一つの環境内に複数のモードを持っており、ヘテロマルチコアのシミュレーションができるようになることが望ましい。

この場合、共通操作をどのように書き換えれば良いだろう?例えば、汎用レジスタを32ビットだけでなく、64ビットもサポートさせるため、汎用レジスタの所属を基底クラスから継承先のクラスに移動してしまった。 しかしこうすると、大量の共通操作(レジスタの読み書きなど)を継承先のクラスに置き換えなければならなくなる。これまでは、2種類のアーキテクチャ(RISC-V32bit, MIPS32bit)だけなのでなんとかなっていたが、3種類に増えるとさすがにしんどくなってきた。さらにレジスタ幅も違うとなると、これは根本的な改良が必要かもしれない。

予定だが、まずはtemplateを導入して、同一の操作でもアーキテクチャ毎に実際の操作が変わるようにする。ifdefで切り替えずに、templateで複数持っておけば、同時に異なる環境が複数存在しても大丈夫だし、マルチコア環境が整備しやすくなるだろう。 これができるようになれば、浮動小数点のサポートを考えたときに、単精度と倍精度を共通の環境でサポートできるようになると思う。これも、コード量を削減するのに役に立つのではないだろうか。 例外操作なども、外部からのAPIは同一にして、アーキテクチャ毎に動作を規定できるようにしておけば、幅広い対応が可能になると思う。

まずは、このあたりから書き直しだな。冬休みも近いし、実装に力を入れていこう。