Cmod A7ボード(FPGA)を使って開発しているオリジナル32ビットCPUコアNihoniumの実装方式として、パイプライン方式を採用してみたいと思います。
前回までに粗方、必要な検討を済ませることができました。いよいよ、全体を組み上げてみたいと思います。
パイプライン方式って、複数のステージを同時に実行するために様々な資源競合を解決しなくてはならず、もっと複雑な処置が必要な印象がありました。実際、レジスタフォワーディングとか、キャッシングとか、レジスタファイルの逆相クロック書き込みとか、パイプライン実現に伴う技術は腐るほど転がっています。
ここまでの検討内容を振り返ってみると、今回は、その様な高度な技術を使わずに資源競合を回避できてしまいました。色々と性能向上できる可能性を排斥して、簡素かつ簡易に実装できる方法を選択しまくった性もありますが、恐らく、Nihoniumの簡素な命令セットアーキテクチャ(ISA;Instruction Set Architecture)と、4段と言う、これまた簡素なパイプライン方式の賜物であろうと思われます。
簡素に考えて簡易に実装したら、パイプライン方式も容易な実装方式なのですね。
実際、先に挙げた様々な技術は、パイプライン方式の実行効率(≒サイクル性能)を少しでも上げようと、後付けで発案されてきた技術です。それはそれで、一歩でも前に進もうとする先人たちの弛まぬ努力に脱帽な件です。
さて、パイプライン方式を採用したNihoniumを、Nihonium-PI(Pipeline)と呼称する事とします。以下図にブロック図を示し、解説を続けます。

ブロック図解説:
レジスタファイルRGFと算術論理演算ユニットALUをNihoniumから流用したので、開発工数を大幅に削減できました。新しいCPUを1個起こす(作り上げる)なんて大仕事ですから、毎回0から作り直していたら体がいくつあっても足りません。
Nihoniumと同じです(以下マニュアル等のリンクを参照)。
「Moscovium命令セットマニュアル」: 16ビットモード(Sr[NH]ビット=0)
「Nihonium命令セットマニュアル」: 32ビットモード(Sr[NH]ビット=1)
プログラマモデル:
![]() |
|
|
↑ 32ビットモード (Sr[NH]ビット=1) |
![]() |
|
16ビットモード → (Sr[NH]ビット=0) |
|
実装方式としてパイプライン方式を採用しただけで、アーキテクチャは変わりないので当然ですね。但し、一部変更点は存在します。
例としては、分岐命令の分岐成立時実行サイクル数が2サイクル→3サイクル等、実行サイクル数の変化です。
あるいは、WBステージでのレジスタ書き込みと、EAステージでのレジスタ読み出しの競合が発生した場合と、発生しなかった場合で、実行サイクル数が変わる命令があります。
いずれも、検討済みで、変化を許容する決断⚖️をして、此処へ到達しています。
1つ困る事があるとすれば、CPUコアの判定です。
今までのCPUコアでは、状態レジスタsrの設定ビット有無を使って、CPUコアをソフトウェア的に同定可能でした。少し状況が変わって来たのは、Moscovium-BSコア辺りから設定ビットの有無だけではCPUコアを同定できなくなっていました。
そこで、Nihonium-PIも含めてCPUコアを同定できるよう、新規のiden命令を追加しておきました。
iden命令を実行すると汎用レジスタr0(固定)に、コアを示す識別符号(16ビット符号無整数)が転送されます。コア識別符号は、IDREGユニットのidrgcodeレジスタから読み出せる値と同じ値です。16ビット長と、充分な情報量があるので、将来コア種が増加しても困る事は無いと思われます。また現時点では、上位8ビットが0x11固定なので、下位8ビットだけでコア種を同定できます。
以下に、iden命令を使ったCPUコアの識別サンプルプログラムをリンクしておきます。
CPUコア種識別サンプルプログラム: mcoc_cpu_iden.asm
※従来のCPUコア種識別サンプルプログラムでは、NihoniumとNihonium-PIの識別ができず、同じコアだと判定されます。
CPUに着目した評価を実施したいため、I/Oユニットなどについては最小構成のNPOC113MN0408を作成して見ました(型名ルールは、こちら)。
Cmod A7ボード等、XilinxのFPGAに書き込むのに必要な、Moscoviumマイコンの設計データ(Vivadoのプロジェクトファイル一式を含む)はGitHubで提供しています。以下バナーよりアクセスしてください。

デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。
NPOC113MN0408マイコンのコンパイル(論理合成・配置配線)結果を以下に示します。
コンパイル結果:
CPU単体で、サブブロック毎の論理規模を確認してみました。以下表をご覧ください。
| LUT数比較 | Nihonium | Nihonium-PI | 増加分 | Memo | |
| CPU | 3,527 | 4,254 | +727 | 約20.6%増加 | |
| FCH | 1,639 | − | − | ||
| CTL | 10 | − | − | ||
| MEM | 24 | − | − | ||
| IF | − | 0 | − | ||
| ID | − | 82 | − | ||
| EA | − | 1,422 | − | ||
| WB | − | 280 | − | ||
| ALU | 476 | 531 | +55 | RTLを完全流用 | |
| RGF | 1,341 | 1,932 | +591 | WBからの書き込みパス追加 | |
CPU全体としては、ステートマシン方式で実装したNihoniumに対して、パイプライン方式で実装したNihonium-PIは、727LUT(約+20.6%)の論理規模増加を確認しました。
ブロック分割が異なるので単純比較できませんが、共通して使用しているブロックについて見てみると、レジスタファイルRGFは、WBステージからの書き込みパスが1本追加となった分、回路規模が増大しているはずです。
算術論理演算ユニットALUは、RTLレベルで完全流用したので、実効的なサイズは変わらないはずです。上表では、多少の差分が出ていますが、RGFへの書き込みパスの一部がALU勘定に割り振られた結果だと考えることができます。
そう考えると、パイプライン方式へ変更した費用としては、レジスタファイルRGFへの書き込みパス追加に伴う約+20.6%程度の論理規模増大で説明が付きます。
RGFへの書き込みパスは、EXステージからのCバスとWBステージからのDバスを条件に従って選択する、2 to 1セレクタです。レジスタの総ビット数約600ビットを考え合わせると、約+650LUTの増加分は、少々大きすぎる印象は、あります。
しかし、これ以外の増加要因に心当たりが無いため、書き込みパスの追加分であろうと考えられます。増加分には、2 to 1セレクタに加えて書き込みレジスタを確定するためのデコーダ論理なども含まれますので、妥当なのかもしれません。
パイプライン方式で実装したNihonium-PIが組み上がりました。次回、シミュレーションで動作検証を実施して、完成させたいと思います。


