Pico三昧(33) ラズパイPico2:RP2350、Pico:RP2040、XIP比較

Joseph Halfmoon

前回比較したのは主記憶SRAMでした。今回は命令コードや固定データがおかれている筈のFlashです。ただしラズパイPico/Pico2の場合、FlashはQSPI接続されているので、そのままでは主記憶にはなりませぬ。その出来ないところを埋めてさもインプレースで実行できるように見せかけてくれるハードウエアがXIPです。

※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。

※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。

Pico-series Microcontrollers

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ですが、それなりにいろいろ考えられておると。

Pico三昧(32) ラズパイPico2:RP2350、Pico:RP2040、SRAM比較 へ戻る

Pico三昧(34) ラズパイPico2:RP2350、Pico:RP2040、SIO比較 へ進む