世界を動かす技術を、日本語で。

現代のRTLツールを用いたFPGA「3dfx Voodoo」の構築

概要

  • 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のレジスタインターフェースは 固定機能設計 を色濃く反映
  • triangleCmdftriangleCmdレジスタ書き込みで 三角形描画開始
  • その他のレジスタで 描画方法やテスト条件などを指定
  • 深いパイプライン構造 により、複数ピクセルが同時進行
  • 状態変更のタイミング を誤ると、前の三角形に新しい設定が混入し、 描画破綻 を招く
  • 対策は「 パイプライン空き待ち適用」または「 インフライトワークと一緒に状態を運ぶ」のいずれか

The Voodoo's Four Register Behaviors

  • Voodooのレジスタは 4つのカテゴリ に分類
    • FIFO :順番に適用
    • FIFO + Stall :パイプライン空き待ち後に適用
    • Direct :即時適用
    • Float :変換後、固定小数点レジスタに書き込み
  • この分類は アーキテクチャ上の契約 であり、単なるソフトウェア上の区別ではない
  • 新しい状態が古い処理に混入しない保証 のため、明示的なモデル化が必要

Encoding Register Semantics in SpinalHDL

  • Voodooは 430個の設定フィールド を多様なレジスタに分散
  • 従来HDL (例:Verilog)では、レジスタ型の違いが設計全体に分散
  • SpinalHDLRegIf抽象化で、レジスタ定義と制御ロジックを自然に記述可能
  • 拡張により、 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)は
    • 設計意図の直接表現
    • 制御論理の自動生成
    • 実装とドキュメントの一元化
    • 抽象度の高いデバッグ
  • 個人でも高精度なハードウェア設計・デバッグが可能 になったことを実証

Hackerたちの意見

初めてのビデオカード。1999年頃にLinuxで動かすのは本当に大変だった。特にLinuxの経験がないティーンエイジャーにはね。ネットワークカードも動かなかったから、友達の家までダイヤルアップのインターネットを借りに走ったり、Altavistaで助けを探したりしてた。すごくクールなプロジェクトだね。今でも自分には難しすぎるけど!

Voodoo 1を買うために、ティーンエイジャーの貯金を全部使っちゃった。Linuxサポートがあったからね。確か当時はRed Hatを使ってたから、インストールはRPMを2つ入れるだけだったかな?そのカードでQ3やUnrealをたくさんプレイしたよ。

自分も最初は*nixでドライバーを動かすのが大変だった。90年代中頃…いつも楽しい挑戦だった。モデムの問題もあって、マニュアルをめくって初期化文字列AT&FX1を見つけた。

同じく。tdfxって名前のカーネルモジュールかビデオドライバーを覚えてる。あと、DRI(Direct Rendering Infrastructure)をオンにしてX11を動かそうと奮闘してた。何日もかけてシステムの半分をコンパイルして、何が悪いのかを探りながら、glxinfoの出力でそれが有効になったのを見たときはすごく嬉しかった。特に、インターネットへのアクセスが限られてた時期だったから、ハードウェアアクセラレーションでGLtronを起動できたときは感動した。あの頃はQuake 3やAmerica's Armyもプレイしてたな。楽しい時代だったけど、今はLinuxがすごく簡単になっちゃって、あの自分で全部やらなきゃいけなかった時代がちょっと懐かしい。

3dfx Voodoo Bansheeは、僕が初めて買ったグラフィックカードだった。EverQuestのベータ版をプレイするために買ったんだけど、それが1999年頃だったと思う。初めてそのゲームにログインしたときは、人生が変わるような体験だった。実際、そうだったんだよね。理由はわからないけど、3dfxのスプラッシュスクリーンがすごく好きだったのを覚えてる。多分、そのカードでちゃんと動いた唯一のものだったからかな。でも、それでも僕は忠実な3dfxユーザーだった - 誰かがコメントで言ってたマーケティングのおかげかも - それが数年後に倒産したときは悲しかったな。

あの時代の名前やブランディングが大好き。今の技術はずっと進んでるけど、消費者にとってのワクワク感はあの頃には敵わないよね。

バーがかなり低かったと思う。あの頃、これに気づいているだけで、すでに熱心なファンだって暗黙の了解があったよね。

同意だけど、懐かしさが影響してるかも。最近、自分のVoodooカードがどのPowerMacに刺さってたのか調べてみたら、「PowerPC 8600」みたいなモデル名に懐かしさがこみ上げてきた。客観的にはすごくつまらない名前だけど、人生のある時期にはすごく意味があった気がする。

プロジェクト自体はクールだけど、LLMが生成したブログはちょっと頭が痛くなる。

+1

「現代的」な部分が何なのか全然わからない。例えば、「ネットリストを意識したトレース」…せいぜい80年代の最先端って感じだよね。

同じように感じることが多いけど、そこから抜け出そうと頑張ってるよ。文章を書くのはまあまあ得意だけど、教育背景や自然な適性のせいで、高度な数学はほとんどできないんだ。エンジニアとしてはそれが足かせになってるけど、ハードウェアやソフトウェアの仕事ではそこそこ成功してるんだよね。仲間には明らかなトリックを見逃しがちだけど、役立つアイデアが出せたときは、仲間や顧客とコミュニケーションが取れる。文章を書くのにLLMの助けは必要ないし、欲しくもないけど、最近のモデルが数学の問題を解決するのに助けになってるのは否定できない。明らかに定量的なエンジニアリングに強い人がいるけど、英語で結果を伝えるのが苦手な人もいるよね。両方のスキルセットは同じくらい重要だと思うから、英語で「チート」するためにAIを使ってるのを非難する権利はないよね。自分が数学の不足をカバーするために最先端のツールを使ってるのに、相手はその障害を隠せないから不公平だと思う。こういうことに対してもっと前向きな考え方を持ちたいし、他の人にもそうしてほしい。この記事は無意味なものじゃないし、そんな風に拒絶されるべきじゃない。そもそも、AIによる文章作成を非難することは、もうすぐできなくなると思う。今でも後でも、乗り越えなきゃいけないんだから。

LLMが生成したテキストに対するあなたの反応(そして自分の反応)に興味を持ってる。独特の匂いがあって、なぜそれが嫌だと感じるのか言葉にできないけど、なんとなくそう感じるんだよね。

これがAIだって確信してる?普通、AIが書いたものを読むと、何も言ってないのに長い段落が続くから、ぼーっとしちゃうんだよね。でも、ここにある文は短くて要点を押さえてる感じ。ChatGPTの前に投稿された彼らの過去の投稿も似たような感じだし。ただ、エムダッシュが多すぎて、今回はゼロだから、わざと削除されたみたい…笑 もう何が本物かわからなくなってきた。

Voodooカードは、その時代にしては見た目が良すぎた。誰かがゼロから作り直すなんて、まさにHNにぴったりのプロジェクトだね。

ありがとう!これらのものは、やることに対して信じられないくらいの機能を詰め込んでるよね。だから見た目も良いし、ハードウェアの再実装に30年もかかったのかも。

Voodoo3 2000をフレームに入れようと思ってるんだけど、まだいい方法が見つからないんだ。

でも、Voodooの前のNvidia NV-1の方がずっと印象的だったよ。NURBSを使えば、完璧に丸いオブジェクトを表示できたし、前方テクスチャマッピングもあってキャッシュの利用効率が大幅に改善されてた。今でも役立つ技術だと思う。ただ、プログラミングがすごく難しかったけどね。結局、三角形はベジェ曲線よりも理解しやすいから。マイクロソフトがDirectXは三角形しかサポートしないって宣言した瞬間、NV-1はすぐに終わっちゃった。

Tribes 1はGlideのおかげでめっちゃ良かった…

Voodooカードは、当時としては見た目が良すぎる権利なんてなかった。マーケティングもね。

著者が入力レジスタに余計な意味を追加しているのが奇妙だと思う。FIFOsや「ドレイン + FIFOs」、「浮動小数点から固定小数点への変換レジスタ」などを、メモリマップドレジスタとは別のコンポーネントとして扱わずに。彼らが直面していた中央の問題は、外部コントローラーが計算ユニットの真ん中で非同期に状態を変えてしまうことだった。将来のためにこのコントレースをメモしておくけど、役に立ちそうなツールだし、彼らは一種のクローズドベータをやっているみたいだね。

もしかしたら勘違いしてるかもしれないけど、その機能は別のコンポーネントに実装されてるよ。レジスタバンクは各レジスタのカテゴリを記録するだけで、メモリマップドレジスタの機能を実装してるんだ。このレジスタとそのカテゴリのリストは、書き込みが入るのとレジスタバンクの間にある別のコンポーネントにインポートされるんだよ。これの利点は、レジスタの特性を説明するものが一つのファイルにまとめられてること。レジスタの動作を知るために、三つの異なる場所を探す必要がないんだ。

実際のGPUよりも、ボックスアートが恋しいな。 https://lockbooks.net/pages/overclocked-launch

古いVoodooカードの思い出がすごく懐かしい。あの写真がどれだけノスタルジーを呼び起こしたか驚いてるよ。そのレンダリングは本当に独特な見た目で、(LLM生成の?)FPGAがそれをうまく捉えてたと思う。確か、当時としては巨大なビーストで、ケースにほとんど収まらなかったんだ。でも、ppc32/macos9のドライバサポートは素晴らしかったし(その頃にはもう終わりかけてたけど)、実際にマシンを長く動かしてくれた。で、買った1ヶ月後にNVidiaが3dfxを買収して、すぐにドライバのサポートをやめちゃったから、マシンをアップグレードしたときにはすごく性能のいいペーパーウェイトになっちゃった。ありがとう、ジェンセン。

それに関連して、Screamer 2のスクリーンショットには完全に驚かされた。あのゲーム大好きだったし、友達の中でプレイしたのは自分だけだった気がする。素晴らしい操作感と最高の音楽だった。

大好きだったけど、その時代の中ではFatal Racingが一番好きだった。

これに関連する記事が面白いかも: https://news.ycombinator.com/item?id=32960140

Xilinxのツールに苦労してたのは久しぶりだけど、今の時代にハードウェアの制限がないとは思えないな。これってSpartan 6で動くの?それとも最新のUltraScaleが必要なの?それとも、どうせシミュレーションでしか動かないのかな?

FPGAのシミュレーションって、メタスタビリティの問題を推測するための単純な試みだよね。一定のシミュレーション時間の後に「定常状態」のレイテンシを見つけることで。クロックドメインのクロッシングの緩和は限界があって、状態の伝播問題は大きくて速いチップになるほど悪化することが多いんだ。ちなみに、オーバーサイズの趣味用Voodooカードは、元のASIC数とメモリ制限を最大限に引き上げてるよ。古いゲームのためにハードウェアをうまくシミュレートするエミュレーター、86boxみたいなのもあるし。

「それとも、どうせシミュレーションでしか動かないのかな?」 もし彼らがLLMユーザーなら、100%エイプリルフールのジョークだね。=3

DE-10 Nanoでこれがフィットして動くのは、そんなに難しくないよ。ファブリックの約70%を使ってる。タイミングクロージャーに取り組んでて、やっと50MHzに到達したところ。元のVoodooにはないキャッシュコンポーネントも実装したから、使えるメモリの柔軟性が増してるんだ。だから、これを取り除けば、ファブリックの50%くらいに小さくできるかも。