JavaによるCycleBase Simulatorの実現


はじめに

 ハード設計では、ハード記述言語(Verilog-XL,VHDL)を使って回路を記述するのが通常です。ただこれらの言語はハード記述用、さらに言うと、論理回路の配線用言語であり、頭の中でもやもや考えている抽象度の高い状態、あるいは曖昧な状態では、試しに書いて動かしてみるというのには向きません。事実、最近では、システムの全体設計に、Spec-CやSystem-C等のシステム記述言語が使われ始めています。そこで、自分自身、論理回路的にアルゴリズムを考えるのが苦手ということもあり、論理回路の実装にとらわれない抽象度の高いSimulation環境をJavaで作ることにしました。これにより、Javaのアルゴリズム記述能力を使って開発したい回路の検証が可能になります。

Javaで論理回路をどう表現するか

 Javaは言わずとしれたオブジェクト指向言語です。一方、ロジック回路(HDL言語レベル)もモジュールと呼ばれるまとまった処理単位が複数存在し、並行動作しています。だから、1モジュールを1つのオブジェクトとして表現して、さらに全モジュールを並行動作させればロジック回路のシミュレーションができそうです。また、Javaにはマルチスレッドと呼ばれる並行処理機構も用意されています。もし本気でリアルな動作をシミュレーションしたいのであればマルチスレッドを使ってモジュールをシミュレーションをするというのもありですが、幸いにもFPGA等の回路では同期動作で設計するという制約があります。同期動作とは、自分の理解レベルで書くと以下です。(間違いがあるかもしれません)

 この制約のおかげで、モジュール(=オブジェクト)の出力が次のシステムクロックのショット(立ち上がり、あるいは、立ち下がり)でどうなっているか?のみ計算すれば良くなります。
 まとめますと、JavaでFPGA用のロジック回路をシミュレーションするには、ロジック回路の構成単位であるモジュールを1つのオブジェクトにし、各モジュールに対して、1サイクル単位で個別に計算させることで、疑似的にハードウエアの同期動作をシミュレーションすることが可能になります。

Javaによる実装

 オブジェクト指向設計の際、いつも問題になるのは、何をクラスにするか?です。悩んだときは、何のためにわざわざオブジェクト指向を導入しようとしてるのか?を考えるべきと思います。今回の場合、回路そのものを設計するのではなく、モジュールの並行動作という観点からCPU用ロジックのアルゴリズムを考えるのがSimの目的なので、クラスとして、モジュールと、ワイヤ(モジュール間の接続情報)を扱うことにしました。逆に、論理回路の実装を検証する目的でSimulationを行うのであれば、抽象度を下げて、論理回路を構成する素子(AND回路やFF回路)をクラスとして表現する必要があります。

内部仕様

 Simulation用に、モジュールを表す抽象クラスHModuleと、接続を表すクラスWireを定義し、リセット回路やALU等のモジュールはHModuleの派生クラスとして表現するようにしました。
 シミュレーション動作は以下の通り。

  1. 回路の構築
    ALUやレジスタ等、全モジュールを生成(インスタンシエート)し、モジュール間の結線をWireクラスを用いて表現して回路(アルゴリズム)を表現
  2. CycleベースSim実行
    各モジュールに対して1サイクル分実行させ(メソッド:exeOneCycle)、全モジュールの計算が完了するとシミュレーション時間を1サイクル進める(メソッド:shiftState)。このループを無限に繰り返し、ハードの動作を1サイクル単位でSimulateする。

Cycle Simを用いたアルゴリズム開発

 現状では、Javaによる第一版のCycle Simulatorができあがったという段階であり、このSimulatorを使ってアルゴリズムの改良を行うまでは至っていません。今後は、命令実行の3段パイプラインのアルゴリズム見直しに活用したいと思います。
(人間の頭はたかだか逐次処理を設計するのが限界であり、並行動作や割り込み動作を設計するにはツールを活用しないと無理だと思う。これは自分の頭が悪いせい?そうかも)

Cycle Sim ソース

   ご参考にPC用を付けておきます。処理内容は同じで漢字コードと圧縮のみ異なります。 (Unix用は準備中)

 上記はソースのみです。興味があればJavaの環境でコンパイルして走らせてみて下さい。
 Swing等のGUIを付ければ見栄えが良くなりますが、Simulator作成の最終目的はHDLへの落とし込みなので、見た目は追求してません。


Topに戻る

Original CPUに戻る