4.1 はじめに
この章では、CPUの設計について考える。だけど、いきなり本格的なCPU設計を考えると難しいので、まずはシンプルなものを設計する。
最初のバージョンで実行可能な命令は以下の9つだけをサポートする。
メモリ参照命令 : lw(load word), sw(store word) 算術論理演算命令: add, sub, and or, slt ジャンプ命令 : beq, j |
CPUの実装をしたいのだけど、CPUが最初にすることを考えると、以下の3つになる。
1.プログラムカウンタの値を取得し、メモリから命令をフェッチする 2.命令で指定されたレジスタの値を読み込む 3.ALUを使って演算を行う(ジャンプ命令以外) |
各命令によって電子回路的に見た複雑さは異なるので、必要なクロック数は異なる。
CPUでは、演算処理を行うためにALUというユニットが必要となる。ALUの使用目的は命令によって異なる。
lw, sw等 : アドレスの算出 add, sub等 : 計算処理 beq等 : 値の比較 |
ある装置(レジスタ,ALU,pc等)には、複数の場所からデータがセットされる可能性がある。
回路上、それらの線を直結する事は出来ないのでマルチプレクサ(multiplexor)というものを使用する。
これは、制御線によってどのデータを出力に流すかを決めるデータセレクタとしての役割を持つ。
4.2 論理設計とクロック方式
MIPSを構成するユニットには、2つの種類に分けられる。
組み合わせ論理要素 出力は、今の入力だけに依存する 状態論理要素 出力は、前回の入力値に依存する |
状態論理要素は、最低限入力が2つと出力を1つ持つ。
入力としてデータ値とクロック信号の2つが必要で、出力は前回書き込まれた値になる。
信号はもちろんH(1), L(0)の2種類だけど、それらをアサートされた(asserted)、ネゲートされた(deassert)と呼ぶ事もある
ここで、アサートされた状態=電圧が高い状態(bit=1)という意味ではないので注意が必要。アクティブロー回路の場合アサート状態がLOW(bit=0)となる。
CPUの命令はクロックを基準に動作する。
レジスタに対するReadとWriteは1クロックサイクル内で同時に行うことが出来る。
4.3 データパスの構築
データパスというのは、CPUを構成している論理要素で、MIPSのばあいは命令,データ用メモリ,レジスタ,ALU,加算器を指す。
ここでは、各要素を順番に組み立てていく事で最小限のCPUを構成していく
命令の順次取得サイクル
まずは、命令を順次実行する為に必要な3つの要素が必要。
(ブロック図は描くのが面倒なので省略)
命令メモリ 実行すべき命令を管理する アドレスを指定して、命令を出力する プログラムカウンタ(PC) 今実行している命令の番地を管理する カウンタ値のセット、取得が出来る 加算器 プログラムカウンタを加算する 具体的には、今のPCの値を入力として、4加算した値を出力する。 |
取得した命令の演算
次に、これに演算処理部を追加する。
ALU 命令には複数あるので、R形式命令(1or2つのレジスタの値を元に演算を行い結果を出力)だけを考える。 R形式命令はarithmetic-logical instructionとも呼ばれ、演算はALU(arithmetic-logical unit) で行われる。 ALUはALU命令番号、レジスタ値(複数)を入力とし、演算結果・ゼロ判定を出力する。 ゼロ判定は演算結果が0だったときアクティブになるフラグで、分岐命令とかを行うときに使う。 あと、本当はオーバーフロー制御とかもあるけど、説明が煩雑になるので、とりあえず無視して 後で考える事にする。 レジスタファイル 計算元のデータを管理するために、レジスタ値を管理する レジスタ番号を指定されると、レジスタ値を出力する。 レジスタファイルの入力は、ちょっと多くて以下の5つになる 読み出しレジスタ番号1 読み出しレジスタ番号2 書き込みレジスタ番号 書き込みデータ 書き込みを行うかFlg(制御線) 出力は、読み出しデータ1,2の2つとなる というわけで、1クロックでレジスタは2つのレジスタ値を同時に読み出せる。 レジスタ番号は5bit(レジスタ数が32個なので)で、データは32bit(CPUが32bitの場合)となる。 |
メモリのアクセス
ここまでで、レジスタだけを使用した演算処理が出来る様になった。
次は、メインメモリ(RAM)とのアクセスを考える。
CPUから考えると、メモリアクセスはlw,sw等のロード・ストア命令で実行される。
これらの命令は、アクセスするアドレスを求めるために演算が必要。
(例えば、レジスタに格納されたベースアドレスと、即値のオフセットを加算するなど)
また、即値は16bitだったりするので、32bitへの符号拡張機能も必要となる。
というわけで、追加で必要な装置は以下の3つ。
ALU アクセスを行うアドレスを求める装置 これは、前述した演算処理用のALU回路をそのまま流用できる。 だけど、計算の元データは、レジスタ値とは限らないので、 命令メモリから直接データを取り込む信号線も必要。 マルチプレクサ(MUX) 上記ALUの説明で"命令メモリから直接データを取り込む信号線も必要"と書いたけど、 実際の回路上では、2つの信号線を直結する事は出来ない。 なので、どっちからの入力をALUに入力させるかを決めるため装置としてMUXが必要。 この装置の入力は複数のデータ値(レジスタ値や即値)と、どの入力を選択するかの制御信号で、 出力は選択されたデータとなる。 データメモリユニット メモリの管理を行う 入力として、読み出しアドレスと書き込みデータがある。 他に、読み出し、書き込みを行うかの制御線が計2本ある。 また、出力は読み出しデータになる。 → 読み出しアドレスは、"読み書きアドレス"ではという気がするけど、そこが分からない? あと、Read/Writeの信号線が独立して存在するという事は、両方を同時に行えるという事? |
分岐命令
次は分岐命令を考える。
分岐先アドレスを決定する際に、細かい事だけど以下の2点を気をつける必要がある。
(これは、CPUの制限ではなく、MIPSの命令セットアーキテクチャ上の制限)
・命令長は4byte単位なので、指定されたアドレスのおoffsetをそのまま使用できず、4倍する必要がある。 ・分岐先アドレスを求める際、元にするpcは既に+4加算済みになっている(命令フェッチ時に加算してしまう)。 |
条件付分岐の場合は分岐が成立(branch taken)したか不成立(branch not taken)かの判定も必要
というわけで、厳密に考えると分岐命令では2つの事を行う必要がある。
分岐先アドレスの計算処理 分岐すべきかの条件判定処理 |
さらに、次に実行される命令が変わるということは、命令フェッチ部にも細工が必要となる。
実際のところは上記の説明よりもう少し複雑で、それは、MIPSでは遅延分岐という仕組みがあるから。
遅延分岐によって、条件分岐命令がある場合に、分岐成立の有無に関係なく分岐命令の次命令が必ず実行される事になる。
なぜそんな面倒な事をするかというと、パイプライン処理の都合(詳細は4.8で後述する)による。
ただ、beq命令は遅延がないので説明の通りになる。
データパスの作成
上記の構成要素で、最低限のCPU構成に必要な論理部品が整ったので、データパスを考える事にする。
ここで、データパスというのは、データが流れる経路。
シンプルなデータパスは、1クロックで演算処理を実行しようとする。
これによって、最短時間で処理を行えるが、一方で特定の回路は1回づつしか使えないという制約が生まれる。
もし有る回路を2回使いたい場合は、物理的に2個用意する必要がある。
但し、前述のALUのように、機能によってはMUXをかますとかする事で、同時使用せずにすむ場合もある。

コンピュータの構成と設計(上)
関連記事
コメントを残す