更新日: 2016 年 8 月 18 日
68060を斬る!!(第1回)
説明
MC68060 の解説記事です。月刊電脳倶楽部 117 号(1998 年 2 月号)から 139 号(1999 年 12 月号)にかけて読み物横町で不定期連載していました。転載にあたって内容の再考証は行っていません。ご了承下さい。
68060_01.txt
──────────────────────────────────── 68060を斬る!! 第1回 鎌田誠 ──────────────────────────────────── ●はじめに 060turbo のユーザ数は順調に増えています。その一方で、「68060 のマニュ アルが欲しいが手に入らない」という話も聞きます。68060 の英文マニュアルは Motorola の『MC68060/68LC060/68EC060 Microprocessors User's Manual』です。 これは普通の本屋さんでは売っていませんが、Motorola に問い合わせれば取り 寄せることができますし、自分で印刷できる人は Motorola のホームページ(後 述)からダウンロードするという手もあります。しかし、残念ながら、今のとこ ろ 68060 の和文マニュアルは存在しません。 私が 2 年近く持ち歩いて使っている英文マニュアルは既にボロボロで分解し かかっていますが、これをまるごと翻訳する体力はなさそうです。それならいっ そのこと連載にして少しずつ解説していけば、そのうち塵も積って和文マニュア ルの代わりができるのではないかという淡い期待を抱いて、この連載を始めたい と思います。 正直言って、どの程度期待に応えられるかわかりません。確実に毎月書けると いう自信はないので、不定期連載になる予定です。筆者の体力に応じて出たり引 っ込んだりすると思いますが、見逃すと損をするような読み物にしたいと思って いるので、一応、毎月チェックしてやって下さい。 そろそろ本題に入りましょう。本当は 68060 の特徴は云々という漠然とした 話から書き出そうとしたのですが、きりがないのでやめました。つまんないし。 それで、今回は 68060 の内部の構造と密接に関連しているパイプライン関連の 話から書こうと思います。 ●パイプラインとは 68060 のことはとりあえず置いておいて、一般的な話をします。 大雑把に言うと、たいていの CPU は、 (a) 命令をメモリから取り出す(命令フェッチ) (b) 命令の種類を調べる(デコード) (c) 使用するデータのアドレス(実効アドレス)を計算する (d) 使用するデータを読み出す(データフェッチ) (e) 演算を行う (f) 結果を書き戻す という作業を繰り返しています。そして、最近の速い CPU では、(a) から (f) までをベルトコンベアのように流れ作業で処理しているのが普通です。つまり、 (a) から (f) までの作業がすべて独立して並列に動作していて、命令はベルト コンベアの上を順番に流れて行きます。例えば、ある命令が (c) に差し掛かっ た頃には次の命令が (b) に届いているという感じです。こういう構造をパイプ ラインと呼びます。 ●パイプラインの利点 パイプラインを使うと、連続した複数の命令がオーバーラップしながら実行さ れます。その結果、1 個の命令の処理に必要な時間に対して、複数の命令の所要 時間を大幅に縮めることができます。例えば、仮に前述の (a) から (f) までの 各ステージがそれぞれ 1 クロックずつかかるとすると、命令はパイプラインに 1 クロックあたり 1 個ずつ押し込まれると同時に 1 クロックあたり 1 個ずつ 押し出されるという、ところてんのような動きになります。こうして、実際には 1 クロックでは完了できない命令であっても、その見掛けの所要時間は 1 クロ ックになるわけです。これがパイプラインの利点です。 ●パイプラインの欠点 パイプラインは、その構造上、直後に近い命令の自己書き換えが期待通りに動 作しないという欠点があります。なぜなら、直後の命令を書き換えようとしたと きには、その命令は既にパイプラインに入ってしまっているからです。どうして も自己書き換えをしたければ、書き換えた後にパイプラインを掃除する命令 (68060 では NOP 命令など)を使って、書き換えた命令をフェッチし直さなけ ればならず、結局、自己書き換えをしないプログラムに変更した方が速く動作す ることになります。自己書き換えの問題は命令キャッシュとも関連していて一言 では片付かないので、別の項目で改めて説明しようと思います。 もう 1 つ、パイプラインを採用しただけでは速くできない処理があります。 それは分岐命令です。分岐命令はプログラムカウンタに影響を与えます。例えば、 M68000 ファミリの、 JMP (d,PC) という命令を考えてみましょう。これはプログラムカウンタに d(定数)を加え る命令です。前述のパイプラインでは、(d,PC) のアドレス(実効アドレス)が 決定するのは (c) の段階です。つまり、JMP 命令が (c) を通過するまでその直 後に実行すべき命令のアドレスが決定せず、次の命令フェッチに取り掛かること ができません。あるいは、(b) で分岐命令かどうか調べている最中に JMP の直 後に書いてあったコードが (a) に入ってきてしまうので、それを後からキャン セルしなければならないと考えてもよいでしょう。いずれにしても、ベルトコン ベアの上の命令の並びに間隔が空いてしまって、結果的に、パイプラインを採用 しただけでは JMP 命令は最低でも 3 クロック以上かかるということになります。 これがパイプラインの欠点です。 CPU の種類によっては、分岐命令の無駄を省くために、分岐前に実行する命令 を分岐命令の後に記述するようになっているものもあります。しかし、M68000 ファミリのアーキテクチャを継承している 68060 ではそういうわけにはいきま せん。 ●分岐予測 分岐予測とは、パイプラインの欠点である分岐命令の実行時間を減らすための 仕掛けです。前述の通り、分岐命令が遅いのは分岐命令とその直後に実行すべき 命令を続けてパイプラインに入れることができないからです。そこで、命令フェ ッチの段階で何らかの方法で分岐を予測して分岐先の命令をフェッチしてしまえ ば、分岐命令も他の命令と同様に高速に動作させることができるはずです。これ が分岐予測です。 無条件の分岐命令だけでなく、条件付きの分岐命令に対しても分岐方向を予測 することでパイプラインの詰りを改善することができます。無条件の分岐命令の 分岐予測は予測できれば 100% 正確な予測になりますが、条件付きの分岐命令の 場合は 100% 正確に予測することは困難です。予測が間違っていた場合は分岐命 令の直後まで遡って命令をフェッチし直す必要が出てきます。 ●分岐キャッシュを用いた分岐予測 一度実行した分岐命令のアドレスと分岐先のアドレスのペアを覚えておいて、 そのアドレスの分岐命令を再び実行しようとしたときに以前の分岐方向を参考に するという分岐予測方法があります。CPU の内部で分岐命令のアドレスと分岐先 のアドレスを覚えておく場所を分岐キャッシュと呼びます。 ──────────────────────────────────── ● 68060 のパイプライン 一般的な話はこのくらいにして、68060 の場合について書きましょう。 68060 のパイプラインはちょっと複雑です。なぜなら、68060 は M68000 ファ ミリのアーキテクチャを継承するために可変長の命令を採用しているからです。 可変長の命令を 1 クロックでフェッチするのは至難の技です。そこで 68060 で は、前述の (a) をさらに細かく分解して命令フェッチパイプライン(IFP: Instruction Fetch Pipeline)、(b) から (e) までは命令実行パイプライン (OEP: Operand Execution Pipeline)として分けて処理しています。この 2 つ のパイプラインは 96 バイトの FIFO(First In First Out: 先入れ先出し)方 式の命令バッファで結合されており、IFP は OEP の進み具合に関係なく次の命 令をフェッチすることができるようになっています。 ● 68060 の命令フェッチパイプライン 68060 の内部の命令フェッチユニット(IFU: Instruction Fetch Unit)と呼 ばれる場所に命令フェッチパイプラインがあります。命令フェッチパイプライン は以下のような 4 段から成っています。 (a1) 命令のアドレスを計算する (a2) 可変長の命令をメモリから取り出す(命令フェッチ) (a3) 命令の種類を調べる(アーリーデコード) (a4) 命令を命令バッファに入れる 命令フェッチパイプラインでは、命令フェッチに加えて、分岐予測と、可変長 の命令を固定長に変換する作業を行います。(a3) は命令実行パイプラインに投 入する命令を整理するための仮のデコードで、整理された命令は (a4) で命令バ ッファに転送されます。 ● 68060 における分岐予測 68060 の分岐予測は、命令フェッチユニット内の分岐キャッシュに基づいて行 われます。分岐キャッシュは分岐命令のアドレスとその分岐先のアドレスのペア を 256 組まで覚えることができます。分岐キャッシュに分岐先のアドレスが残 っている分岐命令を再び実行すると、命令フェッチは自動的に前回分岐した方向 に進みます。なお、命令キャッシュをフラッシュすると分岐キャッシュも同時に フラッシュされます。 分岐キャッシュがヒットした分岐命令は、命令フェッチパイプラインで処理が 完了します。68060 の分岐命令のクロック数が 0 になるのは、命令実行パイプ ラインに分岐命令が入らないことを意味しています。命令フェッチパイプライン よりも命令実行パイプラインの方が処理が重いので、分岐予測の時間は通常は前 後の命令の実行時間に隠れて見えなくなります。 ● 68060 の命令実行パイプライン 68060 の命令実行パイプラインは 6 段から成っています。 (b) FIFO から命令を取り出して種類を調べる(フルデコード) (c) 使用するデータのアドレス(実効アドレス)を計算する (d) 使用する整数データを読み出す(データフェッチ) (d') 使用する浮動小数点数データを読み出す(データフェッチ) (e) 整数演算を行う (e') 浮動小数点演算を行う (f1) 結果をまとめる (f2) 結果を書き戻す 上記の (b)(c)(d)(e) は整数ユニット、(d')(e') は浮動小数点ユニット(FPU: Floating Point Unit)の作業です。(d)(e) と (d')(e') はオーバーラップしま す。 ここで注目すべきは、68060 の整数ユニットには (b)(c)(d)(e) の 4 段の命 令実行パイプラインが 2 本あるということです。それは、メインの pOEP (primary Operand Execution Pipeline)とサブの sOEP(secondary Operand Execution Pipeline)の 2 本です。これが、68060 がスーパースカラ (Superscalar)と呼ばれるゆえんです。 ──────────────────────────────────── 本文はここまで。 次回はスーパースカラを斬りましょう。命令およびデータキャッシュ、FPU、 MMU などの解説も今後書くことになるかと思うと今から楽しみです。 ──────────────────────────────────── 質問箱 ──────────────────────────────────── 質問のハガキを募集します。060turbo や 68060 に関することならば何でも構 いません。分かる範囲でお答えします。回答が大きくなるときは本文で取り上げ ます。 ──────────────────────────────────── 68060 関連の話題 ──────────────────────────────────── 思いついたことや気になったことを何でもズルズル書いてしまおうというコー ナーです。今後何が出てくるか分からないので要チェック。 ● 060turbo における SIMM の効果 060turbo は、SIMM の有無でシステム全体の動作速度が体感で分かるくらい変 化します。理由は、専用ドライバの機能で、Human 本体、専用ドライバ本体、 IOCS ROM、DOS/IOCS ワーク、スーパーバイザスタックなどのシステム関係のメ モリ領域がほとんど SIMM 側に移り、本体側の遅いメモリをアクセスする頻度が 減るからです(SIMM を装着したときは専用ドライバにスイッチを指定すること を忘れずに)。SIMM を RAM ディスクにするだけでも、本体メモリよりも速く、 快適です。 060turbo で動作が保証されている SIMM の容量は 16MB と 32MB の 2 種類と いうことになっていますが、筆者の手元では 64MB の SIMM を装着して問題なく 動作しています。 アドレスが $00FFFFFF を超えるハイメモリでは動作しないプログラムもまだ 多く存在しますが、ハイメモリの普及率とハイメモリで動作するプログラムの数 は比例して増加することが期待できると思います。 現在の専用ドライバでは特に指定しない限り普通のプログラムは本体メモリで 動作しますが、今後、さらに SIMM の使用頻度を増やすべく、構想を暖めている ところです。 ● Motorola のホームページを覗いてみよう Motorola が 68060 の情報を公開しているホームページの URL は以下の通り です。 http://www.mot.com/SPS/HPESD/prod/0X0/frames/68060.html ここに 68060 のユーザーズマニュアルやエラッタ、そして M68060SP の純正ア ーカイブなどが掲載されています。ただし、個々のドキュメントのフォーマット が PDF なので X68k ではデコードできません。Adobe Acrobat Reader で読みま しょう。それから、言うまでもないことですが、全部英文です。 ●エラッタ 「エラった」というハナモゲラ……ではありません。れっきとした英単語です。 errata は erratum の複数形で、直訳すると「誤り」または「正誤表」です。 残念ながら、68060 には幾つかのエラッタ(バグ)があります。これだけ大規 模な集積回路でしかも出荷開始からあまり年月が経っていないので、バグが残っ ているのは仕方のないことなのでしょう。むしろ、数えるほどしか残っていない のは凄いことなのかも知れません。全部修正されるまで待っていたら時代が変わ ってしまうので、多少バグっていても使うのが王道だと考えます。 060turbo で使用している 68060 には現在、F43G と G65V という 2 種類のマ スクセット(バージョン)があります。F43G の方が古いために G65V よりもエ ラッタが 1 つ多く残っています。 ●マスクセットの見分けかた マスクセットは石の表面の右上角の 1 行目に印刷されています。また、左上 角の Motorola のロゴの右側の XC68060RC50 の最後に A という文字が付いてい れば G65V です。 プログラムでも見分けられます。PCR の bit8〜bit15 がリビジョンナンバー です。F43G は $01、G65V は $05 になっているようです。これは SCD060.X の X コマンドでも参照できます。 F43G と G65V には共通のエラッタが幾つかありますが、詳細は前述のホーム ページに掲載されているので興味のある人は参照してみて下さい(エラッタはマ ニュアルを持っていないと理解できないと思います)。故意に発生させようとし ても挙動が確認できないエラッタもありました。 ● HAS060.X F43G だけに存在するエラッタは、浮動小数点命令を含む 5 つの命令から成る 特定の命令列が条件になっています。この命令列を HAS060.X が自動的に検出し てアセンブル段階で回避するようになっています。エラッタを回避する機能は初 期の HAS060.X から存在していますが、エラッタの内容や回避方法については HAS060.X v3.09+56 以降のドキュメントを参照して下さい。 ● 060pcr5.x 68060 は、データキャッシュが有効なアドレスにロングワードのデータを書き 込んですぐに読み出すとき、リードアクセスを省略するという最適化を行います (これを store/load bypass と呼ぶようです)。ところが、この機能がキャッ シュ禁止領域にも効いてしまうことがあるというエラッタがあります。幸い、 X68030 では、書き込んですぐに読み出したデータが変化している可能性がある のは VRAM を除く I/O ポートだけで、普通はロングワードでアクセスしないの で影響はないと思われます。が、念のため、このエラッタを回避するためのツー ルを作りました。ツールと言っても、PCR の bit5 を操作するだけの簡単なもの です。 > 060pcr5 1 store/load bypass を禁止する ◎ 060pcr5 の説明 TYPE=DOC:060pcr5.doc ◎ 現在の store/load bypass の状態を表示 TYPE=CLI:060pcr5.x (EOF)