マイクロプログラム方式とは
マイクロプログラム方式(マイクロプログラミング)とは、プロセッサの
制御装置を実装する一つの手法であり、
CPU内部のマイクロプログラム(
マイクロコード)を用いて、複雑な命令を比較的容易に実現する技術です。この方式は、命令セットアーキテクチャ(ISA)の追加や拡張を容易にし、プロセッサ間の互換性を高めるだけでなく、異なる命令セットを持つ
CPUのエミュレーションにも応用可能です。しかし、複雑な命令が増えると、パイプライン処理の効果が薄れるという側面も持ち合わせています。
マイクロコードは一般的に、ROM(Read Only Memory)、PLA(
プログラマブル・ロジック・アレイ)、またはそれらを組み合わせたものに格納されます。コントロールストアをRAMで構成することで、動的なプログラミングが可能になりますが、起動時に読み込みが必要となります。一方、ROMを使用すると読み込みは不要ですが、動的なプログラム変更はできなくなります。
マイクロプログラム方式は、主にCISC(Complex Instruction Set Computer)の
CPUで採用されています。これに対し、論理ゲートとフリップフロップを配線で直接実装する方式はワイヤードロジック(布線論理)と呼ばれ、
RISC(Reduced Instruction Set Computer)は原則としてワイヤードロジックで構築されます。「マイクロ」という用語は、英語の「小さい」という意味で使われており、
マイクロプロセッサや
マイクロコンピュータなど、他の「マイクロ」と付くものとは直接的な関連性はありません。
マイクロコードによるプログラムはマイクロプログラムと呼ばれ、あるコンピュータアーキテクチャ上で、より複雑なアーキテクチャをエミュレートする、特殊なコンピュータプログラムです。マイクロプログラムは、一般的なプログラムに比べて非常に小さく、実行速度を最大化するために最適化されています。マイクロプログラムは、
CPUを最も基本的なレベルで制御するマイクロ命令の列から構成されます。
マイクロ命令の例
例えば、以下のような処理をマイクロ命令で記述できます。
レジスタ1をALUの入力Aに接続する。
レジスタ7をALUの入力Bに接続する。
ALUに2つの入力の足し算を実行するように設定する。
ALUのキャリー入力にゼロを設定する。
結果をレジスタ8に格納する。
フラグレジスタをALUのステータスフラグに従って設定する。
マイクロプログラムカウンタに従って次のマイクロ命令へジャンプする。
これらの処理は並列して行われることが多いため、マイクロ命令は非常に大きなビット幅を持つことがあります(例:56ビット以上)。
マイクロコードは、CPUの各マイクロ命令を状態とした状態遷移表をメモリで表したと捉えることができます。マイクロコードは、ROMに格納されることもあれば、CPUの初期化の一部としてRAMにロードされることもあります。広義には、CPU以外を含むファームウェア全体をマイクロコードと呼ぶこともあります。コンピュータの起動時にマイクロコードをロードする過程はIML(イニシャル・マイクロコード・ローダー)と呼ばれ、マイクロコードが格納されるメモリはコントロールストアと呼ばれます。
マイクロプログラム方式の歴史
初期のコンピュータのCPU制御回路は、行き当たりばったりな設計でした。最も単純なものでは、フリップフロップのリングを使って制御ロジックの順序を制御していました。1947年、Whirlwindの開発で、コントロールストアを使用して設計を単純化するという概念が導入されました。このコントロールストアは、ダイオードの2次元格子回路で、CPUクロックから生成されたタイミングパルスによって制御されていました。
1951年、モーリス・ウィルクスは、マイクロプログラムに「条件付き実行」の概念を導入しました。これは、コンピュータプログラムにおけるif文に相当するもので、従来の単純なコントロールストアを「マイクロプログラム方式」と名付けました。1958年には、IBM 709がマイクロコードによる商用初の別アーキテクチャのエミュレータを提供し、1964年にはIBM System/360が、マイクロコードによる互換性確保により、コンピュータのファミリー化を実現しました。
初期のマイクロプロセッサでは、命令デコード部の回路設計を単純化するためにPLAやROMが使われていましたが、命令セットはそれほど複雑ではありませんでした。
マイクロプログラム方式の利点
マイクロプログラム方式では、ハードウェアの実装がプログラマから見えるものとは異なり、よりシンプルです。このマイクロアーキテクチャ上で、プログラマに見せるアーキテクチャをエミュレートするマイクロプログラムが実行されます。これにより、様々なマイクロアーキテクチャのハードウェア上で、任意のアーキテクチャを実装できます。例えば、IBM System/360は、異なるハードウェアで同じ命令セットを実現し、システムソフトウェアの共通化を可能にしました。
マイクロプログラミングは、プロセッサのバグ修正も容易にします。多くのバグはマイクロプログラムの修正で対応でき、ハードウェアの変更を必要としません。
マイクロプログラム方式の性能
マイクロプログラム方式は、原理的に1命令の実行に多くのクロック数を必要とするため、ワイヤードロジック方式に比べて実行速度が遅くなります。しかし、初期のコンピュータでは、主[[記憶装置]]がCPUに比べて遅かったため、複雑な処理をマイクロプログラムで実現する方が、メモリへのアクセスを減らし、結果的に処理時間を短縮できました。また、マイクロプログラム方式は、複雑な命令セットの実現に適していました。
マイクロプログラム方式により、CISCのような複雑な命令セットが可能になりました。しかし、その後、キャッシュメモリの活用や、命令を単純化してレジスタを増やすことで性能を向上させるという考え方が生まれ、RISCに繋がります。ただし、現代ではCISC、RISCという分類の意義は薄れてきています。
マイクロプログラム方式の欠点
マイクロコードを使用したCPUでは、1つの命令を実行するのに数クロックサイクルを要し、複雑な命令では非常に長い時間がかかることがあります。この命令実行時間の長さは、パイプラインや割り込み遅延に影響を与えます。
マイクロプログラムと著作権
マイクロプログラムは、一般のプログラムと同様に著作権で保護されます。インテルとAMD間の互換CPUに関する争いでは、マイクロコードのライセンスも争点になっています。
マイクロプログラム方式の具体例
チャールズ・バベッジの解析機関は、カムで演算を制御する方式で、世界初のマイクロプログラム方式の設計とも言われます。
IBM System/360 シリーズの多くの機種はマイクロプログラム方式です。
DECのPDP-11も、PDP-11/20以外はマイクロプログラム方式でした。
*
NINTENDO64のReality Co-Processorや
PlayStation 2の
Emotion Engineのベクトル演算ユニットもマイクロプログラム方式です。
マイクロプログラムの実装
マイクロプログラム方式では、プロセッサ自体を、より小さな
制御装置や
記憶装置、命令セットから成る小さなコンピュータとみなします。マイクロプログラムは、
CPUを制御する
ビット列となり、複雑な電気回路の設計変更がプログラムの変更に転換されます。
マイクロシーケンサ、レジスタ、ALU
マイクロシーケンサは、コントロールストアの次のワードを取り出し、レジスタは
CPUのデータを保持する高速なメモリ、ALUは計算を行います。これらの要素は
実行ユニットの構成要素であり、最近の
CPUは複数の
実行ユニットを持っています。
水平型と垂直型
マイクロプログラムの設計には、水平型と垂直型があります。水平型はマイクロ命令が
CPUの各部を直接制御する方式で、垂直型はマイクロ命令を論理回路で解釈して実行する方式です。水平型は
ビット幅が大きく、垂直型は
ビット幅が小さいという特徴があります。
書き換え可能なコントロールストア
書き換え可能な
マイクロコード(WCS)を使用するコンピュータもあり、マイクロプログラムのパッチ適用や、特定用途向けのマシン最適化が可能です。WCSはROMよりも高速にアクセスできるという利点もあります。
マイクロプログラム方式は、1960年代から1980年代中ごろまで主流でしたが、その後
RISC設計哲学が登場し、
マイクロコード実行による性能低下を避けるため、単純な命令を
ハードウェアで直接実行するようになりました。しかし、マイクロプログラム方式は、ネットワークプロセッサなどの特定用途向けプロセッサでは今も使われています。
まとめ
マイクロプログラム方式は、
CPUの制御を
マイクロコードで行うことで、複雑な命令を比較的容易に実装できる技術です。この技術は、命令セットの拡張や異なる
CPUのエミュレーションを可能にする一方で、複雑な命令は処理速度の低下を招くこともあります。マイクロプログラム方式は、
CPUの歴史において重要な役割を果たし、現代のプロセッサにもその影響が残っています。