マイクロプログラム方式
出典: フリー百科事典『ウィキペディア(Wikipedia)』
マイクロプログラム方式(マイクロプログラムほうしき)は、プロセッサ(CPU)の実装手法のひとつである。
CISCのCPUで採用され、CPU内のマイクロプログラム (Microprogram) により、複雑な命令を比較的容易に実装できる。そのためOSから見たハードウェア(コンピュータ・アーキテクチャ、特に命令セット)を簡素化する、更には標準化して互換性を高める、あるいは別のコンピュータ・アーキテクチャをエミュレートできる、などの利点がある。このため仮想化技術のひとつともいえる。
反面、複雑な命令の増加を招き、また命令により必要なクロックが異なるためパイプラインの効果が薄れる難点がある。
マイクロプログラムはCPUのマイクロコードであり、ファームウェアの一部としてROMに格納されていることもあるし、CPUの初期化の一環としてRAMにロードされることもある。
このため広義には、CPU以外を含むファームウェア全般をマイクロコードと呼ぶ場合もある。
目次 |
[編集] 概要
マイクロプログラム (Microprogram) は非常に特殊なコンピュータプログラムであり、あるコンピュータアーキテクチャ上でより複雑なアーキテクチャをエミュレートするものである。マイクロプログラムは一般的なプログラムに比較して非常に小さいため、マイクロプログラムと呼ばれる。可能な限り実行速度を上げるよう注意深く最適化して設計される。
他のコンピュータプログラムと同様、マイクロプログラムはマイクロ命令の列からなる。マイクロ命令はコンピュータのCPUを最も基本的なレベルで制御するものである。 例えば典型的なマイクロ命令は以下のような処理を行う。
- レジスタ1をALUの入力"A"に接続する
- レジスタ7をALUの入力"B"に接続する
- ALUに二つの入力の足し算を実行するようセットする
- ALUのキャリー入力にゼロをセットする
- 結果をレジスタ8に格納する
- フラグレジスタ("condition codes")をALUのステータスフラグ("Negative"、"Zero"、"Overflow"、"Carry")にしたがってセットする
- マイクロプログラムカウンタにしたがって次のマイクロ命令にマイクロジャンプを行う
このような処理を並列して行うため、マイクロ命令は非常に大きな幅となることが多い。例えば56ビット(8ビットx7命令)やそれ以上になる。
マイクロプログラムはCPUのマイクロコードとしても知られている。マイクロコードはCPUの各マイクロ命令を1つの状態とした、状態遷移表をメモリであらわしたものと捕らえることができる。
マイクロコードは(ファームウェアの一部として)ROMに格納されていることもあるし、CPUの初期化の一環としてRAMにロードされることもある。
コンピュータの電源投入時に、マイクロコードをロードする過程をIML(イニシャル・マイクロコード・ローダー)とも呼ぶ。またマイクロコードが格納されているメモリをコントロールストアと呼ぶ。
[編集] 歴史
1951年以前、CPUの制御回路は行き当たりばったりの方法で設計されていた。最も単純なものとしてはコンピュータの制御ロジックの順序制御のためにフリップフロップのリングを使っていた。
1951年、イギリスのコンピュータ科学者 モーリス・ウィルクスは基本的な発想を得た。コンピュータ内のある回路が制御信号(命令)を受けて、それを自動ピアノが楽譜を解釈するように解読すればよいと。つまり長いビット列(命令)によって制御するのである。彼はEDSACの後継機を設計中にこれを発明し、実際 EDSAC-II で採用した。
1958年 IBM 709は、マイクロコードによる、商用初の別アーキテクチャのエミュレータを提供した。
1964年 IBM System/360は、マイクロコードによる上位互換の確立(標準化)により、コンピュータアーキテクチャを確立した
[編集] 利点
[編集] 仮想化
マイクロプログラム方式のプロセッサのハードウェアの実装は一般のプログラマから見えるものとは違っていて、よりシンプルである。このシンプルなアーキテクチャ(マイクロアーキテクチャ)上で、プログラマに見えているアーキテクチャを実装したマイクロプログラムが実行される。このマイクロアーキテクチャはプログラマに見えているアーキテクチャと固定的な関係である必要は全くない。これを利用すれば、様々なマイクロアーキテクチャのハードウェア上に任意の(プログラマから見える)アーキテクチャを実装することができる。
例えば、IBMのSystem/360は32ビットアーキテクチャで16本の汎用レジスタを持っている。しかしSystem/360の実際のハードウェアの実装ではもっと単純なマイクロアーキテクチャが実装されている。最も下位の機種である 360 Model 30 は8ビットのマイクロアーキテクチャでハードウェアのレジスタも少ない。プログラマが見ているものは全てマイクロプログラムがエミュレートしたものである。より上位の機種は16ビットや32ビットのマイクロアーキテクチャになっていて、プログラマから見えるアーキテクチャに近くなっているため、より高速に動作できる。
この方法により、IBMは様々なハードウェアを使用してコストと性能のバラエティのSystem/360の機種をそろえ、それらを全てアーキテクチャ互換にすることができる。これにより機種別に書かなければならないシステムソフトウェア(OSなど)を劇的に減らすことが出来る。
全く同じ方法がDECのVAXコンピュータファミリでも採用された。下位機種では32ビットの2901ビットスライスプロセッサを膨大なマイクロコードとともに使用している。上位機種では大きな浮動小数点数を直接扱えるように128ビットデータパスを採用している。
マイクロプログラミングはプロセッサのバグの修正も容易にする。多くのバグはマイクロプログラムの修正で間に合い、ハードウェアのロジックや配線を修正する必要がない。
[編集] 性能
コンピュータが最初に開発された当時、中央処理装置と主記憶のスピードはほぼつりあっており、命令語をメモリから読んでCPUで逐一実行するのは極めて効率的だった。論理設計が進歩すると、メモリから命令を一回とってくる時間より早くCPU内の処理が済むようになった。
マイクロプログラム方式はこのアンバランスを何とかするために生まれた。メモリから取ってきた各命令毎にマイクロサブルーチンを呼び出すことにより、メモリ上のひとつの命令で非常に複雑な処理を行えるようになった。例えば浮動小数点数の加算や文字列処理などである。マイクロプログラム方式の可能性を追求することによってCISCコンピュータが生まれた。IBMのSystem/360やDECのVAXファミリーは複雑なマイクロプログラムを使用している。
その後メモリの速度が向上し、マイクロプログラム方式の必要性が薄れてきた。これが直接実行型コンピュータ・アーキテクチャの復活をもたらした。(現在ではRISCと呼ぶ。)
ただし、CISCであるIntelの80x86系CPUも、i486以後でワイヤードロジックなどRISCの技術を徐々に取り入れた。またRISCであるSunのSPARC、IBMのPOWERも必要に応じて命令セットの追加を繰り返しているため、現在ではCISC、RISCという分類の意義は薄れている。
[編集] ハードワイヤードロジック
ワイヤードロジックは、(TTL等の)ゲートレベルで命令を実行する回路を組むが、ひとつの命令で複雑な処理をこなすCISCアーキテクチャのCPUをワイヤードロジックで組むことは、設計もデバッグも困難である。回路が複雑になるとタイミングを取ることが難しくなるし、1チップ上に実装できるトランジスタの数にも限界がある。
そこで、CPUのレジスタや演算のゲートのON/OFF信号を命令(マイクロ命令)に見立てて、CPUの中に極小の簡易なCPUが存在するとみなす。CPUが命令を実行するときは、CPUの命令に対応するマイクロプログラムをCPU内部のROMから読み出して順番に実行する。
単純なハードウェアで複雑な命令を実行することができ、マイクロプログラムを変更すれば簡単に命令を拡張できるので、CISCアーキテクチャのCPUの実装の際に良く使われた。例えばナショナル セミコンダクターのSC/MPやモトローラのMC680x0、インテルのi80386など。最近では、トランスメタのCrusoeが採用している。
また、このマイクロコードROMの著作権をめぐり、互換CPUの製造に関して裁判が起きた製品もある。(詳しくはインテル,アドバンスト・マイクロ・デバイセズを参照)
RISCプロセッサが主流になりつつあった1990年代以降のプロセッサでは、命令の実行に複数クロック必要なマイクロコードROMを廃止し、処理を組合わせ回路に展開して1クロックで実行できるようにしたものが多い。このため命令の実行速度の面では、マイクロコードよりもワイヤードロジックで構成されたものが有利となる。これは、半導体プロセスの進歩により、時代とともに最適なアーキテクチャが変化していることを表している。
[編集] 実装
マイクロプログラムはCPUを制御するビット列となる。根本的な進歩はCPU制御がコンピュータプログラムになったことである。つまり、複雑な電気回路の設計変更(すなわち従来のCPUの制御)がプログラムの変更に転換されたのである。
以下、コンピュータ内部をいくつかに分けて解説する。
マイクロシーケンサがコントロールストアの次のワードを取り出す。シーケンサとはカウンタのようなもので、コントロールストアの一部のデータにしたがってジャンプする(つまり値をカウントアップして指し示す場所を変化させる)が、場合によっては命令レジスタの内容にしたがってジャンプする。最も単純なシーケンサはコントロールストアの数ビットをロードするレジスタである。
レジスタはCPUのデータを保持する高速なメモリである。レジスタにはプログラムカウンタ、スタックポインタなどアプリケーションプログラマが簡単にはアクセスできないものも含まれる。ほとんどのレジスタセットは三つのポートを持つ。すなわち同時にふたつのレジスタを読んで、ひとつのレジスタに書き込むのである(レジスタ間の基本的な演算命令を想起されたい:add r1,r2,r3 (r1 ← r2 + r3))。
ALU(演算ユニット)は計算を行う。加算、論理否定、右シフト、論理積、論理和などである。ALUでさらに他の機能を実現することもある。
メモリアドレスレジスタとメモリデータレジスタも存在することがあり、コンピュータの主記憶へのアクセスに使用する。
これらは全て実行ユニットの構成要素である。最近のCPUは複数の実行ユニットを持つ。単純なコンピュータでもひとつの実行ユニットをメモリの読み書きに使用し、もうひとつの実行ユニットをユーザコードの実行に使用する。
これらの要素をひとつのチップに組み込むこともある。このチップが実行ユニットのスライスを構成し、これをビットスライスチップと呼ぶ。
実行ユニットの各構成要素や実行ユニット同士は複数のワイヤで結線される。これをバスと呼ぶ。
プログラマはマイクロプログラムを作成する。その際の基本ツールもソフトウェアであり、マイクロアセンブラを使ってビットテーブルをシンボリックに定義する。シミュレータでそのビットを電気回路と同じように実行してみてマイクロプログラムをデバッグする。
典型的なマイクロマシンの制御ワードには、ある幅のビット列があって、CPU内の各部を制御する。例えば簡単な配置例は以下の通りである。
| ソースレジスタA | ソースレジスタB | デスティネーションレジスタ | ALU操作 | ジャンプタイプ | ジャンプアドレス |
このタイプのマイクロマシンでジャンプ先アドレスを即値としてジャンプ命令オペコードの次に与えるジャンプ命令を実装する場合、マイクロアセンブリ言語は以下のようになる。
# シャープ記号ではじまる行はコメント # これは単なるラベル。アセンブラにシンボリックにアドレスを指定する # 一般的な方法である InstructionJUMP: # 次の命令に備えて、命令デコードのマイクロコードがプログラムカウンタを # メモリアドレスレジスタ(MAR)にすでに格納して、次の命令と思われる内容を # メモリデータレジスタ(MDR)にロードする。これが実はジャンプ命令の # オペコードの次のワードであり、ジャンプ先アドレスになっている。 # そのためにMDRをMARにコピーする。 # シーケンサには"NEXT"命令を与えてコントロールストアの次の命令を取り出すよう # 指示する。 MDR, NONE, MAR, COPY, NEXT, NONE # この命令で、次の命令アドレスをプログラムカウンタ(PC)に格納する。 # これにより、メモリシステムに1クロックサイクルの余裕を与えて、前の # マイクロ命令で開始されたフェッチを終了させる。 # シーケンサには命令デコードマイクロプログラムの先頭にジャンプすることを指示。 MAR, 1, PC, ADD, JMP, InstructionDecode # 命令デコードはエミュレートするプロセッサに依存していて非常にきたない # コードになるのでここでは示さない。この例は非常に単純化したものである。 # 多くのCPUはジャンプ先を示すにも様々な方法を用意している。 # つまり、ジャンプ命令も一種類ではない。
上記の例は水平型(ホリゾンタル)マイクロコードを示している。CPU制御のあらゆる部分を各クロックサイクル毎に記述してシーケンサを動作させるものである。
水平型マイクロコードには何もしないことを指示している部分が多いことに注意。いくつかのCPUは全く異なる垂直型(バーチカル)マイクロコードを使用してコストを削減する。ある種の垂直型マイクロコードは非常に単純なコンピュータで複雑なコンピュータをエミュレートしているようなものである。この技術はPDP-8のころは一般的だった。もうひとつの垂直型マイクロコードはふたつのフィールドを持つ。
| フィールドセレクト | フィールドバリュー |
「フィールドセレクト」はこのワードで制御対象としているCPU内の構成要素を指示する。 「フィールドバリュー」はその構成要素を実際に制御する。このタイプのマイクロコードでは、設計者は明示的にコストを優先してCPU性能を犠牲にしていると言える。複雑さを排除することでCPUのクロック周波数を上げることができるかもしれないが、1命令あたりにかかるクロックサイクル数が増えるので効果が相殺される。
トランジスタが安価になり、水平型マイクロコードが主流となった。2000年代初頭、垂直型マイクロコードは一般のコンピュータ上で他のアーキテクチャをエミュレートするエミュレータソフトウェア以外では使われなくなった。
マイクロプログラムが完成してテストされた後、これを論理回路生成プログラムの入力データとして使用する場合もある。完璧に最適化された論理回路を生成できるプログラムは存在しないが、それなりにできのよい論理回路を使うことでコントロールストアのためのROMに使うトランジスタを減らすことができ、結果として全体のトランジスタ数を減らすことができる。これによりCPUのコストと消費電力を減らすことが出来る。
[編集] 書き換え可能なコントロールストア
ごく一部のコンピュータは書き換え可能なマイクロコードを使っている。つまり、マイクロコードをROMやハードワイヤードロジックに格納しているのではなく、WCS (Writable Control Store) と呼ばれるRAMに格納している。多くの場合、それらのマシンは実験用プロトタイプであったが、商用マシンでも書き換え可能なマイクロコードを採用したものがあった。初期のXeroxワークステーションやDECのVAX 8800(ノーチラス)ファミリ、IBMのSystem/370のいくつかの機種などである。オプションとして書き換え可能なコントロールストアを用意していたマシンはさらに多い(たとえばHP HP 2100 や DEC PDP-11/60 ミニコンピュータ)。WCSの利点はマイクロプログラムに対するパッチを可能にするだけでなく、ある年代のハードウェアにとってはROMよりも高速なアクセスができるという利点もあった。ユーザがプログラム可能なWCSは、特定用途向けにマシンを最適化することができる。
マイクロコードを使用したCPUは一般にひとつの命令を実行するのに数クロックサイクルを要する。クロックサイクル毎にその命令を実現するマイクロプログラムの1ステップを実行するのである。このためCISCプロセッサの中には非常に長い時間のかかる命令が存在するものもある。そのような命令実行時間の長さはパイプラインや割り込み遅延に影響する。
[編集] マイクロコード 対 VLIWとRISC
多くのRISCおよびVLIWプロセッサは全ての命令を(その命令がキャッシュ上にある限り)1サイクルで実行する。これはマイクロコードを持つCPUがマイクロ命令を1サイクルにひとつ実行するのとよく似ている。VLIWは水平型マイクロコードのような非常に長い命令を使う。一方RISCはもっと小さい垂直型マイクロコードのような命令を使用する。