Minecraft用に独自のハードウェア合成言語を作成することにしました。





私は常に人々がゲームで複雑なエンジニアリング構造を作成する方法に興味があり、常にそれを繰り返したいと思っていました。 ずいぶん前、私はYouTubeで、ある人がレッドストーンにプロセッサーをどのように構築したかについてのビデオを見ました。 そして、私は試してみることにしました:私は何が悪いですか? それから私は個々の要素のいくつかのプロトタイプを集め、このタスクが私の手の届かないところにあることに気付きました。 この時点で、私はVerilogを少し習得していました。 思考が生まれました:なぜ誰もMinecraftで複雑な論理回路を構築するためにハードウェア合成言語を使用しようとしなかったのですか? さまざまなフォーラムを少し詳しく調べてみると、同様のユーティリティは見つかりませんでした。レッドストーンのプロセッサが本当に必要でした。 私は自分でコンパイラを書き始めなければなりませんでした。 それから来たもの、カットの下で読んでください。



このプロジェクトは非常に大規模であることが判明したため、個別の段階に分割する必要がありました。



ステージ1:マイクロエレクトロニクスの合成の大きな製品と、PLIの開発用ソフトウェアがどのように機能するかを研究する。

ステージ2:一般的なFPGA製品のネットリストストレージ形式をリバースエンジニアリングします。

ステージ3:FPGAエレメント(LUTセル、トリガー)の実装を作成する

ステージ4:Minecraft用のネットリストトレーサーを作成します。

ステージ5:突然、デバッグプロセスを簡素化するためにレッドストーンシミュレーターを作成する必要がありました。

ステップ6:ハードウェア合成言語の簡略化された構文を開発します。

ステップ7:コンパイラーを作成します。



それでは始めましょう。 まず、Verilogコンパイラをいくつか合成してみましたが、Verilog VHDLなどのいくつかの合成言語をサポートするQartus IIが最も成功した選択肢であることがわかりました。 ビジュアルモデリングには優れたグラフィカル環境があり、ネットリストを視覚化することができ、中間ネットリストを消化可能な形式でアンロードすることができます。



私の最初のユーティリティは、VQMファイルを簡易MNET形式に変換するためのプログラムでした。 VQMは、セル、トリガー、それらのパラメーター、および配線図の記述子です。 同様に、MNETはネットワークノードとそれらの間の接続の単純なリストです。 その後、ユニバーサルの16ビットLUTセルを1つでも実装するのは面倒であることが判明したため、ゲートのレベルまでさらに分解する方法を探す必要がありました。 この方法は、論理オプティマイザーエスプレッソに直面してすぐに見つかりました。 そして、ほんの数日で、65,536個の論理セルのすべての可能な実装のライブラリを数えました。



次に、Minecraftで個別のゲートの描画を開始しました。これに対して、ノードのすべての入力と出力、およびやり直しスキームのレイヤーごとの実装を格納する単純なbinhlテキストストレージ形式を作成しました。 また、javaScriptを使用したworldeditを介して、Minecraftにredstoneスキーマをロードする方法を見つけました。 回路を変換するためのコードジェネレーターを作成した後、プロジェクトの最も難しい部分の1つであるトレーサーの作成を開始しました。



トレーサーには、要素の配置と接続の配置という2つのタスクがあります。 ジョイントの長さ、蜂蜜と化合物の交点、そして結果として回路内の層の数はそれらの位置に依存するため、要素を一見したように配置するのは少し難しくなります。 私は多くのオプションを試し、次のアルゴリズムに決めました:出力入力ポートを配置し、既に配置された要素への接続が最も多い要素を配置し、すべてを配置するまで次の要素に進みます。 次に、空間を3つのブロックの層に分割し、そこにゲート間の接続を配置します。 接続は、修正されたA-Starアルゴリズムを使用して配置され、各接続が配置された後、マスクが更新されます。 また、Minecraftのレッドストーンの機能により、接続の最大長は16ブロックを超えてはなりません。これにより、接続の配置ルールがさらに難しくなります。



そして驚きました。そのようなシステムのデバッグは非常に難しいことが判明しました。 システムのすべての要素の動作の一連の自動テストを行うために、レッドストーンシミュレータの作成を開始する必要がありました。 エミュレータはセルオートマトンに基づいて構築しました。セルオートマトンでは、すべての要素のマトリックスが構築され、各要素は隣接する要素を見て、ルールに応じて状態を変更します。 エミュレータを記述した後、デバッグおよび開発プロセスは高速になりました。







VQMからレッドストーン回路を一貫して構築できた後、合成言語自体の記述を開始しました。Mericraftでの使いやすさのために、Verilogを基礎として少し簡略化しました。 コンパイラを書くために、有名なレクサーとコンパイラコンパイラCOCO / Rを使いました。 彼はBackus-Naurの拡張形式で構文記述を行い、コンパイラの最初のバージョンを組み立てました。



結果によると、かなり複雑なプロジェクトを単独で開発することが可能であることに気付きましたが、これには多くの忍耐と新しいことを学ぶ意欲が必要です。 現在、私はコンパイラ、最適化、およびそのすべてを使用する方法に関するドキュメントに取り組んでいます。



ここに短いビデオがあります:







GitHubリンク



All Articles