Cmod A7ボード(FPGA)を使って開発しているオリジナル32ビットCPUコアNihoniumの実装方式として、パイプライン方式を採用してみたいと思います。
本HPに於けるオリジナルCPUコアの始まりは、オリジナル16ビットCPUコアMoscoviumでした。まずは、現行Moscoviumシリーズの実装方式からおさらいしてみましょう。
「実装方式」とは?
RISC(Reduced Instruction Set Computer)とか、汎用レジスタマシンとか、ハーバード型とかいう、アーキテクチャ(設計思想)とは異なり、あるCPUコアを実現するための、より実践的な方法の事を意味します。アーキテクチャと実装は基本的に別物なので、どんなアーキテクチャであっても、どんな実装方式でも適用可能です
Moscoviumコアは様々な実装方式の中から、ステートマシン方式(以下図およびリンク参照)を使って実装しています。

上図のCTLブロックが、ステートマシン(有限状態機械、Finite State Machine)です。ステートマシンが、フェッチした命令コードを復号して、全体の動作を制御しています。
最初に設計した時、恥ずかしながらMoscoviumの動作を「2段パイプライン」とか言って見たのですが、2段なんてパイプラインとは呼び難いのです……。下図に示すパイプライン実行図で検証してみましょう。

上図の通り、上下に2つ重なっているタスク(例えば赤枠)の、一方は必ず命令フェッチ(IF)サイクルです。2段パイプラインと言うより、1段プリフェッチ付きステートマシン方式と言った方が、実態を良く言い表しているでしょう。
では、どんな状態だったらパイプラインと呼べるでしょうか?
パイプライン方式とは:
と、言う事でどうでしょうか?
教科書などでよく見かける5段パイプラインの概念図を以下図に示します。

上図の例では、命令フェッチ(IFステージ)、命令デコード(IDステージ)、命令実行(EXステージ)、メモリアクセス(MAステージ)、書き戻し(WBステージ、ライトバック)の、5段に分割しています。
この他、レジスタファイルからのデータ読み出しも、そこそこ重たい論理(巨大なセレクタ)なので、レジスタ読み出し(RDステージ)を追加したり等々、様々な構成が存在します。
5段パイプラインで効率的に実装可能な命令の例を以下に示して解説します。
例)レジスタオフセット付きレジスタ間接アドレッシングモード
アドレッシングモードは、アーキテクチャに分類されます。特に、命令セットアーキテクチャ(ISA;Instruction Set Architecture)と呼ばれます。
上例の様にパイプライン方式で実装する場合、最適なステージ分割はアーキテクチャに依存します。付け加えると、最適なパイプラインの段数も、アーキテクチャに依存するのです。
筆者手持ちのARM教科書(「ARMプロセッサ」、CQ出版)では、IF/ID/EXの、3段パイプラインによる実装例が示されていました。でも、ARMって、結構複雑なアドレッシングモードを持っているのに、たったの3段で実装できるのでしょうか?
と思って読み返してみると、ARM🦾の教科書では、複雑な命令を処理するためにEXステージの中で複数サイクルをかけて命令を実行して行きます。
EXが複数サイクルで処理中、他のステージ(IF/ID)は待たされています。この様な待機状態の事をストール(stall)と呼びます。パイプライン方式の場合、なるべく資源が競合しないステージに分割して同時実行する事で、パフォーマンスを上げようとします。
ストールすると、同時実行していた他のステージが待たされることでパフォーマンスの低下を招いてしまいます。
これでは、ステートマシン方式と大差ありません。
最初に述べた通り、アーキテクチャと実装方式は別な概念ですから、どんなアーキテクチャであっても、どんな実装方式でも実装することができます。
ただ、アーキテクチャに対して最適なステージに分割しないと、パフォーマンスの低下や実装効率の低下を招く、と言う事が解りました。アーキテクチャと実装方式は別な物だけど、互いに関係しているので、最適な実装方式を選択する事は極めて重要な課題なのです。
ちなみに、教科書としてはヘネパタ/パタヘネの方がお勧めです。ヘネシー博士とパターソン博士の共著なのですが、筆頭が入れ替わった2種類の教科書が存在しています。書籍名も網羅範囲も異なるので、内容を確かめて、ご自身の用途に合った方を購入してください。こちらの教科書が題材とするCPUは、MIPSアーキテクチャです。
※筆者の学生時代、MIPSのWS(Work Station)は高価で手が出なかった憧れ(高嶺の花)だったので、ARMなんかとは思い入れが違うのです。
RISCだと言い張りながら、明らかに複雑なアドレッシングモードを持ち、「CISC(Complexed Instruction Set Computer)だろ!」とツッコミたくなるARMと異なり、Nihoniumの命令セットアーキテクチャは簡素で、RISCと呼ぶに相応しいです。
前の節で例示した「レジスタオフセット付きレジスタ間接アドレッシングモード」の様に複雑なアドレッシングモードはありません!
イヤ、ありましたね……。ははっ(アセ)。
上の命令を含み、数命令でしか採用していないので、一旦忘れてしまいましょう、うんうん(1^^;)。
すると、Nihoniumの命令セットは非常に簡素で、普通に演算する命令や、
普通にメモリアクセスする命令があるだけです。
複雑なアドレッシングモードは(ほとんど)ありません。
※丸括弧付の「(ほとんど)」は、先に例示したldwsp命令などの例外を示す。
Nihoniumの命令セットをパイプラインのステージに分割して見ると、以下の様になります。
| 演算命令: | IF | ID | EX | − | − |
| メモリアクセス命令: | IF | ID | − | MA | WB |
| ↓ | |||||
| 5段パイプライン?? | IF | ID | EX | MA | WB |
演算命令とメモリアクセス命令の実現に必要なステージのORを取ると、IF/ID/EX/MA/WBの、5段パイプライン方式ですね。しかし、こちらで例示した様な、複雑なアドレッシングモードを持たないにもかかわらず、5段パイプラインを実装するのは無駄に思えます。
Nihoniumの命令をよくよく眺めてみると、EXステージとMAステージを共に必要とする命令は(ほとんど)無いためです。このまま暫く読み進めていただくとご理解いただけるのですが、パイプラインの段数を増やすのは良い事ばかりではありません。悪い事も付随してくるので、よくよく考えて決定しなくてはなりません。
そこで、EXとMAを縮退して新たにEAステージに統合すると、以下の様な4段パイプラインとなりました。
| 4段パイプライン: | IF | ID | EA | WB |
以降、EAステージの動作内容を明確に示すため、EXステージ(演算)/MAステージ(メモリアクセス)と言う表現で使い分ける場合があります。
また、パイプライン実行図を使って動作解説する事になるので、凡例を以下に示しておきます。
| 凡例 | 説明 |
| IF |
各ステージIF/ID/EA/WBの実行状態。 ただしEAは、動作状態を明示するため、 EX(演算)/MA(メモリアクセス)と記す場合がある。 |
| ID | |
| EA/EX/MA | |
| WB | |
| IF_ | ストールしたステージ。 |
| ID’ |
IFが投入したIDと異なり、EAが乗っ取ったステージ。 フェッチしたデータを破棄する場合等に乗っ取りが起きる。 |
今回は、基本的な方針を決定して終了です。次回以降、4段パイプライン方式で設計を進めて行きます。


