概要
- Voodoo 1 のFPGA実装における 設計・デバッグ手法 の解説
- 固定機能チップ の複雑さと レジスタ挙動の分類 について説明
- SpinalHDL によるレジスタ意味論のエンコード方法
- conetrace を用いた 波形スクロールに頼らないデバッグ
- 現代RTLツール の進化がもたらす設計効率化の実例
A Fixed-Function Chip That Is Harder Than It Looks
- Voodoo 1 は、三角形の高速描画専用の メモリマップ型アクセラレータ
- 変換・ライティング機能なし、3D計算はCPU側で実行
- 一つの三角形描画にも 補間色、テクスチャサンプリング、ミップ選択、フィルタリング、クリッピング、フォグ など多様な固定機能処理
- これらは プログラム可能でなく、全てシリコンに焼き込まれた動作
- 現代GPU は柔軟性に複雑さが宿るが、 Voodoo 1 は 固定機能の多様さ が複雑さの源泉
Why Register Writes Cannot All Behave the Same Way
- Voodooのレジスタインターフェースは 固定機能設計 を色濃く反映
triangleCmdやftriangleCmdレジスタ書き込みで 三角形描画開始- その他のレジスタで 描画方法やテスト条件などを指定
- 深いパイプライン構造 により、複数ピクセルが同時進行
- 状態変更のタイミング を誤ると、前の三角形に新しい設定が混入し、 描画破綻 を招く
- 対策は「 パイプライン空き待ち適用」または「 インフライトワークと一緒に状態を運ぶ」のいずれか
The Voodoo's Four Register Behaviors
- Voodooのレジスタは 4つのカテゴリ に分類
- FIFO :順番に適用
- FIFO + Stall :パイプライン空き待ち後に適用
- Direct :即時適用
- Float :変換後、固定小数点レジスタに書き込み
- この分類は アーキテクチャ上の契約 であり、単なるソフトウェア上の区別ではない
- 新しい状態が古い処理に混入しない保証 のため、明示的なモデル化が必要
Encoding Register Semantics in SpinalHDL
- Voodooは 430個の設定フィールド を多様なレジスタに分散
- 従来HDL (例:Verilog)では、レジスタ型の違いが設計全体に分散
- SpinalHDL の
RegIf抽象化で、レジスタ定義と制御ロジックを自然に記述可能 - 拡張により、 Voodoo独自のFIFO動作や同期書き込み、Floatエイリアス なども一括記述
- 例:
startRレジスタはアドレス、型、カテゴリ、初期値、Floatエイリアスを一箇所で宣言
- 例:
- Floatエイリアス :固定小数点レジスタの128アドレス上に浮動小数点書き込み用レジスタを提供
- レジスタメタデータ を活用し、 外部ヘッダやSystemRDL などにもエクスポート可能
- PciFifo コンポーネントでVoodooのレジスタセマンティクスをエミュレート
- FIFO書き込みはキューイング
- 同期書き込みはパイプライン空きまで待機
- Floatエイリアスは変換後に元アドレスへリライト
- 設計上の意味論が一元管理 されることで、 ドキュメントと実装の乖離低減
Querying Execution Instead of Scrolling Waveforms
- 設計記述だけでなく デバッグ も重要
- 半透明オーバーレイやテキスト描画のバグ で、特定ピクセルだけが消失する現象を観測
- フレームバッファハザード (メモリ順序問題)を疑い、様々な対策を実施するも解決せず
- conetrace による ネットリスト対応トレース で、問題ピクセルの各パイプライン段階を追跡
- ラスタライザ→TMU→カラーブレンド→フレームバッファ出力までピクセルの流れを解析
- 問題はフレームバッファ到達前から既に発生しており、 キャッシュ理論が否定
- 実際は以下の 小さな精度差の積み重ね によるもの
- W値の量子化タイミング早すぎ
- パースペクティブ補正やLOD計算の端数処理ずれ
- ブレンド時のdither減算処理の有無
- 各要素は単独では目立たないが、 特定条件下で積み重なり描画破綻
- ステージごとの動作一致 を優先し、各精度・演算方法を修正することで解決
- 従来の波形ビューア は信号観察に留まるが、 ネットリスト対応ツール は設計意図に即した根本原因解析が可能
What Modern RTL Tools Actually Changed
- 現代RTLツール (例:SpinalHDL、conetrace)は
- 設計意図の直接表現
- 制御論理の自動生成
- 実装とドキュメントの一元化
- 抽象度の高いデバッグ
- 個人でも高精度なハードウェア設計・デバッグが可能 になったことを実証