コンピュータの構成と設計 4.1~4.3節

 パタヘネ4.1~4.3です。前章まではMIPS命令セットアーキテクチャや、算術演算をALUとシフトを用いて実装する方法の話でした。この章からアセンブリ言語より更に低レイヤーにあたる、プロセッサがどうやってアセンブリ言語を実行しているかに関して学んでいきます。正直突然馴染みが無い話に入って理解が怪しいです。

4.1

 MIPS命令実装方式の全体概要。各部の動作に関しては以降の節で詳述。

4.2

 MIPSのデータパスユニットには組み合わせ論理要素と状態論理要素がある。前者は出力が現在の入力に基づいてきまるものである。具体的にはALUが該当する。後者は内部記憶を持っている。コンピュータの電源プラグを抜いても状態論理要素の内容を復元すればコンピュータを正確に再起動できる。状態論理要素の入力は2つ、出力は1つある。入力は保持したいデータと書き込むタイミングを決めるクロック信号、出力は直前のクロックサイクルで書き込まれた値である。

 クロック方式とは、信号がいつ読み出し可能でいつ書き込み可能かを定義するものである。エッジ・トリガ・クロック方式では、クロック信号波形が低から高もしくはその逆に遷移する際に状態論理要素の値を更新する方式である。状態論理要素と状態論理要素の間で信号が伝播する時間でクロックサイクルの長さが決まる。状態論理要素と状態論理要素の間にある組み合わせ論理要素は状態を保持することができない。nステップ目の信号が組み合わせ論理要素中を伝播している間にクロックサイクルが終了してしまうと、nステップ目の演算結果を保持する前に次のn+1ステップ目の演算が始まる。結果として情報の流れが遅滞し、不正な状態となる。

 信号が論理的に高い状態をアサートされた状態といい、論理的に低い状態をネゲートされた状態という。

4.3

 MIPS命令を実行するために必要な構成要素を洗い出す。まずより抽象度の高いデータパス要素を洗い出し、次にそのデータパス要素の内部について詳しく見ていく。

 命令を取り出すために必要な要素として、命令メモリがある。命令メモリは命令アドレスを入力として命令を出力する状態論理要素である。また、プログラムの現在位置を保持するためにプログラムカウンタ(PC)が必要である。命令を読み進めていくためには現在のアドレスを加算していく必要があるため、加算器も必要である。加算器はALUの制御信号に加算だけを行うよう指定すればよい。MIPS命令は4バイトなので、PCの出力を2つに分け、加算器と命令メモリに接続する。加算器はPCからの出力に4を加え、出力をPCに入力する。命令メモリは与えられたPCのアドレスから命令を取り出す。

 次に、MIPS命令形式のうち、R形式を実行する方法を検討する。R形式では、3つのレジスタをとる。例えば、add $t1,$t2,$t3のような形である。2つのレジスタについて演算を行い、結果を1つのレジスタに入れる。この命令を実行するためには、まず、命令を受け取って演算に使うレジスタの値を出力する仕組みが必要である。また、結果を保存先レジスタに書き込む仕組みが必要である。レジスタ・ファイルはレジスタの読み書きを担当するコンポーネントである。レジスタ・ファイルはR形式の命令を実行するために必要な機能を持っている。レジスタ・ファイルの入力は、読み出しレジスタ1、読み出しレジスタ2、書き込みレジスタ、書き込みデータである。レジスタ番号入力は32ビットの命令のうち、該当する各部を取り出すことで作られる。書き込みデータ入力には、読み出しレジスタに対して演算を行ったあとの出力が入る。また、書き込みタイミングは書き込み制御信号RegWriteで制御される。

 次に、ロード命令とストア命令に関して検討する。これらは、2つのレジスタと1つの即値を取る。例えば、lw $t1,offset($t2)のような形である。ロード命令の場合、レジスタと即値の和が示すアドレスから値を読み込み、もう一方のレジスタに書き込む。ストア命令の場合、レジスタの値を、もう一方のレジスタと即値の和が示すアドレスに書き込む。命令中の即値は16ビットであるのに対し、レジスタの値は32ビットなので、加算時は即値を符号拡張する必要がある。ロード・ストア命令のためには符号拡張ユニットが必要となる。また、主記憶のアドレスから値を読み出したり書き込んだりするユニット、データ・メモリ・ユニットが必要となる。データ・メモリ・ユニットはアドレスと書き込みデータを入力とし、読み出しデータを出力する。書き込み動作になるか読み込み動作になるかは制御信号MemWriteとMemReadで制御する。レジスタ・ファイルは読み込みのための制御信号を持たないのに対し、データ・メモリ・ユニットは制御信号を持つ。これは、レジスタ・ファイルに指定されるレジスタ番号は命令から取り出しているので、不正な番号となり得ないが、データ・メモリ・ユニットに指定されるアドレスは不正な値を取りうるためである。

 次に、分岐命令beqを検討する。beqは2つのレジスタと1つの即値をとる。レジスタ同士を比較し、値が等しければ即値で表される分岐先にジャンプ、そうでなければ次の命令に移る。分岐先は相対アドレスで示されている。分岐先アドレスの計算については、PC+4と即値の2ビット左シフトの和を計算できればよい。当然即値は符号拡張が必要になる。PC+4にするのはMIPSの特徴である。また、即値を2ビット左シフトするのも、MIPS命令が32ビット固定であるからである。また、比較に関してはALUを使用する。レジスタ同士の差を計算し、結果が0であるときにアサートされる信号でゼロ判定する。ゼロ判定、すなわち分岐が成立すると、PCを分岐先アドレスで置き換える。そうでなければ通常通りPC+4で置き換える。

 以上が基本的な命令の実装に必要なコンポーネントである。これらを一つのデータパスとしてまとめる。命令ごとに必要な要素が異なっているので、すべての命令で必要なすべての要素を並べ、それらをマルチプレクサで接続し、制御信号を使って必要な要素からの出力を選び取るようにする(図は省略)。

コメント

タイトルとURLをコピーしました