このケーススタディではプロンプトによる要求追加が,どの処理と生成物につながったかを追いながら,CodexをFPGAロジック設計の共同開発者として使える範囲を検証する.具体的にはRTL開発から検証,CoreMark実行,GOWIN FPGA用のビットストリーム生成まで行う.

対象:RV32I 2.1 / GOWIN GW5A-25 / Windows 11 + Ubuntu 24.04 WSL

要約

 今回のプロジェクトではCodexへの対話的な依頼を起点に,FPGA向けRISC-Vプロセッサの開発を次の通り進めた.

  • 仕様整理
  • RTLコード生成
  • テストベンチ作成
  • 専用WSL環境構築
  • 回帰自動化
  • CoreMark評価
  • GOWIN EDAによる実装

 最終成果は,RV32I 2.1基本命令40命令を実装したノン・パイプライン版と5段パイプライン版の2コアである.IMEMとDMEMは各8192ワード×32-bitの同期式とし,各実装で32個のBSRAMへ推論された.2026年8月4日の再検証では,18テストがIcarus VerilogとVerilatorの双方でPASSした.

 性能面では,CoreMark 10反復で5段版が12,240,032サイクル,ノン・パイプライン版が15,522,696サイクルとなった.5段版は約1.27倍少ないサイクルで処理した.GOWIN GW5A-25への配置配線後Fmaxは,それぞれ70.013 MHzと52.327 MHzだった.

結論

 CodexはRTLコードを生成するだけでなく,開発環境,検証フロー,ベンチマーク,ベンダEDAの実行スクリプト,レポート整理,説明資料までをつなぐ役割を担える.一方,ボード固有のピン制約,実機デバッグ,電気的条件,最終仕様判断は人が責任を持つ必要がある.

1. はじめに:CodexでFPGA開発はどこまでできるのか

 このプロジェクトの出発点は,基本的なRISC-Vプロセッサを作ることだった.しかし,本当の検証テーマはそれだけではない.Codexに対して段階的に要求を追加したとき,RTLコードだけでなく,ツール導入,検証,性能評価,FPGA実装まで一貫して進められるかを確認することが目的だった.

最初の問い 

 GOWIN FPGAを最終ターゲットとして,基本的なRISC-VのRTLコードを開発し,オープンソースの論理シミュレータで実装と同時に検証できるか.

 FPGA開発は,正しいVerilogコードを書くだけでは完結しない.対象ISAとマイクロアーキテクチャを定義し,テストプログラムとテストベンチを用意し,シミュレータ差を確認し,メモリ推論やタイミング制約を考慮して,ベンダEDAによる合成まで到達する必要がある.今回の評価では,この周辺工程も含めてCodexによる開発の対象とした.

評価した開発範囲

  • Windows上での専用WSL Ubuntu環境とオープンソースツールの導入
  • ノン・パイプライン版と5段パイプライン版のRTL開発
  • RV32I 2.1基本命令40命令と同期BSRAMインターフェース
  • Icarus VerilogとVerilatorによる回帰、Yosysによる合成サニティチェック
  • CoreMarkのベアメタル移植とサイクルベース比較
  • GOWIN EDAでの合成,配置配線,STA(静的タイミング解析),ビットストリーム生成
  • README,カバレッジ,実装レポート,PowerPoint資料の生成

2. プロンプトがプロジェクトをどう変えたか

 今回の対話では,初めから完全な仕様を一度に与えたわけではない.動く最小構成を起点に,環境,検証,ISA(Instruction Set Architecture),パイプライン,メモリ,FPGA実装へと要求を積み上げた.修正依頼は単なる文章の追加ではなく,設計構造と検証対象を変える入力として働いた.

重要なポイント

 プロンプトの価値はコード生成量ではなく,受け入れ条件を明確にできる点にある.「両シミュレータで全テストPASS」,「BSRAMへ推論」,「STAまで完了」のような終了条件が,Codexの作業ループを決めた.

3. 得られた生成物と再現可能な開発環境

 最終的なプロジェクトは,OneDriveのdevelopフォルダだけで実行できる形に整理された.Windows側はPowerShellを入口とし,Linux向けツールは専用のUbuntu-24.04 WSLで動作する.GOWIN EDAだけはWindowsネイティブで実行し,同じプロジェクトツリーのRTLと制約を使用する.

powershell -ExecutionPolicy Bypass -File .\scripts\run_regression_wsl.ps1
powershell -ExecutionPolicy Bypass -File .\scripts\run_coremark_wsl.ps1 -Iterations 10
powershell -ExecutionPolicy Bypass -File .\scripts\run_gowin.ps1 -Core all

主要な生成物

2種類のRV32Iコアと同期メモリ

同じRV32I仕様とメモリーを共有する2種類のマイクロアーキテクチャ

 ノン・パイプライン版は,同期メモリに合わせたマルチサイクル構成である.通常命令は命令取得と実行の2サイクル,Loadはデータ読み出しを含む3サイクルとなる.構造が追いやすく,デバッグと比較基準に向く.

5段版はIF,ID,EX,MEM,WBで命令をオーバラップして処理する.EX/MEMおよびMEM/WBからのフォワーディング,Load-useハザード時のストール,分岐・ジャンプ・trap時の若い命令の破棄を実装した.

RV32I命令とtrap

 両コアはRV32I 2.1の基本命令40命令を実装する.上位即値,ジャンプ,6種類の分岐,byte/halfword/wordのLoad/Store,即値ALU,レジスタALU,FENCE,ECALL,EBREAKを対象とした.ECALLはcause 8,EBREAKはcause 3を出力し,trap_pcと合わせて精密例外を確認できる.

スコープ外

 M,Zicsr,Zifencei,特権割り込みは別拡張として未実装である.RV32I基本命令40命令の完全対応と,RISC-V全拡張対応は同じ意味ではない.

同期BSRAMインターフェース

 IMEMは8192ワード×32-bitの同期Read ROM,DMEMは同容量の同期Read RAMである.DMEMは4-bitのwrite strobeを持ち,SB,SH,SWを同じ32-bit配列に実装する.Write中はrdataを更新しないno-change動作とした.

rtl/rv32i_sync_dmem.vの要点

always @(posedge clk) begin
    if (en) begin
        if (|wstrb) begin
            if (wstrb[0]) mem[addr][7:0] <= wdata[7:0];
            if (wstrb[1]) mem[addr][15:8] <= wdata[15:8];
            if (wstrb[2]) mem[addr][23:16] <= wdata[23:16];
            if (wstrb[3]) mem[addr][31:24] <= wdata[31:24];
        end else begin
            rdata <= mem[addr];
        end
    end
end

5. 自動検証とRTL修正ループ

 検証は,機能を追加するたびに小さなテストを増やし,Icarus VerilogとVerilatorの両方で同じtests.listを実行する方式とした.テストベンチはレジスタやメモリの最終signature,trap cause,trap PC,パイプラインのsquash結果を確認する.

scripts/run_regression.shの流れ

while IFS= read -r top; do
    iverilog -g2012 -o "sim/build/regression/${top}.vvp" \
        -s "${top}" -c sim/filelist.f
    vvp "sim/build/regression/${top}.vvp"
done < sim/tests.list

bash ./scripts/run_verilator.sh

2026年8月4日の再検証

 18/18テストがIcarus VerilogでPASSし,同じ18/18テストがVerilatorでもPASSした.機能エラーは0件だった.

 シミュレーション時には,短いhexファイルを256ワードのテスト用IMEMへ読み込むため,readmemhから「Not enough words」という警告が出る.未使用領域は事前にNOPで埋めており,これはテスト失敗ではない.記事ではPASS/FAILと警告を区別する.

6. CoreMarkによる性能比較

同一CoreMarkイメージを10反復したサイクル比較

 5段版は同じ処理を約1.27倍少ないサイクルで完了した.さらに配置配線後Fmaxも高いため,STA周波数換算の推定スループット差は大きくなる.

測定上の注意

 この値は開発用のサイクル比較であり、EEMBCへの公式CoreMark提出値ではない。現在のベアメタルportは実タイマ周辺回路を持たず、内部benchmark timerを有効な測定窓へ固定している。

7. GOWIN EDAによるFPGA実装

 両コアをGOWIN EDA V1.9.12.02_SP1でGW5A-LV25UG324C2/I1へ実装した.Tclから合成,配置配線,静的タイミング解析,ビットストリーム生成を連続実行し,生成されたHTML/TXTレポートと.fsファイルをプロジェクトに保存した.

GW5A-25配置配線後のActual Fmax

リソース使用量

 IMEMに16個,DMEMに16個のBSRAMを使用し,要求した32 KiB + 32 KiBがFFやLUTではなく合計32個のBSRAMへ実装された.5段版は70 MHzでsetup余裕が0.003 nsしかないため,初回の実ボード動作は65 MHzを推奨する.

ボード実装前の制約

 現在は評価用トップの132 I/Oを自動配置している.特定ボードへ書き込む前に,クロック,リセット,I/O電圧,UART/JTAGなどのCSTを作り,再度P&RとSTAを行う必要がある.

8. Codexが処理した内容

 このケースでCodexが扱った作業は,RTLコードの文章生成に限られない.既存ファイルの調査,ツール実行,ログ解析,修正,再検証,結果の文書化を連続したタスクとして処理した.

処理ループ

  • コードベースと既存の変更を確認する
  • 要求を満たす最小のRTLコード,テスト,スクリプト変更を行う
  • 実際のシミュレータ,コンパイラ,EDAを実行する
  • ログのエラーと警告を分類し,原因を修正する
  • 同じテストを再実行し,機能と回帰を確認する
  • 数値と生成物の場所をドキュメントへ反映する

9. Codexでできたこと,できなかったこと

 Codexは仕様が検証可能な形で与えられ,ツールをコマンドで実行でき,成功条件をログやレポートで確認できる作業に強い.一方,実機の物理状態,曖昧な製品要求,失敗コストが高い最終判断は,人のレビューと責任範囲を明確にする必要がある.

実務での使い方

 Codexに『RTLを書いて』だけでなく,『どのテストを何個通すか』,『どのEDA段階まで実行するか』,『どの数値をレポートするか』を伝えると,成果物の質と再現性が高くなる.

10. まとめと次の開発

 この例では,自然言語の要求を起点に,2種類のRV32Iコア,64 KiBの同期BSRAM,両シミュレータ18/18 PASS,CoreMark比較,GW5A-25のbitstreamまで到達した.重要なのは,Codexが個別ファイルを生成したことより,要求・実装・検証・実装レポートを一つの再現可能な流れとして接続したことである.

 次の段階では,実ボード用CSTとクロック回路,UARTまたはJTAGの観測手段,Zicsrと割り込み,M拡張,riscv-formalまたはcompliance test,CI,実機CoreMarkと消費電力測定を追加する.これらも同じ『要求→テスト→実行→レポート』のループへ組み込める.

最終メッセージ

 CodexはFPGA設計者を置き換えるものではないが、設計者が仕様と受け入れ条件を示せば、RTLから検証・実装・説明資料までを前へ進める共同開発者として使える。

付録A. 最終プロンプト一覧

 修正や追加依頼は最終要件へ統合した.以下は,このプロジェクトを再現・説明する際に使える形へ整理したプロンプトである.

1. RISC-V RTL開発

 GOWIN FPGAへの実装を前提として,基本的なRISC-VプロセッサのRTLコードを作り,オープンソースのシミュレータで開発と検証を並行する.

2. Windows・WSL環境

 既存ディストリビューションを使わず,RISC-V開発専用のUbuntu WSLを構築し,必要なツールを導入する.

3. 簡易実行環境

 PowerShellからWSL上のシミュレーション,回帰,CoreMark,合成を実行できるスクリプトを用意する.

4. フォルダー統一

 生成物をOneDrive\develop配下へ移動し,パス依存を修正してそのフォルダだけで動作させる.

5. 検証・修正ループ

 テストで問題が出た場合はRTLコードを修正し,合格するまで再検証する.

6. 回帰テスト

 Verilatorベースの回帰と,命令追加ごとの自動テストを整備する.

7. 2種類のコア

 ノン・パイプライン版に加えて5段パイプライン版を作り,ハザード処理を実装する.

8. RV32I完全対応

 RV32I 2.1基本命令40命令を両コアで実装・検証する.

9. CoreMark

 2コアでCoreMarkを実行し,サイクル数とCoreMark/MHzを比較する.

10. 同期BSRAM

 IMEM 8192×32-bit,DMEM 8192×32-bitを同期式BSRAMとして実装する.

11. GOWIN実装

 GW5A-25で合成,配置配線,STA,ビットストリーム生成を行い,周波数とリソースを提示する.

12. プレゼン

 開発したRTLコードと環境を説明する日本語・英語PPTXをGOWINブルー基調で作成する.

13. 目的の明文化

 CodexでどのようなFPGA開発ができるかを確認することも目的として資料に追加する.

付録B. 主要生成物と実行コマンド

出典・検証根拠

 本記事の数値と結論は,プロジェクト内のRTL・スクリプト・EDAレポートと,記事作成時に再実行した回帰およびCoreMarkの結果に基づく.

  • プロジェクトREADME.md(最終仕様,実行方法,CoreMarkとGOWIN概要)
  • docs/rv32i_coverage.md(RV32I基本命令40命令のcoverage)
  • docs/gowin_implementation.md(2026年7月16日のGOWIN実装結果)
  • sim/tests.listおよび2026年8月4日のrun_regression_wsl.ps1再実行結果
  • 2026年8月4日のrun_coremark_wsl.ps1 -Iterations 10再実行結果
  • rtl/,tb/,scripts/,fpga/gowin/配下の生成物

コメントを残す