プロセッサのデータパスと制御 ─ ハードワイヤ制御とマイクロプログラム
命令が動く仕組みは「値を運ぶデータパス」と「経路を切り替える制御」に分けると一気に見通せます。ハードワイヤ制御とマイクロプログラム制御、単一・多サイクル実装の設計判断を原理から押さえられます。
- 1.プロセッサはALU・レジスタファイル・マルチプレクサ・バスからなるデータパス(値の通り道)と、制御信号を生成して経路を選ぶ制御部に分かれる。
- 2.制御部は有限状態機械を論理ゲートで直接組むハードワイヤ制御と、制御信号を表として並べたマイクロコードを参照するマイクロプログラム制御の二択で、速度と設計柔軟性が綱引きする。
- 3.単一サイクル実装は全命令を最長命令のクロックに合わせて遅く、多サイクル実装は命令を複数の短ステップに分け状態機械で進めてハードを再利用する。
データパスと制御は何を分けているのか
プロセッサの中身は、大きく二つに割って考えると見通しが良くなります。データパス(datapath、値が流れる回路)と、それを操る制御部(control unit)です。データパスは値を保持し運び加工する物理経路で、制御部はその経路をどう繋ぐかを毎サイクル指示する頭脳です。命令の実行とは突き詰めれば「制御部がデータパスのスイッチを正しい順序で切り替えること」に尽きます。
データパスを構成する部品は限られています。
| 部品 | 役割 | 制御部から受ける信号 |
|---|---|---|
| レジスタファイル | 汎用レジスタの記憶。読み出し2・書き込み1ポートが基本 | 読み出し/書き込みレジスタ番号、書き込み許可 |
| ALU | 加減算・論理演算・比較を行う演算器 | 演算種別を選ぶALU制御コード |
| マルチプレクサ | 複数の入力線から1本を選ぶ切替器 | どの入力を通すかの選択信号 |
| バス/内部配線 | 部品間で値を運ぶ共有経路 | 誰が値を載せるかのドライブ信号 |
マルチプレクサ(mux、多入力1出力の選択器)が制御の主役です。たとえばALUの第2入力を「レジスタの値」にするか「命令中の即値」にするかは、ALUの直前に置いた2入力muxの選択信号1本で決まります。制御部が出すのはこうした選択信号・許可信号の束で、これらをまとめて制御信号(control signals)と呼びます。命令の意味は、結局「どの制御信号をどう立てるか」という1枚の真理値表に還元できます。
ロード命令とALU命令の違いは、データパス上では「メモリを読むmuxを選ぶか」「ALU結果を書き戻すか」といった制御信号の値の組み合わせの違いでしかありません。だから制御部の設計とは、命令(オペコード)を入力、制御信号の束を出力とする巨大な関数を、どんな回路で実装するかという問題になります。この関数を論理ゲートで直接組むのがハードワイヤ制御、メモリの表として持つのがマイクロプログラム制御です。
単一サイクルと多サイクル ─ ハードをどう使い回すか
データパスが決まると、次は「1命令を何サイクルで実行するか」という設計判断が来ます。
単一サイクル実装は、フェッチからレジスタ書き戻しまでを1クロックで終えます。1命令1サイクルと一見速そうですが、クロック周期を全命令で最も長い命令(ふつうはメモリアクセスを伴うロード)の所要時間に合わせざるを得ません。加算しかしない命令も、ロードと同じ長いクロックを待たされるため、平均性能はむしろ落ちます。さらに1サイクル内で同じ部品を二度使えないので、命令メモリとデータメモリ、加算用ALUとアドレス計算用加算器を別々に持つ必要があり、ハードが重複します。
多サイクル実装は、1命令を「フェッチ」「デコード/レジスタ読み」「実行」「メモリ」「書き戻し」のような短いステップに分割し、1ステップ1サイクルで進めます。クロック周期は最も長い1ステップに合わせればよいので短くでき、命令ごとに必要なステップ数だけ消費します。各ステップが別サイクルなので、1個のALUをアドレス計算にも演算にも使い回せ、メモリも命令とデータで共有できます。ハードの再利用と引き換えに、ステップ間で値を保持する内部レジスタ(命令レジスタやALU出力レジスタ)が要ります。
| 観点 | 単一サイクル | 多サイクル |
|---|---|---|
| クロック周期 | 最長命令に合わせて長い | 最長ステップに合わせて短い |
| 命令あたりサイクル数 | 常に1 | 命令ごとに3〜5など可変 |
| ハード重複 | メモリやALUを複数持つ | 1つを各ステップで再利用 |
| 制御の形 | 純粋な組み合わせ回路(状態なし) | ステップを進める有限状態機械 |
多サイクルでは「今どのステップか」という状態を制御部が覚える必要があり、ここで有限状態機械(FSM)が登場します。実用プロセッサが採るパイプラインは、この多サイクルの各ステップを別々の命令で同時に埋めて重ね、命令あたり実効1サイクルに近づける発展形と捉えられます。
ハードワイヤ制御 ─ 状態機械を論理で直接組む
制御部の本体は「現在の状態とオペコードから、次の状態と制御信号を決める」有限状態機械です。これを論理ゲートとフリップフロップで直接実装するのがハードワイヤ制御(hardwired control)です。
入力: 現在状態(state) と 命令のオペコード(opcode)
出力: 制御信号の束(controls) と 次状態(next_state)
controls = F_out(state, opcode) ← 組み合わせ論理
next_state = F_next(state, opcode) ← 組み合わせ論理
状態レジスタ ← next_state ← クロックごとに更新
F_out と F_next は真理値表をそのまま積項の論理式に落としたもので、PLA(プログラマブル論理アレイ)や最適化済みゲート網で作ります。最短経路で信号を生成するため高速で、面積も小さく、1命令1ステップの遅延が最小になります。これがRISCのような単純で規則的な命令セットと相性が良い理由です。
命令を1つ足す、ある命令の挙動を直すといった変更は、状態機械の真理値表が変わることを意味し、論理式の再設計と回路の作り直しに直結します。出荷後のバグ修正は不可能で、欠陥は再製造(リスピン)でしか直せません。命令が多く挙動も複雑だと真理値表が爆発的に膨らみ、検証も困難になります。速い代わりに、硬い(変えにくい)のがハードワイヤ制御です。
マイクロプログラム制御 ─ 制御信号を表として持つ
もう一方のマイクロプログラム制御(microprogrammed control)は発想を逆転させます。制御信号の束を論理式で計算するのではなく、制御メモリ(control store、しばしば内蔵ROM)に並べた表から読み出すのです。表の1行をマイクロ命令と呼び、その中身がそのサイクルで立てるべき制御信号そのものです。マイクロ命令を順に並べた小さなプログラムがマイクロコードで、機械語命令1つを複数のマイクロ命令の列に翻訳します。
マイクロ命令の構造(水平型の例)
┌────────────┬──────────────────────────┬─────────────┐
│ 制御信号フィールド │ 分岐条件 │ 次アドレス │
│ ALUsel RegW MemR …│ どの状態でどこへ飛ぶか │ 次マイクロ命令 │
└────────────┴──────────────────────────┴─────────────┘
実行ループ:
μPC(マイクロプログラムカウンタ)が指す行を制御メモリから読む
→ 制御信号フィールドをデータパスへそのまま出力
→ 次アドレス/分岐条件で μPC を更新
ここでマイクロプログラムカウンタ(μPC)が、機械語のプログラムカウンタと同じ役割をマイクロ命令の世界で果たします。オペコードはマイクロコードの開始アドレスへ写像(ディスパッチ)され、そこから数本のマイクロ命令を辿って1機械語命令を実現します。マイクロ命令の符号化には二系統あります。
| 方式 | 符号化 | 性質 |
|---|---|---|
| 水平型マイクロコード | 1ビット=1制御信号で直接持つ | 幅広で並列度が高く高速、メモリは大きい |
| 垂直型マイクロコード | 信号をコード化しデコーダで復元 | 幅狭でメモリ小、復元の段が要り遅い |
CISCの「文字列コピー」や「メモリ間演算」のような多段の複雑命令は、内部では数十本のマイクロ命令の列として実装されます。命令を1つ加えるのはマイクロコードに数行のルーチンを書き足すだけで済み、データパスの再設計は不要です。だからマイクロプログラム制御は、命令が多く不規則なCISCで威力を発揮します。詳しくはCISCとRISCの命令セット設計が、両者の系譜とマイクロコードの位置づけを扱っています。
設計判断 ─ どちらを選ぶか、そして現代の折衷
両者の本質的なトレードオフは「速度 対 柔軟性」です。
| 観点 | ハードワイヤ制御 | マイクロプログラム制御 |
|---|---|---|
| 速度 | 最短経路で速い | 制御メモリ読み出しのぶん遅い |
| 柔軟性 | 変更は回路の作り直し | 表の書き換えで変更可 |
| 複雑命令 | 真理値表が膨張し不利 | ルーチン追加で容易 |
| 面積 | 規則的な命令なら小 | 制御メモリの面積が要る |
| 向く対象 | 単純・規則的なRISC | 複雑・不規則なCISC |
歴史的には、CISCのマイクロプログラム制御 対 RISCのハードワイヤ制御という対立で語られてきました。命令が単純なら状態機械が小さく済み、ハードワイヤで最速に組めます。命令が複雑なら、表で持つマイクロコードのほうが設計も保守も現実的になります。
ただし現代の高性能x86は、この二者択一を両方使う形で折衷しています。add や load のような頻出の単純命令はハードワイヤに近いデコーダで直接マイクロオペレーション(μops)へ展開して速く流し、稀で複雑な命令だけを制御メモリ上のマイクロコードルーチンへ投げます。さらに、出荷後に発見されたバグやセキュリティ欠陥を、マイクロコードアップデート(更新可能な制御メモリへの書き換え)で修正できる柔軟性も得ています。これはハードワイヤ制御では原理的に不可能だった芸当で、表として制御を持つことの最大の実用的恩恵です。こうした命令の発行・展開の先にある実行段の仕組みはスーパースカラの発行とディスパッチで扱います。
「データパスはALU・レジスタファイル・mux・バスで値を運ぶ経路、制御部は毎サイクル制御信号を出して経路を選ぶ」「ハードワイヤ制御は状態機械を論理ゲートで直接実装し高速だが変更困難、マイクロプログラム制御は制御信号をマイクロコードとして制御メモリに表で持ち柔軟だがやや遅い」「単一サイクルは最長命令にクロックを合わせハードが重複、多サイクルは命令を短ステップに分けFSMで進めハードを再利用」を押さえる。水平型・垂直型マイクロコードの違いと、現代x86が両方式を折衷しマイクロコード更新でバグ修正できる点も頻出です。
まとめ
- プロセッサはデータパス(ALU・レジスタファイル・マルチプレクサ・バスで値を運ぶ経路)と制御部(毎サイクル制御信号を生成し経路を選ぶ)に分かれ、命令の実行は制御信号の束をどう立てるかという真理値表に還元できる。
- ハードワイヤ制御は有限状態機械を論理ゲートで直接組むため最速だが、命令追加や修正は回路の作り直しになり硬い。単純で規則的なRISC向き。
- マイクロプログラム制御は制御信号をマイクロコードとして制御メモリに表で持ち、μPCで辿る。柔軟で複雑命令を足しやすいが、制御メモリ読み出しのぶん遅い。複雑なCISC向き。
- 単一サイクルは全命令を最長命令のクロックに合わせ非効率でハードも重複、多サイクルは命令を短ステップに分けFSMで進めてハードを再利用する。現代の高性能設計は両制御方式を折衷し、マイクロコード更新による出荷後修正という実用的利点を得ている。
CPU/メモリ/ディスク Article
プロセッサのデータパスと制御 ─ ハードワイヤ制御とマイクロプログラムを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
データパス
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6
導入後に効く点
制御部は有限状態機械を論理ゲートで直接組むハードワイヤ制御と、制御信号を表として並べたマイクロコードを参照するマイクロプログラム制御の二択で、速度と設計柔軟性が綱引きする。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「データパス / 制御部」に近いか確認する。
- 強みである「プロセッサはALU・レジスタファイル・マルチプレクサ・バスからなるデータパス(値の通り道)と、制御信号を生成して経路を選ぶ制御部に分かれる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。