Ollamaからdeepseekを使って,FPGA開発を行います.ローカルPCにインストールされたベンダの開発環境をエージェントから呼び出します.合成とシミュレーションを行うエージェントループを使って,エージェントにほぼ自律的に開発させます.

●環境構築
▲インストール
Ollamaローカルアプリのインストール(本稿ではローカルLLMは使わない.Ollama Proプランを使える状態にする)
VSCodeのインストール(拡張機能 Ollama,Copilot Agentを使える状態にする)
Quartus Prime Liteをインストール
Questaにライセンスを適用し使える状態にする

▲環境
OllamaのローカルアプリはPCを操作できない.そこで,Copilot Agentをユーザインターフェースとして利用する.Copilot Agentは,Ollamaローカルアプリとのやりとりに加え,ユーザ入力の受け取り,ローカルPC 内のファイル操作やコマンド実行ができる.
開発者から見ると,Copilot Agentを通してOllamaに指示し,Ollamaのバックエンドでクラウドのdeepseek(他のクラウドLLMやローカルLLMへの切り替えも簡単にできる)が利用される構成であり,シミュレーションまでのエージェントループができている.
●開発の流れ
▲AIエージェントによる開発ではエージェントループが必須
コーディングエージェント(CA)は,要求[A]に対して統計的に正しそうなモジュールを生成する.言ってみれば適当にそれらしいモジュール[B]を生成するが,それでも最終的に要求を満たす機能を実装できるのは,テストを繰り返すことでAとBとの差を解消できるからである.CAを使った開発では,BがどのようなものであるかをCA自身に把握させるために,エージェントループが重要になる.
Altera FPGAの開発では,QuartusとQuestaをPCにインストールしてあれば,エージェント(本稿ではCopilot Agent)によって自動でエージェントループが組まれるので特に考慮することはない(実機デバッグまで組み込む場合は別).しかし,いかにエージェントループが組まれていても,最初から大きな単位で要求すると,収束に時間がかかる.
▲機能単位で実装を進める
従って,小さな機能単位で要求し,それぞれの機能が確実に動くことを確かめながら開発を進めていくのがよさそうである.
本稿では,MAX10にLCDを接続し,1つのユーザキーだけで遊べる簡単なゲームを題材にする.次のような流れで各機能を実装していく.各段階でQuestaを使ったシミュレーションが走るので,1手ずつ確実に開発作業を進められる.
・ステップ1:LCDを1色で塗りつぶす(LCDの初期化)
・ステップ2:線の描画
・ステップ3:複数の線を描画
・ステップ4:基本的なゲームシーケンス実装
・ステップ5:ランダムに邪魔な点を配置
本稿の構成では,FPGAボード実機へのビットストリーム書き込みは手動で行う.
CAはローカルPC上でコマンド実行できるので,ProgrammerをCLIで操作して書き込みまで自動化することもできるはずである.しかし,本稿では実機動作からのフィードバックをエージェントループに組み込んでいない.JTAGやシグナルタップを使うことで,実機動作をエージェントループに組み込むことも可能だろうが,そこまで行わない場合は,人が実機を見て動作を確認し,その情報をエージェントにフィードバックするので,書き込みについても手動で行えばよいだろう.

●実装
・ステップ1:LCDの初期化

LCDの初期化処理を実装し,画面をオレンジ色で塗りつぶしてください
・ステップ2:
・ステップ3:
・ステップ4:
・ステップ5:邪魔な点をランダムな位置に描画

初期化処理の最後に,2×2 の大きさの点を20個ランダムな位置に描画してください
ランダムは簡単な疑似ランダム数列で実装してください.

●デバッグ
▲LEDデバッグ
うまく動かない場合,症状を伝えると仕様と突き合わせて,エージェントがデバッグ方法を提案してくれる.このとき,FPGAボード上にLEDがあれば,どこで躓いているかを調べるために,LEDを使ってくれる.人間はボードで実行させて,LED表示をエージェントに伝えればよい.例えば,LEDが4個ある場合,ワンホットだけでなく,16種類をエンコードするようなRTLコードもすぐ生成してくれる.
▲ロジアナ
FPGA開発では組み込みのロジアナを使えるが,エージェントによる開発では簡易ロジアナのRTLコードを独自実装する手法もとりやすい.開発対象のシステムがLCDを持つ場合など,オーバーレイでロジアナ波形を表示させれば,デバッグを進めやすい.波形見て人間が判断してもよいし,テキストで伝えやすい形状の波形表示にしておけば,エージェントにフィードバックするのもやりやすい.
本稿の例ではないが,右の写真では,組み込んだ簡易ロジアナで取得した情報を,LCDの右側に表示している.背景の細かいパネル群は開発中のゲーム画面.
デバッグ対象は,プレステのコントローラとの通信機能であり,SPIのようなものである.繰り返しポーリングする「8ビットパケット×5個」を見るため,9行×8桁のグリッドを表示させた(青マスが0,白マスが1).チェック対象が5バイトなのに9行を表示させたのは,ロジアナや波形表示機能そのものがバグっていないことを確認するために,指定パターン(10100101)などを表示させたからである.
このように表示させると,エージェントへテキストでフィードバックしやすい(Man in the loopにはなるが).
下方の白黒波形は,通信クロック(SCLK)とコントローラデータ(MISO)との同期具合をチェックするために表示させた.
