HW高位合成ツールを使ってnand2tetrisのCPUを動かしてみる 7
の続き
VitisでComponent作成
VitisでWorkspaceを作成。HLS Componentを作成し、Target deviceはxc7a35ticsg324-1Lを指定。クロックは控えめに20nsを指定した。C Simulation高速化のため最適化の-O3も指定する。
ソースコードとテストベンチのソースを追加して下図のようになった。
hackcpu.* がClaudeに出力させたコードをベースに修正を入れたCPU core部分。*_task.*がTask群。テストベンチ側はtest_bench.cppをClaudeに最初作ってもらったが、最終的にはPythonアプリによる制御としたのでほとんどすっからかんのコードとなっている。uart_comm.*は仮想端末との通信コードでClaudeにほとんど作ってもらった。
VitisでC SIMULATIONを実行
C Simulation 実行に先立ち、ホスト側とVitis側それぞれの仮想端末をsocatを使って接続しておく。
socat -d -d pty,rawer,echo=0,min=1,time=0,link=/tmp/ttyV0,b4000000 pty,rawer,echo=0,min=1,time=0,link=/tmp/ttyV1,b4000000
socatは以下の記事を参考にさせてもらい、Claudeと相談してパラメータを決めていった。link=/tmp/ttyVxはエイリアスのようなもので、これがないと実行する度に/dev/pts の番号が変わってしまうから不便。
VitisのFLOWからC SIMULATIONのRunを押してsimulationを実行状態にし、制御用のPythonアプリケーションを立ち上げる。
アプリケーションからReset、プログラムロードおよび実行を指示して暫くすると、アプリケーション上にGame画面が描画される。アプリケーション上でキー入力を行うことによりPongを楽しむことが出来る。
実際の動画: プログラムロードが長く3:00あたりからゲームが始まる
アプリケーションの最下段にUART通信のやり取りが表示されている。ゲームが始まると右側に画面表示のための文字列が大量に送られてくる。
C Simulation環境は速いとは言え流石にギクシャクするが、かろうじてGameができる程度のリアルタイム性は出ている。単にC言語のプログラムが動いているだけと言えばそうなのだが、RTL simulationだとこのようには行かないだろう。
需要はないだろうけど一応ソースはこれです。
Discussion