ハード設計では、ハード記述言語(Verilog-XL,VHDL)を使って回路を記述するのが通常です。ただこれらの言語はハード記述用、さらに言うと、論理回路の配線用言語であり、頭の中でもやもや考えている抽象度の高い状態、あるいは曖昧な状態では、試しに書いて動かしてみるというのには向きません。事実、最近では、システムの全体設計に、Spec-CやSystem-C等のシステム記述言語が使われ始めています。そこで、自分自身、論理回路的にアルゴリズムを考えるのが苦手ということもあり、論理回路の実装にとらわれない抽象度の高いSimulation環境をJavaで作ることにしました。これにより、Javaのアルゴリズム記述能力を使って開発したい回路の検証が可能になります。
Javaで論理回路をどう表現するかJavaは言わずとしれたオブジェクト指向言語です。一方、ロジック回路(HDL言語レベル)もモジュールと呼ばれるまとまった処理単位が複数存在し、並行動作しています。だから、1モジュールを1つのオブジェクトとして表現して、さらに全モジュールを並行動作させればロジック回路のシミュレーションができそうです。また、Javaにはマルチスレッドと呼ばれる並行処理機構も用意されています。もし本気でリアルな動作をシミュレーションしたいのであればマルチスレッドを使ってモジュールをシミュレーションをするというのもありですが、幸いにもFPGA等の回路では同期動作で設計するという制約があります。同期動作とは、自分の理解レベルで書くと以下です。(間違いがあるかもしれません)
オブジェクト指向設計の際、いつも問題になるのは、何をクラスにするか?です。悩んだときは、何のためにわざわざオブジェクト指向を導入しようとしてるのか?を考えるべきと思います。今回の場合、回路そのものを設計するのではなく、モジュールの並行動作という観点からCPU用ロジックのアルゴリズムを考えるのがSimの目的なので、クラスとして、モジュールと、ワイヤ(モジュール間の接続情報)を扱うことにしました。逆に、論理回路の実装を検証する目的でSimulationを行うのであれば、抽象度を下げて、論理回路を構成する素子(AND回路やFF回路)をクラスとして表現する必要があります。
内部仕様 Simulation用に、モジュールを表す抽象クラスHModuleと、接続を表すクラスWireを定義し、リセット回路やALU等のモジュールはHModuleの派生クラスとして表現するようにしました。
シミュレーション動作は以下の通り。
現状では、Javaによる第一版のCycle Simulatorができあがったという段階であり、このSimulatorを使ってアルゴリズムの改良を行うまでは至っていません。今後は、命令実行の3段パイプラインのアルゴリズム見直しに活用したいと思います。
(人間の頭はたかだか逐次処理を設計するのが限界であり、並行動作や割り込み動作を設計するにはツールを活用しないと無理だと思う。これは自分の頭が悪いせい?そうかも)
ご参考にPC用を付けておきます。処理内容は同じで漢字コードと圧縮のみ異なります。 (Unix用は準備中)