任天堂の 従来の携帯機と同様に、 CPU NTR という名前の大きなチップを中心にシステムが構築されています。 'NTR' は、初代ニンテンドーDSのコードネームであるNitro(ニトロ)の略です。 このSoCは、ゲームボーイアドバンスから始まった ニンテンドー & ARMパートナーシップの後継作でもあります。
さて、新しいCPUを説明する前に、ニンテンドーDSの要素技術に影響を与えた、90年代後半におけるARMの進化を見てみましょう。
ARMの新境地
90年代半ば、ARMはモバイル市場 (携帯電話が「スマート」になる前) でのビジネスを急拡大していました。 しかし、ハイパフォーマンスコンピューティング の領域ではあまり上手くいかなかったようです。 ARM7は多くのモバイル機器で採用されていましたが、性能面ではApple (の個人用端末『Newton』) とAcorn (のRiscPC) が搭載する高速なCPUとソフトウェアには及びませんでした。 これは40Mhz以上の速度で動作するCPUを生産できないこと(MIPSは既に商用化していた) に加えて、64ビットに対応していないことも問題でした。 ビジネス全体にボトルネックが積み重なり始めていました。

DECの「デジタル パーソナル ワークステーション」モデル 433au(1997年)、Alpha 21164A CPUを搭載。
それでも、ARM7ラインの商業化の間に、ARMは高性能市場への最初の試みとしてARM8という後継機の開発をすでに開始していました。 偶然にも、Digital Equipment Corporation (DEC)は、PDPやVAXシリーズ(いわゆる『ミニコンピュータ』)および高度なVMSオペレーティングシステムで歴史的に有名なアメリカの企業ですが、彼らは逆の問題を抱えていました。それは、高性能なソリューションに基づいた低消費電力のCPUを提供することに苦労しているということです。
そこで、DECはARMのライセンスモデルに目を付け、ARMから資料(命令セットとマイクロアーキテクチャ) を借りて新しいCPUを開発することにしました。
最終的に、DECはRISCベースのAlphaプロセッサのデータパス設計を採用し、ARMの助けを借りて、ARMのマイクロアーキテクチャと組み合わせました 。 このコラボレーションは、1996年にリリースされたパフォーマンスを重視したStrongARMCPUにつながりました。

Acorn RiscPCのアップグレード版CPUの一部である233MHzのStrongARM CPU
StrongARMはARMベースの新しいCPUで、 を搭載します:
- ARMv4 命令セット: これについて詳しく知りたい場合は、以前にゲームボーイアドバンスの記事で紹介しています。
- 最大233 MHzのクロックで、これは最も強力なARM7チップよりも約583%速い。
- 5段パイプライン、オリジナルの 3段構成から増加。
- 命令用に16 KB、データ用に16 KBが割り当てられた新しいキャッシュシステムを持つハーバードアーキテクチャ。
- この設計はフォン・ノイマン・ボトルネックを軽減するのに役に立つ(フォン・ノイマン/プリンストンモデルが苦しんでいた問題です) 。
このチップは、以前のARMチップと同様に 3.3 Vの電源で動作できます。 実際、StrongARMは2ボルトを必要とし、消費電力はわずか1ワットです 。 対照的に、インテルの200 MHzペンティアムチップは3.5Vを引き、消費電力は最大で15.5Wです 。
予想通り、Acorn と Apple はこの新しいチップに感銘を受け、すぐに各端末のCPUアップグレード版と、さらなるNewtonモデルを出荷しました。 もちろん、DECの発明を利用して。
同じ年に、ARMは約束していたARM8ベースのCPUであるARM810をリリースしました。 それは比較的遅く、StrongARMに対して実用的な利点を提供しませんでした。 なので、このCPUが顧客の関心を惹くことはありませんでした。 この結果をうけて、ARMはモバイル市場向けのARM7ラインの改良に移行しました。 しかし、DECのCPUの可能性は非常に革新的であったため、ARM HoldingsはStrongARMの設計を吸収し 、次のCPUラインであるARM9を製造しました(これをニンテンドーDSが搭載しています)。
転換点
StrongARMのおかげで、ARMはハンドヘルド市場での地位を固め、MIPSやSuperHを完全に置き換える有力な代替手段となりました。 それ以来、ARMはモバイルデバイス向けで最も採用されるアーキテクチャへの道を歩んでいました 。
DECにとって残念なことに、このCPUは1998年にCompaq社に買収されるまでの最後の成果となりました。 StrongARMの運命はインテルに委ねられ、その後インテルは新しい「Intel XScale」ラインの下で開発を継続しましたが、インテルは時折「低電力」x86 CPU(つまりIntel Atom)に集中するために部門を清算しました 。 15年後、インテルはモバイル市場でのチャンスを失っただけでなく、今やデスクトップ市場でARMと激しく競り合うことになりました。
ニンテンドー製SoCのデビュー
前述の進歩に加えて、CPU NTRはARM7TDMIとARM946E-Sの2つの異なるARM CPUを使用した興味深いマルチプロセッサアーキテクチャをバンドルしています。 このデザインはARM ホールディングスが正式に マルチプロセッサソリューションをリリースする前に設計されました。 そのため、この二つのCPUの機能は少し風変わりと言えるかもしれない(現在の技術と比べると) 。
このシステムは本シリーズで分析する最初の並列システムではありませんが、その設計は他のものとは大きく異なります。 例えば、 セガサターン が実装した"実験的"なマスタースレーブの仕組みや、 PS1 または N64 での"コプロセッサー"のアプローチとは異なります。 ニンテンドーDSには、専用のバスを持つ2台の独立したコンピュータが使われています。 この設計方法は 非対称マルチプロセシング と呼ばれ、結果としてこの CPU の依存関係は、このシステムの全体的な性能を左右します。
それでは2つのCPUを見てみましょう。
ARM7TDMI
より身近なものから説明しましょう。ARM7TDMIはゲームボーイアドバンスで採用されているCPUですが、ニンテンドーDSでは34MHz以上(オリジナルの2倍) で動作します。 このプロセッサはオリジナルの特徴(特にThumb 命令セット) をすべて備えます。
この変更は、任天堂の技術者がI/Oポートの脇にI/Oの調停を担うためのARM7を設置したことに由来します。 実際、他のプロセッサはI/Oに直接接続されていません。 ご覧のとおり、これはシステムを担当する"メイン"プロセッサではなく、多くのコンポーネントにデータを渡すことによってメインの CPU をオフロードする"サブプロセッサ"です
ARM946E-S
これがニンテンドーDSの'メイン'CPU、ARM946E-Sです。 "StrongARM"ほどの速度ではありませんが、~ 67MHzで動作します。 ARM9シリーズの一部であるこのコアは、ARM7TDMI と StrongARM の全ての特徴を継承しつつ、以下のような興味深い変更が施されています。
- ARMv5TE ISA は、 以前のARMv4 ISAとThumbの拡張版であり、より多くの命令とより高速な乗算器を備えています。
- コア名の「E」は拡張DSPを意味し、新しい命令の多くが信号処理のアプリケーションに関係していることを示唆している。
- 拡張されたThumbは、 Thumb v2 と呼ばれることもあります。 この拡張で追加される
BLXとBKPT命令によってARMとThumbモードの切り替えが支援され、それぞれのデバッグを容易にします。
- 5段パイプライン: StrongARM や ARM8 と同じ。
- 12KBのL1キャッシュ:このキャッシュ(ARM7TDMIにはなかった) が特徴的で、ハーバード方式を採用するStrongARMと同様に、命令用に8KB、データ用に4KBが割り当てられています。
- キャッシュにはライトバッファを採用し、RAMの更新を非同期で行うため、CPUはRAMとの同期を待たずに他のタスクを処理できます。
- 48 KB の密結合メモリ (TCM) : Scratchpad memory と似ています。 ただし、ここでは命令(32 KB) とデータ(16 KB) を区別して扱います。
- 統合された CP15 コプロセッサ: メモリ保護ユニット (MPU)として機能し、どのメモリ範囲にアクセス、キャッシュ、および書き込みが可能かを規定します。
また、任天堂は以下のコンポーネントを追加しました。
- 除算器と平方根ユニット は、除算・平方根の演算を高速化します(ARM9自体はこれらの演算を行うことはできません)。
- DMA: CPUに依存しないメモリ転送を高速化します。 キャッシュと組み合わせて使用する場合には、CPUと DMAの両方が同時に動作する可能性があります。
- キャッシュとDMAはパフォーマンスの向上に大きく寄与しますが、データの整合性と一貫性の問題も生じます。 そのため、プログラマーはDMAを起動する前にライトバッファをフラッシュすることで手動でメモリの一貫性を維持する等の対策を行う必要があります。
このようなハードウェアですから、子供たちがこのコンソールをとても気に入るのも分かりますよね?
インターコネクション
ここまでで、2つのCPUが個別にどのように動作するかについてお話しました。 しかし、全体の動作には二つのCPUが常に協調して動作する必要があります。 そのために両方のCPUは、専用の FIFOユニット を使用して互いに直接"会話"します。このデータブロックは、双方向通信のために、2 つの 64 バイト キュー (16 エレメントまで) を保持します。
これは以下のように動作します: 送信側のCPU (効果的に他のメッセージを送信する必要があります) は 32 ビットのデータブロックをキューに入れ、受信側のCPUは、そのブロックをキューから引き出して必要な操作を行います。
キューに置かれている値は、いつでもCPU が手動で取得することができます (ポーリング) 。 この際には常に新しい値をチェックする必要があります(この動作はコストが高い)。 または、 割込みユニット を有効にして、キューに新しい値がある場合に受信側に通知することもできます。
メインメモリ
以前のRAMと同様に、さまざまな場所にRAMが配置されているため、アクセス速度別にメモリにアクセスすることができます。 まとめると、以下の汎用メモリが使用されています。
- 32 KB の WRAM (ワーク RAM) 32 ビット バス: ARM7とARM9で共有される高速データを保持します。
- 同じアドレスに一度にアクセスできるCPUは1つだけです。
- 64 KBのWRAM 高速アクセス用の32 bitバス: GBA等のARM7からのみアクセスできます。
- 4 MBのPSRAM 低速の16 bit bus: CPUとメモリーインターフェースユニットによって制御される。
- 疑似的なSRAM「PSRAM」は、チップ内からリフレッシュを行うDRAMです。 したがって、SRAM(より速いが、より高価なDRAMの代替品) のように振舞います。 このデザインは1T-SRAM を思い出させます。
後方互換性
アーキテクチャはゲームボーイアドバンスとは大きく異なりますが、ネイティブ互換性を持っています。
DSがGBAとして振舞うために、 AGB互換モード でコンソールを設定するソフトウェアルーチンのセットが含まれています。 これによりARM9は停止し、ほとんどの'固有'ハードウェアを無効にし、16.78MHzに低下したスピードでARM7にリダイレクトされます。 最後に、ARM7は(オリジナルのゲームボーイアドバンスのように) GamePakカートリッジをブートストラップするオリジナルのAGBBIOSを起動します。 このモードには、元のコンソールにはない特徴もあります。 例えば、オリジナルの方が画面解像度が大きいため、ゲームを黒い余白付きで表示します。(解像度の話は次のセクションで説明します)。 また、GBAのゲームをDSの二つの画面の内のどちらに表示するかをユーザが設定できます。
一度GBAモードになったら元のモードに戻ることはありません。ハードウェア全体を再起動するには、コンソールをリセットする必要があります。
未知の力
非常に多くの洗練されたコンポーネントが、単一の安価なチップに取り付けられていますが、この複雑さが問題を引き起こす可能性があります。
ARM9の説明から始めましょう。このCPUはARM7の2倍の速度で動作しますが、ほとんど(全てではない) のI/OはARM7に依存しています。 そのため、ARM9はARM7からの応答を待つ間はずっと停止していなければなりません。 さらに、ARM9の外部バスは、その半分の速度で動作するため、これらが大きなボトルネックになります。
また、メインメモリバスは 16ビット幅です。 したがって、CPUが1ワード(32ビット幅) をメモリからフェッチする必要がある場合、 インターフェイスは、1ワードが揃うまで最大3サイクル"待機"することでCPUを停止します。 最悪の場合、つまりメモリアクセスがシーケンシャルではない場合には、1回のアクセスごとに待機が発生することになってしまいます。 この問題は、命令がフェッチされたときにも発生します(残念ながら、ARM はシーケンシャルなオペコードのフェッチをサポートしていません)。しかも、Thumbコードにも影響します(16ビットのフェッチはすべて32ビットブロックのフェッチとして行われるため) 。 一方、いくつかのソースがそれを呼び出すことでキャッシュとTCMを最大限に活用することによって、この「ペナルティ」を軽減することができます。
要するに、最悪の場合にはARM9の動作クロック66MHzが実質的にわずか8MHzに制限されます。 つまり、プログラムがキャッシュとTCMを全く有効に動かさない場合です。
詳細については、Martin Korthのドキュメント、具体的には'DS Memory Timings'セクションをチェックすることをお勧めします。




