前回比較したのは主記憶SRAMでした。今回は命令コードや固定データがおかれている筈のFlashです。ただしラズパイPico/Pico2の場合、FlashはQSPI接続されているので、そのままでは主記憶にはなりませぬ。その出来ないところを埋めてさもインプレースで実行できるように見せかけてくれるハードウエアがXIPです。
※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。
※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。
XIP、eXecute-In-Place
Pico、Pico2のFlashインタフェースはQSPI(4本=クワッドのデータ信号線でインタフェースをとる同期式シリアル)です。QSPIは速いとは言え、1ワード32ビットを読み取るのに8回の転送が必要です。これをそのままプロセッサ・コアのフェッチに見せてしまうと恐ろしく遅くなってしまうので、XIPと呼ぶハードウエアが仲立ちをして速度のミスマッチを埋めておるわけであります。
XIPの大きな要素は「キャッシュ」です。Pico、Pico2ともマルチコアのシステムなので、キャッシュというとコヒーレンシーの制御などが直ぐに頭に浮かぶのです。しかしXIPは「通常動作時、読み出しオンリの動作をする」Flashとの仲立ちをしているので、面倒なコヒーレンシー制御など必要ないみたいです。唯一、書き込み操作が必要になるのはFlashプログラミング時ですが、これはまた別な話。プログラミング後はキャッシュはフラッシュしてしまえばよろしかろうと。知らんけど。
キャッシュとしてみた場合、PicoのRP2040もPico2のRP2350もサイズ、構成ともよく似てます。
16kB、two-way set-accociative
なんだ同じじゃんと思うと、バス(クロスバ)とのインタフェースに改良点がありました。
-
- RP2040はクロスバに対して直結は1ポートのみ
- RP2350はクロスバに対して直結2ポート
RP2350は16kBのキャッシュを奇数ライン8kB、偶数ライン8kBにわけており別々のポートでクロスバ接続しています。これにより、フェッチするライン(1ラインは8バイト)の偶数、奇数を分けて、2個のコアに同時に命令を供給することも可能じゃないかと思います。偶奇がぶつかって一方が待たされた場合、自然と偶数、奇数にタイミングがズレるとも想像できます。2コアでもフェッチを停めないための工夫でしょう。
RP2040は、クロスバ直結のポートとは別に、Streaming FIFOとよぶ構造経由の経路も持ってました。こちらはDMAなどがデータをFlashから読み出すための経路のようです。Read Onlyね。FIFOが挟まっているのでキャッシュとは別だてでダラダラとデータを転送できるもの。RP2350をみると同様な回路が含まれているようなのでここは一緒か。
アドレスマップを見ると分かる違い
アドレスマップを見ると2機種のXIPの相違点が明らかになるようです。
Address | RP2040 | RP2350 |
---|---|---|
0x10000000-0x10FFFFFF | Cacheable, Normal | Cacheable, Normal, CS0 |
0x11000000-0x11FFFFFF | Cacheable, non-alloc | Cacheable, Normal, CS1 |
0x12000000-0x12FFFFFF | non-cacheable, update | |
0x13000000-0x13FFFFFF | non-cacheable, bypass | |
0x14000000-0x14FFFFFF | NOCACHE_NOALLOC | |
0x15000000-0x15FFFFFF | cache as SRAM | cache as SRAM |
0x18000000-0x18FFFFFF | MAINTENANCE_BASE | |
0x1C000000-0x1CFFFFFF | NOTRANSLATE |
どちらも基本16MBづつのバンクで制御していることは共通です。ただし、RP2040は下24ビットで16MBのバンク内アドレスをポイントし、上8ビットでミラー(エイリアス)を制御してアクセスの意味の違いを出してます。一方、RP2350は、下26ビットで64MBの大きな塊内のアドレスを指定し、上6ビットでミラー(エイリアス)を制御してます。
RP2350では、64MBの大きな塊をさらに16MBのバンク4個にわけ、
-
- 最下位のバンクはCS0のFlash(ボードに搭載されている)
- 次のバンクはCS1のFlashまたはPSRAM(Pico2では未搭載)
- その後の2バンクはリザーブ
という考え方のようです。過去回でRP2350のQSPIインタフェースにはGPIOを一本つぶしてCS1にできることを見てますが、これを使えばもう1個メモリを追加できるようになってます。
そのためもあって、ミラー(エイリアス)で制御するキャッシュ制御は上記のように異なってます。よってRP2040でこのような機能を使っている場合は変更が必要じゃないかとおもいます。
またキャッシュ制御については、RP2350の方が「洗練」されていて、メンテナンス用のアドレスを経由するとキャッシュライン毎にクリアしたりセットしたり、ピンニングしたりといろいろできるようです。面白そうなので後で実験してみるかね。時間があったらね。
プログラマからすると空気のような存在にも見えるXIPですが、それなりにいろいろ考えられておると。