• Showing Page History #46376
  • Showing Page History #46241

DocumentForDpiSample

ご注意 : 開発中のため、実際の動作と違っている箇所や、未実装な部分があります。

必要なドキュメント

  • クラスとその機能
  • ユーザプログラムの作り方
  • ユーザプログラムを実機で使うためには
  • 対応プロセッサを追加するには

クラスとその機能

MpuIf (cMpuIf.h) 基底クラス

ユーザプログラムに対して、プロセッサの インスタンスを操作(read,write)する方法を提供するインタフェースクラスです。 プロセッサに依存させないために、ユーザプログラムではMpuIfの 派生クラスのヘッダ(Sh7751.hなど)は#includeしてはいけません。

Mpu (cMpu.h) MpuIfから派生

ライブラリプログラムに対して、プロセッサのインスタンスを 操作(createなど)する方法を提供するクラスです。純粋仮想関数を含むため、 インスタンス化できません。対応プロセッサを追加するときは、 Sh7751クラスと同様にMpuクラスをpublic継承したクラスを 作ります。 このクラスはmodel/MPU.vと対になっています。

Sh7751 (cSh7751.h) Mpuから派生

プロセッサの動作を実装するクラスの一例です。 このクラスはmodel/SH7751.vと対になっています。

MpuFactory (cMpuFactory.h) 基底クラス

Singleton(インスタンスが一個だけ)のクラスです。 Mpu派生クラスのインスタンスを生成するのが役割です。

MpuFactoryEnlarger (cMpuFactoryEnlarger.h) 基底クラス

MpuFactoryに対して、実行時(ライブラリがロードされて静的 オブジェクトの初期化が行われるとき)にプロセッサの作り方を 教える役割を持つクラスです。 Sh7751.cppなどの、Mpuから派生したクラスの実装の中で使います。

Absorber (cAbsorber.h)

シミュレータと実機の違いを吸収するためのテンプレートクラスです。 テンプレートから作られたuint32_c, uint16_cなどが、 FPGA構造体を定義するヘッダで使用されます。 なお、マクロREALWORLDが未定義の場合は、uint32_cなどは Cの組み込み型(unsigned int)のtypedefになり、Cでコンパイル 可能になります。

ユーザプログラムの作り方

FPGAのレジスタ情報が記述されたFpganame.csvファイルを作ります。 csvファイルからFpganame.hとFpganame.cppが自動作成されるので、 ユーザプログラム(以降user.cppと表記)で#include "Fpganame.h"します。 そうすると、Fpganameの持つレジスタfooは fpganame.foo = 0x12345678; のような代入をしたり、 unsigned value = fpganame.foo;のような参照をしたりできるようになります。

ユーザプログラムの中で時間待ちをしたいときは、 fpganame.nop(uint32_t clocks)を呼び出してください。クロック数ですから、 時間を指定したい場合はnop(時間s/周波数Hz)としてください。 なお、fpganame.nop(uint32_t clocks)はマクロREALWORLDが定義されている場合はコンパイルエラーになります。

ユーザプログラムを実機で使うためには

マクロ REALWORLD を定義した状態で、hoge.cppとuser.cppを コンパイルします。REALWORLDが定義されているとhoge.cppは C++でなくCコンパイラでもコンパイル可能なので、実機では C++コンパイラが使えないというときでも大丈夫です。 user.cppは、C++の機能に依存しないように書けばCコンパイラで コンパイルできます。

対応プロセッサを追加するには

SH7751.vを参考にしてNEWCPU.vを作成し、Sh7751.hとSh7751.cpp を参考にしてNewcpu.hとNewcpu.cppを作ります。 注意点

  • 制御系の信号(CS,OE,WEなど)は、Verilog側とC++側で 添え字を一致させなければなりません。

備考

  • Newcpu::create(int mpu_id, const char *mpu_name)の 実装で、複数の文字列とマッチするようにすれば、仕様が少しだけ 異なるプロセッサを同一のC++実装でサポートすることも可能です。