「マイクロプログラム方式」の版間の差分
削除された内容 追加された内容
m +: fa |
英語版を翻訳 |
||
1行目:
'''マイクロプログラム方式(まいくろぷろぐらむほうしき)'''とは、[[CPU]]を実装するときの方法論のひとつである。
'''マイクロプログラム'''は非常に特殊な[[プログラム (コンピュータ)|コンピュータプログラム]]であり、あるコンピュータアーキテクチャ上でより複雑なアーキテクチャを[[エミュレータ|エミュレート]]するものである。
マイクロプログラムは一般的なプログラムに比較して非常に小さいため、マイクロプログラムと呼ばれる。可能な限り実行速度を上げるよう注意深く最適化して設計される。
他のコンピュータプログラムと同様、マイクロプログラムは'''マイクロ命令'''の列からなる。
マイクロ命令はコンピュータの[[CPU]]を最も基本的なレベルで制御するものである。
例えば典型的なマイクロ命令は以下のような処理を行う。
* レジスタ1を[[演算論理装置|ALU]]の入力"A"に接続する
* レジスタ7を[[演算論理装置|ALU]]の入力"B"に接続する
* ALUに二つの入力の足し算を実行するようセットする
* ALUのキャリー入力にゼロをセットする
* 結果をレジスタ8に格納する
* フラグレジスタ("condition codes")をALUのステータスフラグ("Negative"、"Zero"、"Overflow"、"Carry")にしたがってセットする
* マイクロプログラムカウンタにしたがって次のマイクロ命令にマイクロジャンプを行う
このような処理を並列して行うため、マイクロ命令は非常に大きな幅となることが多い。
例えば56ビットやそれ以上になる。
マイクロプログラムはCPUの'''マイクロコード'''としても知られている。
マイクロコードが格納されている[[記憶装置|メモリ]]を'''[[コントロールストア]]'''と呼ぶ。
マイクロコードは([[ファームウェア]]の一部として)ROMに格納されていることもあるし、CPUの初期化の一環として[[Random Access Memory|RAM]]にロードされることもある。
== マイクロプログラム方式が採用される理由 ==
コンピュータが最初に開発された当時、中央処理装置と主記憶のスピードはほぼつりあっており、命令語をメモリから読んでCPUで逐一実行するのは極めて効率的だった。
論理設計が進歩すると、メモリから命令を一回とってくる時間より早くCPU内の処理が済むようになった。
マイクロプログラム方式はこのアンバランスを何とかするために生まれた。
メモリから取ってきた各命令毎にマイクロ[[サブルーチン]]を呼び出すことにより、メモリ上のひとつの命令で非常に複雑な処理を行えるようになった。
例えば浮動小数点数の加算や文字列処理などである。
マイクロプログラム方式の可能性を追求することによって[[CISC]]コンピュータが生まれた。
[[IBM]]の[[システム/360|System/360]]や[[ディジタル・イクイップメント・コーポレーション|DEC]]の[[VAX]]ファミリーは複雑な'''マイクロプログラム'''を使用している。
最近ではメモリの速度が向上し、マイクロプログラム方式の必要性が薄れてきた。これが直接実行型[[コンピュータ・アーキテクチャ]]の復活をもたらした(現在では[[RISC]]と呼ぶ)。
== 他の利点 ==
マイクロプログラム方式のプロセッサのハードウェアの実装は一般のプログラマから見えるものとは違っていて、よりシンプルである。
このシンプルなアーキテクチャ('''マイクロアーキテクチャ''')上で、プログラマに見えているアーキテクチャを実装したマイクロプログラムが実行される。
このマイクロアーキテクチャはプログラマに見えているアーキテクチャと固定的な関係である必要は全くない。
これを利用すれば、様々なマイクロアーキテクチャのハードウェア上に任意の(プログラマから見える)アーキテクチャを実装することができる。
例えば、IBMのSystem/360は32ビットアーキテクチャで16本の汎用レジスタを持っている。
しかしSystem/360の実際のハードウェアの実装ではもっと単純なマイクロアーキテクチャが実装されている。
最も下位の機種である 360 Model 30 は8ビットのマイクロアーキテクチャでハードウェアのレジスタも少ない。
プログラマが見ているものは全てマイクロプログラムがエミュレートしたものである。
より上位の機種は16ビットや32ビットのマイクロアーキテクチャになっていて、プログラマから見えるアーキテクチャに近くなっているため、より高速に動作できる。
この方法により、IBMは様々なハードウェアを使用してコストと性能のバラエティのSystem/360の機種をそろえ、それらを全てアーキテクチャ互換にすることができる。
これにより機種別に書かなければならないシステムソフトウェアを劇的に減らすことが出来る。
全く同じ方法がDECのVAXコンピュータファミリでも採用された。
下位機種では32ビットの2901ビットスライスプロセッサを膨大なマイクロコードとともに使用している。
上位機種では大きな浮動小数点数を直接扱えるように128ビットデータパスを採用している。
マイクロプログラミングはプロセッサの[[バグ]]の修正も容易にする。
多くのバグはマイクロプログラムの修正で間に合い、ハードウェアのロジックや配線を修正する必要がない。
== ハードワイヤードロジック ==
[[ワイヤードロジック]]は、([[Transistor-transistor logic|TTL]]等の)ゲートレベルで命令を実行する回路を組むが、ひとつの命令で複雑な処理をこなす[[CISC]][[アーキテクチャ]]のCPUをワイヤードロジックで組むことは、設計も[[バグ|デバッグ]]も困難である。回路が複雑になるとタイミングを取ることが難しくなるし、1チップ上に実装できる[[トランジスタ]]の数にも限界がある。
5 ⟶ 61行目:
そこで、CPUの[[レジスタ (CPU)|レジスタ]]や演算のゲートのON/OFF信号を命令(マイクロ命令)に見立てて、CPUの中に極小の簡易なCPUが存在するとみなす。CPUが命令を実行するときは、CPUの命令に対応するマイクロプログラムをCPU内部の[[Read Only Memory|ROM]]から読み出して順番に実行する。
単純な[[ハードウェア]]で複雑な命令を実行することができ、マイクロプログラムを変更すれば簡単に命令を拡張できるので、CISCアーキテクチャのCPUの実装の際に良く使われた。例えば[[ナショナル・セミコンダクタ]]社の[[SC/MP]]や[[モトローラ]]社の[[MC68000|MC680x0]]、[[インテル (企業)|インテル]]社の[[Intel 80386|i80386]]など。最近では、[[トランスメタ]]社の[[Crusoe]]が採用している。
== 歴史 ==
1951年以前、CPUの制御回路は行き当たりばったりの方法で設計されていた。
最も単純なものとしてはコンピュータの制御ロジックの順序制御のために[[フリップフロップ]]のリングを使っていた。
1951年、[[イギリス]]の[[情報工学|コンピュータ科学者]] Maurice Wilkesは基本的な発想を得た。
コンピュータ内のある回路が制御信号(命令)を受けて、それを自動ピアノが楽譜を解釈するように解読すればよいと。
つまり長い[[ビット]]列(命令)によって制御するのである。
== 実装 ==
'''マイクロプログラム'''はCPUを制御するビット列となる。
根本的な進歩は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|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|2100]]やDEC [[PDP|PDP-11/60]] [[ミニコンピュータ]])。
WCSの利点はマイクロプログラムに対するパッチを可能にするだけでなく、ある年代のハードウェアにとってはROMよりも高速なアクセスができるという利点もあった。
ユーザがプログラム可能なWCSは、特定用途向けにマシンを最適化することができる。
[[マイクロコード]]を使用したCPUは一般にひとつの命令を実行するのに数クロックサイクルを要する。
クロックサイクル毎にその命令を実現するマイクロプログラムの1ステップを実行するのである。
このため[[CISC]]プロセッサの中には非常に長い時間のかかる命令が存在するものもある。
そのような命令実行時間の長さは[[パイプライン処理|パイプライン]]や[[割り込み]]遅延に影響する。
== マイクロコード 対 VLIWとRISC ==
多くの[[RISC]]および[[VLIW]]プロセッサは全ての命令を(その命令がキャッシュ上にある限り)1サイクルで実行する。
これはマイクロコードを持つCPUがマイクロ命令を1サイクルにひとつ実行するのとよく似ている。
[[VLIW]]は水平型マイクロコードのような非常に長い命令を使う。
一方[[RISC]]はもっと小さい垂直型マイクロコードのような命令を使用する。
==関連項目==
*[[ファームウェア]]
[[Category:CPU|まいくろふろくらむほうしき]]
[[de:Mikroprogrammsteuerwerk]]
|