見出し画像

独学で考えた赤石CPUの高速化技術解説「ROMキャンセラー」編

「ROMキャンセラー」
恐らく、この名前を聞いたことのある方はいないと思います。
なぜなら、これは僕が独学で考え、名付けた技術だからです。
では、この技術がどんな高速化技術なのかを、解説していきたいと思います。
(これは、僕が独学で考えた高速化手法なので、もしかしたら表現に間違いがあるかもしれません。)
ちなみに、技術的な解説は「2.ROMキャンセラー1.0誕生」の見出しからです。

1.ROMキャンセラーが開発された理由

〜ROMというお荷物〜

ROMキャンセラーを初めて搭載したのは、僕が開発していた幅9CPUの第二世代にあたる「CREDJII」。
CREDJIIは、最低限の機能を搭載したサイズ重視の幅9CPUの第二世代として、信号強度式ROMなどを導入して更なる小型化(&ROMの大容量化)を狙った赤石CPUです。
僕がROMキャンセラーを使い始めたきっかけは、ROMの信号強度化による、ROMの遅延増加を出来る限りごまかすためでした。
CREDJII以前に僕が開発した赤石CPUの中にも、クロック周波数が変動する赤石CPUがありますが、
クロックが低下するのは時間のかかる条件分岐命令を読み出した時です。
そして、CREDJII以前の赤石CPUは、ROMから読み出した命令が条件分岐命令であるかどうかが判別するまで、次のクロックは発生させない仕組みでした。
条件分岐命令かどうか分かっていないタイミングでは、クロックを下げるべきか分からないからです。
なので、ROMから命令を読み出すように指示してから実際に読み出されるまでの遅延が大きすぎると、そこがネックになってしまい、クロック周波数を下げざるを得ない状況になってしまいます。
その対策として、僕のJEの赤石CPU「NXREDJV」では、サイズ効率が悪化しますが、その代わりにPC(プログラムカウンタ)とROM(&デコーダー)を密接に配置・配線して遅延を極力抑えた構造とし、この問題の影響を受けないようにしていました。
このように、ROMの遅延を受けやすい制御を行なっていた影響で、PCやROMの高速化が重要な課題となり、サイズなどが犠牲となっていました。
幅9CPU開発が始まる前に開発された赤石CPU(NXREDJVなど)では、サイズよりも速度重視だったため、あまり問題ではなかったのですが、その状況は幅9CPU開発が始まって、一転します。

〜いずれ回ってくるツケ〜

ROMの遅延ももろに受ける制御を引き継いだまま、初代の幅9CPUは開発されていきました。
初代幅9CPUであるCREDJIのROMは、トーチ式とは少し違いますが、性質としてはトーチ式に近いもので、またデコーダーも二進数のため高速であったり、PCも使い慣れていた二進数を採用することで、相変わらずROMを読み出すように指示されてから、実際にROMが出力するまでの時間を短縮し、代わりに回路が大型化している構造になっていました。
CREDJIは、正直に言ってしまうと興味本位で作ったという部分もあり、あまり本気で作っていないところもありました。
それに、幅9CPUは初めてで、今すでにある回路を応用していく形で開発されましたし。
なので、とりあえず幅9を達成できたというだけでも、十分満足だったのですが、その後、まだ小型化したい欲が出てきてしまい、第二世代となるCREDJIIが作られ始めました。
CREDJIIはROMやその他配線などを信号強度化することで、小型化を狙って作られたレッドストーンCPUとなります。
ただ、その信号強度化の一環により、ROMとPCが信号強度化されましたが、その影響により当然ながら遅延が増加してしまいました。
このままだと、最悪のパターンであるクロック周波数を下げざるを得ない状況になってしまいます…
小型化が重視される幅9CPUでは、NXREDJVのような誤魔化しは通用しませんでした…
ですが、この高速化技術を思いついた瞬間に、その問題が解決へと向かい始めたのです!

2.ROMキャンセラー1.0誕生

〜ROMキャンセラー1.0の仕組み〜

僕が思いついたものとは、本来はROMから命令を読み出すようPCに伝達して、ROMから実際に読み出されるまで待ち時間が発生してしまいますが、1つ前に読み出された命令は「条件分岐命令以外のクロックを落とす必要が無い命令」と仮定して、1つ前に読み出すように指示された命令が実際にROMから読み出される前に、次の命令を読み出すようにPCに指示します。
そして、1つ前に読み出された命令が条件分岐命令ではなかった場合は、そのままさらに次の命令を読み出し続けます。
ここが肝心ですが、もし1つ前に読み出された命令が条件分岐命令だった場合は、、、

なんと、その後仮でROMから読み出した命令を遮断します!!!

CREDJIIのROMの出力部分
条件分岐命令を読み出した際に、横のリピーターから信号を伝ってコンパレータを遮断する

ここが、僕がROMキャンセラーと名付けた由来です。
「ミスは許されない、慎重に一発勝負」って感じから、「何事にも挑んで、上手くいけばいいし失敗しても気にしなければいい」という制御に生まれ変わりました(ちょっと違うかも?)。

CREDJII以前の僕の赤石CPUはこんな感じ
CREDJIIはこんな感じ

まぁ、あくまでイメージです

ちなみに、ただ単にROMの出力を遮断するだけだと、PCの方では実行していない命令も実行したカウントになってしまっているので、逆方向にカウントさせることで、辻褄を合わせています。
PCは、クロックからの信号を受け取ると動作しますが、条件分岐命令だったことが判明したら、クロックの配線は何回か遮断するので、PCが+1と-1を繰り返すことはありません。
(そのための機能を、信号強度式のPCに追加する必要があったので、PCを収めるのが大変でしたが…)

こうしてみると、制御回路を中心に各回路が団結しているようにも見えますね

ちなみに、条件分岐命令ではないと仮定して読み出し始めるまでのタイミングは、ALUとレジスタ(アキュムレーター)の遅延と同じになっています。
ROMから仮の命令を読み出すこと自体は、2rt毎なども可能ですが、ALUが次の演算を行う準備が完了していないタイミングで次の命令が来てしまったら、対処出来ないからです。

ALUとレジスタ(CPUによってはアキュムレータも含め)の方の都合も考えて読み出す必要がある

〜ROMキャンセラーが与えた、今後の影響〜

実際、この方法を思いついた時、今後の赤石CPU開発に大きな影響を与えると思いました。
これまで、ROMの容量とクロック周波数は完全にトレンドオフだと思っていたものが、条件分岐以外の命令であれば、ROMの容量とクロック周波数を両立できる可能性が生まれたからです。
速度重視のNXREDJ系では、遅延の問題が発生するため、ROMの容量を命令64個分から増やすことは難しいと思っていたものが、そうではなくなってきたからです。

ROMキャンセラーを思いつくまではこうなると考えていたが、
ROMキャンセラーはその考えを覆すものだと思った

3.ROMキャンセラーの進化

〜ROMキャンセラー1.0〜

ROMキャンセラーの初代は、ROMキャンセラー1.0のCREDJII(当時は、名前はなく僕独自の高速化回路と読んでいました)になりますが、その時代のROMキャンセラー1.0は仮で読み出した命令が必要なければ遮断(遮断した分PCを逆方向にカウント)という制御でした。
そして、ROMキャンセラー1.0はCREDJIIを始め、CREDJIIIやCRED IV、そしてCRED Vへと採用されていきました。
「今後のCPU開発に、大きな影響を与えるだろう」という、このROMキャンセラーを思いついた時の僕の予想は見事に当たったわけですね。
ですが、CRED Vの次に開発されたNX RED VIで、ROMキャンセラーが少し形を変えて採用されたのです。

初めて粗粒度マルチスレッディングを赤石CPUで再現したCRED V
このCPUにも、ROMキャンセラー1.0が採用されている

〜ROMキャンセラー2.0〜

NX RED VIにも、ROMキャンセラーの技術は採用されました。
NX RED VIは、命令を16個しか保存できない幅9CPUの信号強度式ROMよりも、圧倒的に大容量な256個の命令を保存可能なROMを搭載しました。
当然、容量が増えた分配線などの遅延が大幅に増えたので、ROMキャンセラーの恩恵はより一層大きなものとなりましたが、PCの構造が変わったため、ROMキャンセラーの動きが変わったのです。

NX RED VIのPCは、構造的には4bit×2のような構造で、信号強度式です。
これまでは、PCに+1と-1の両方の機能を搭載していましたが、NX RED VIのPCは、上位4bitと下位4bitの信号強度式PCは+1のみになっています。
では、条件分岐命令を読み出した時、どのようにPCを巻き戻しているのでしょうか?

実は、NX RED VIはALUが6rt毎に演算が可能になっており、PCにも6rt毎に次の命令、次の命令…と指示されています。
それが、大遅延の信号強度式ROMと組み合わされているため、最初に読み出した命令が条件分岐命令であることが判明したときには、PCは10個先ぐらいの命令まで読み出そうとしています。
そのため、下位4bitのPCにだけ+1と-1の機能を付けて逆方向にカウントさせるより、下位4bitのPCを一周させて、上位4bitのPCの方を今の出力に-1をした値にセットし直すほうが、高速で小型に実現できるのです。
ですが、10個近くの仮で読み出した命令も、PCを一周させる時に読み出されてしまった命令も、実際に実行するわけではないので、ROMキャンセラーで遮断しています。
これが、ROMキャンセラー2.0の制御です。
NX RED VIのような、大容量ROMを搭載したCPUのために制御が変更されているというわけです。

NX RED VI(ROMキャンセラー2.0)の条件分岐命令を読み出したときのイメージ

〜ROMキャンセラー3.0(future ROMキャンセラー)〜

このROMキャンセラー3.0は、まだ実際に搭載した赤石CPUは開発していませんが、将来の赤石CPUで採用したいと考えている、未来のROMキャンセラーです。
それは、将来の赤石CPUに採用したいと考えている別の独自高速化技術への対応です。
レジスタデリート(こちらも、僕が考えた独自の高速化技術で、気が向いたら記事にするかもしれません)では、条件分岐命令を読み出しても、ROMの出力を遮断する必要が無い場合があり、
さらにROMキャッシュ(こちらも、僕が考えた独自の高速化技術で、気が向いたら記事にするかもしれません)では、必要ない命令もROMから読み出しているとも考えられる技術です。
そのため、必要ない命令は遮断する必要がありますが、それもROMキャンセラーで行います。

4.まとめ

このように、ROMキャンセラーは、幅9CPUを開発していく中で生まれた、ALUの高速化に対応しながらROMの信号強度化を両立できる、独自の高速化技術です。
そして、ROMキャンセラーは僕独自の高速化技術の中では、結構昔のものであり、CPUが高性能(ALUの高速化や、ROMの大容量化)になっていくのに合わせて、形を変えていった技術とも言えます。
しかし、条件分岐命令の場合は、ROMキャンセラーではROMの遅延をどうにかすることは出来ません。
ですが、条件分岐命令実行時の高速化も、僕は考えていきました(レジスタデリートやROMキャッシュ)。
その技術は、気が向いたら解説記事を書くかもしれません。

ちなみに、ROMキャンセラーの解説の動画を、youtubeに上げているので、
もしよければそちらもお願いします
(まぁ、内容はこの記事とほぼ一緒ですが、、)
https://youtu.be/O96Ds6h-juo

この記事が気に入ったらサポートをしてみませんか?