オリジナル16ビットCPUコアMoscoviumのスケールダウンに取り組みます。
FPGAボード(Sipeed Lichee Tang Primer)を使って設計しているMoscoviumシリーズマイコンでは、これまでに、性能の向上を目指して、32ビット化やスーパスケイラ化、デュアルコア化を進めてきました。性能を向上しようとする試みは全て、論理規模の増大を招いてきました。
今回はその流れに逆行して、現在使用しているFPGAボードより論理規模の小さいFPGAにも搭載可能なことを目標に、論理規模の縮小を目指します。
その名の通り、Fab(工場🏭)ではなく、Field(現場)で、Programmable(プログラム可能)な、Gate Array(ゲートアレイLSI)の事をFPGAと呼びます。
普通、工場を動かしてLSIを製造しようとすると、論理設計が終わった後で最低でも、レイアウト設計に1か月以上、フォトマスクの作成に1か月以上、試作に1か月以上は掛かります。実物のLSIを手にしてデバッグを開始するまでに3か月以上かかるため、その間にシミュレーションなどの後追い検証でバグが見つかることは既定路線(?)です(1^−^;)。
FPGAを使うと、レイアウト設計は長くても10数分で終わりますし(TD IDEのコンパイル時間)、FPGAへの書き込みは数10秒です。すぐに実物を使ってデバッグを開始できるのですから、3か月以上も待つ必要は無いのです。ただ、FPGAチップは高価だし、集積可能な論理規模に限りがあるため、試作・デバッグには重宝するのですが、量産には向かないという欠点があります。
※電源を投入する度に、外付けシリアルFlashメモリなどからコンフィギュレーションし直さないとならないのも、コンシューマ向け製品の量産に向かない理由の一つとなります。
さて、FPGAに集積可能な論理規模ですが、FPGAメーカによって指標がまちまちです。
更に、メーカによって論理合成ツールや配置配線ツールなどの性能が異なるので、これも一様に比較できない要因の一つとなります。
本HPで購入して使って来たFPGAボード(Sipeed Lichee Tang Primer)は、3,300円程の安価でありながら、USB接続で書き込みできて、19k[LUT]も搭載可能な、費用対効果の大きいFPGAボードです。
FPGAボードによっては、ボード本体の他に別途、書き込みツールを購入しないとならない物もあります。
それに、この論理規模(〜19k[LUT])だと、普通は、もっと高価なボードと、なります。
※Sipeed Lichee Tang Primerに使われているFPGAチップはAnlogic社と言う中華企業で、ツールのライセンスなど、サポートに不安(←必読)が残ります。安いけど、好んで使いたいとは思いません。
LSIのデバッグ用として何10人かの設計チーム内で複数使いたい場合でも、試作用として数100個のサンプルをβ顧客に配布したい場合でも、安くて小さいFPGAに搭載したいニーズはあります。少しでも小さいFPGAボードに載せられる様に、CPUコアを小さくする意義はあります。
Moscoviumは16ビットCPUなので、単純に8ビットCPUへとスケールダウンしたら、論理規模が半分くらいにならないだろうか?まず、この目標からスタートします。
新しい8ビットCPUコアは、Moscovium → Nihoniumへ発展させた時みたいに、命令コードレベルで互換とします。その他、以下の通り、周辺環境の使い回しが可能な仕様を保つこととします。
新しい8ビットCPUコアをTennessineと命名します。Tennessineの名前の由来はこちらのリンクをご確認ください。
それでは早速、8ビットCPUコアの設計を進めて行きましょう。
まず、プログラマモデル(レジスタセット)の検討から始めます。Moscoviumでは、8本の汎用レジスタと、4組の汎用レジスタバンクを切り替えて、合計すると8レジスタ×4バンク=32個の16ビット汎用レジスタを持っていました。
Tennessineは8ビットCPUなので、汎用レジスタも8ビット幅ですが、一部16ビットデータのハンドリングを念頭にすることと、総レジスタ数を削減できるようにアイディアを絞って行きます。
下図に、検討した結果のプログラマモデルを示します。
なお、メモリアクセス命令等では、単に「Rn」と表記された場面で、暗黙のレジスタペアQn:Rnが使用されます。
例)ldw r0,[r1]
Moscoviumと命令コードレベル互換の16ビット固定長命令を採用します。命令コードはMoscovium互換のサブセットとなります。ここでも、細々と、機能(不要な命令)を削って論理規模の削減を狙っていきます。
一番重要なのはメモリアクセス命令で、16ビットデータのハンドリングを可能にしたことです。
今まで作成してきた、UARTなどのI/Oユニットや、ROM/RAM等のメモリにアクセスするためには、16ビットアクセスできることが必須条件だからです。これを可能にしておかないと、周辺I/Oユニットが、ことごとく流用不可となって、全て「作り直し」と、いう悪夢を見ることになります。
メモリアクセス命令における16ビットデータハンドリングの例は、前節で示しました。
16ビットデータハンドリングに関連して、重要な意味を持ってくる命令がcendw命令です。
16ビットデータをハンドリングする時、暗黙のレジスタペアQn:Rnを使います。Qnを裏レジスタと呼んで、演算命令などの引数として直接指定できないことについては、プログラマモデル節で解説しておきました。
裏レジスタのデータにアクセスするために使用するのがcendw命令です。
Moscoviumにも存在するcendw命令は、16ビットレジスタのエンディアンを変換する命令です。
Tennessineのcendw命令は、裏レジスタを使ったレジスタペアQn:Rnのエンディアンを変換する命令となります。結果として、QnとRnの中身(データ)が入れ替わります。即ち、上位バイト(裏レジスタ)のデータを演算に使いたくなったら、cendw命令を使って、表と裏レジスタを入れ替えながら、上位/下位データを演算に使用することができるのです。
Qn’[7:0]:Rn’[7:0]={Rn[7:0],Qn[7:0]}
以下に、完成したTennessine命令セットマニュアルへのリンクを張っておきます。
オリジナル8ビットCPUコアTennessine命令セットマニュアル
ここで、ROM効率に関する議論をしておきます。例として、以下の様な簡単な処理を実行するプログラムを挙げます。
例)16ビットデータ(レジスタペアq0:r0)の+2インクリメント
上例の様に、汎用レジスタ数が8個と少ないTennessineでは、cendw命令を多用して裏レジスタを使った16ビット演算や処理を実行することになります。結果として、Moscoviumに比べてROM効率は低下します。同じ処理を実行するのに、より大きな命令ROMが必要となるのです。
16ビット → 8ビット化することによってCPUコア自体が小さくなっても、副作用としてROM容量は大きくなる方向です。これで、「より小さいFPGAに載せたい」と言う目的は、果たせるのかな??
普通、FPGAにはメモリセルがハードマクロとして搭載されていて、論理セル(LUT)よりは集積度が高いはずなので、論理セル(LUT)を削減して、代わりにメモリセルが増大する方向なら正しいと考えられます。
うん。方向性としては間違っていないはず。
同じ処理をするのに命令数が増えるという事は、同時に処理速度も低下しています。先ほどの例では、Moscovium=1命令(1サイクル)実行に対してTennessine=4命令(4サイクル)実行ですので、4倍の時間がかかってしまいます。
16ビット → 8ビットとした時点で、処理能力が低下するのは当然なので許容します。あくまで主目的は論理規模の縮小 → 小さなFPGAに搭載できること、です。性能の向上は、既にMoscovium → Nihoniumなどで実施済みですので、ここでは議論しません。
※「折角作った裏レジスタQnと、暗黙のレジスタペア(Qn:Rn)なのだから、16ビット演算できるようにしておけば良いのに」、な〜んて、思ってしまうと、結局ただの16ビットCPUになってしまうでしょ?本末転倒になってしまいますから〜、残念。
ブロック図レベルでは、現存のMoscovium(下図左),Nihonium(下図右)と、ほぼ同じとなります。
MoscoviumもNihoniumも、同じアーキテクチャなので、この程度のブロック図レベルでは、ほぼ一緒なのでした……。一応、Tennessineのブロック図も描いてみましたが、一時レジスタtrが無くなっているので、RGF→MEMブロックへ出力しているtr信号が無くなるとか、その程度の事なのでした。
以下に、各ブロック毎のポイントを挙げて解説します。
ブロック図レベルでの、Tennessineのポイント:
基本設計が終わりましたので、ここで切って、次回、シミュレーション検証と、FPGAボードを使った実機検証に進めたいと思います。