AVR32UC3BのHMATRIX(まとめ)

AVR32UC3BのHSB Bus Matrix(HMATRIX)(Rev: 2.3.0.1)についてまとめる。以下も参照のこと。



マスターのメモリ・マッピングについてはよく解らない。
「9.2 Physical Memory Map」で「メモリは再マップ出来ない」といいながら、HMATRIXのMRCRレジスタでマップ可能。そのマップ方法がどこにも説明されていない(見落としているのかな?)。
メモリ・マッピングデコーダらしいが、その設定レジスタであるMRCRをどう使用すればマッピングが実現できるのかどこにも記述が無い。
一応、AVR32 UC3 Software Frameworkの中を探すと、MRCRレジスタは定義されているのだけれど、MRCRレジスタの使い方に関するヒントは得られなかった。ドライバはヘッダファイルのみで、そこで宣言されている関数は見つからなかった。

スレーブには以下の機能がある。この機能は個別に動作する。

  • ラウンド・ロビン/固定優先度による調停(スレーブが空いたとき次にアクセスするマスターの選択規則)
  • 無し/最終アクセス/固定によるデフォルト・マスターの選択(次にアクセスするマスターがデフォルトだとバースト・アクセス先頭で待ちサイクルが0(その他は1))



ラウンド・ロビン/固定優先度の設定は、レジスタSCFGのフィールドARBT(bit24)で選択される。

  • 0: ラウンド・ロビン調停(初期値)
  • 1: 固定優先度調停



固定優先度の指定はPRAS0〜15とPRBS0〜15で指定する。
レジスタ名について、PRASとPRBSに続く番号はスレーブ番号、3文字目のA/Bはマスター番号0〜7(A)と8〜15(B)の区分けである。各レジスタは32bitで、優先度0〜15を指定するため4bitずつ区分けすると8個しか確保できないのでA/B2つのレジスタが必要になる。4bitの区分けにはA/B合わせてM0PR〜M15PRのフィールド名が付いている。
一般形で記述すると以下のようになる。

レジスタ名="PR"+"AB"[マスター番号/8]+スレーブ番号
フィールド名="M"[マスター番号]+"PR"
ビット・フィールド範囲=(マスター番号%8*4+3)〜(マスター番号%8*4)

当然だが、マスターもスレーブも存在しない番号は設定する必要はない。



デフォルト・バス・マスターは、これから要求を受けるマスターと一致したとき、バースト先頭で1サイクル待つ必要が無い。一方、不一致の場合はバースト先頭で1サイクル待たされる。
この待ち時間はマスターとスレーブの接続に必要な時間であり、それが不要ということは、通信していないときデフォルト・マスターとスレーブが接続されっぱなしで、あるいは他のマスターと通信し終えると直ちにデフォルト・マスターと接続していることになる。従って高速通信が期待できるものの消費電力的にはデメリットである。
デフォルト・バス・マスターは、使用しないスレーブでは当然「無し」に設定すべきである。またアクセス頻度が低い場合も同様である。
最終アクセスのデフォルト・バス・マスターを選択すると、頻繁にアクセスするマスターが1つのとき転送効率が向上する可能性がある。SRAMに設定すると良いと思われる。
固定デフォルト・バス・マスターを選択すると、頻繁にアクセスするマスターが複数あるとき、もっともアクセス頻度の高いマスターをデフォルトに固定することで、転送効率が向上する可能性がある。
頻繁にアクセスする複数マスターがあるとき、デフォルト・バス・マスターに最終アクセス/固定のいずれかを選択するか迷うところであるが、連続バースト数などの関係もあり、設定を変更してベンチ・マークを取ってみるしかないだろう。
デフォルト・バス・マスターは、レジスタSCFG0〜15(インデックスはスレーブ番号)で選択可能である。フィールドDEFMSTR_TYPEに以下の値を設定する。

  • 0: デフォルト・バス・マスター無し(初期値)
  • 1: 最終デフォルト・マスター
  • 2: 固定デフォルト・マスター

固定デフォルト・マスターを選択したとき、対象マスター番号を同じレジスタSCFG0〜15のフィールドFIXED_DEFMSTRに設定すること。



以下のタイミングで調停が実施される可能性がある。

  1. アイドル・サイクル:スレーブがどのマスターにも接続されていないとき、あるいはスレーブがデフォルト・バス・マスターに接続されているだけ(転送していない)のとき。
  2. シングル・サイクル:スレーブが現在シングル・アクセスされているとき。
  3. バースト最終サイクル:現在のサイクルがバースト転送の最終サイクルであるとき:定義された長さのバーストに対して、予測されたバースト末尾は転送サイズに合致するが、しかし未定義長のバーストに対してバースト末尾は別に管理されている。
  4. スロット・サイクル限界:スロット・サイクル・カウンタが限界値に到達したとき(現在のマスター・アクセスが長すぎて中断されなければならない)。

調停方式は先に説明した通り、ラウンド・ロビン/固定優先度のいずれかである。
調停が済むと、対象マスターがスレーブにアクセスを開始する。連続アクセスが長いと問題になることがあるため、2通りの規則により再度調停を実施する。
1つはバースト数による制限(ULB: Undefined Length Burst)で、もう1つはアクセス・サイクル数による制限(Slot Cycle Limit)である。
それぞれには、アクセス数とクロック・サイクル数という物差しの違いの他、ULBがマスター側の設定/Slot Cycle Limitがスレーブ側の設定という点が異なる。
HMATRIXのレジスタ構成を見る限り、ULBとSlot Cycle Limitは常に有効であり、一方あるいは双方を無効に出来ない。



ネーミングに難があるが、ULBはマスター毎に規定バースト・アクセス数を越えたとき再調停する。規定バースト・アクセス数には制限無し(0, Infinite)、1(1)、4(2, 初期値)、8(3)、16(4)の5つがある。この値はMCFG0〜15のフィールドULBTにカッコ内の数値を指定する。レジスタ名末尾の番号はマスター番号である。
ドキュメントでは、制限無し(Infinite)を指定すると、そのマスターのバースト・アクセスは中断されないと記述されているが、実際にはSlot Cycle Limit(後述)の再調停があるので文字通りの"Infinite"ではない。

Slot Cycle Limitは、アクセスが規定クロック・サイクル連続するとき再調停する。HMATRIXに供給されるクロックはCPUと同じSynchronous clocksである。レジスタSCFG0〜15のフィールドSLOT_CYCLEで指定する。レジスタ名末尾の番号はスレーブ番号である。初期値は0x10であり、再調停が頻発しないよう小さすぎる値を設定すべきではない。適正値として初期値と同じ0x10(16)がドキュメントで紹介されている。

以下はAT32UC3B0/1シリーズのHMATRIXの仕様である。
High Speed Busマスター

Master 0 CPU DATA
Master 1 CPU Instruction
Master 2 CPU SAB(訳注:NEXUS(OCD)のこと)
Master 3 PDCA
Master 4 USBB DMA

High Speed Busスレーブ

Slave 0 Internal Flash
Slave 1 HSB-PB Bridge 0
Slave 2 HSB-PB Bridge 1
Slave 3 Internal SRAM
Slave 4 USBB DPRAM



HMatrix Master / Slave Connections
HMATRIX SLAVES
Internal FlashHSB-PB
Bridge 0
HSB-PB
Bridge 1
Internal SRAMUSBB DPRAM
01234
HMATRIX MASTERSCPU Data0
CPU Instruction1
CPU SAB2
PDCA3
USBB DMA4

  • ○はマスターとスレーブの接続が可能な組み合わせを表すと思われる。
  • CPUは内蔵SRAMへは直接アクセス可能なため、CPU DataはInternal SRAMへの接続は無い。
  • 内蔵FlushROMとSRAMからだけ命令フェッチするので、CPU Instructionはそれら以外に接続できない。
  • デバッグで全情報にアクセスするため、CPU SABは全スレーブに接続可能である。
  • HSB-PB Bridge 1(BRIDGE B)はUSBとFlashROM制御のみなので、PDCAは接続しない。またUSBB DPRAMにも接続しない。従ってUSBと通信系の周辺モジュール間でデータを垂れ流すことも出来ない。
  • USBB DMAとUSBB DPRAMが接続できないのは、DP(Dual Port)RAMの一方のポートがUSBB DMAと接続していているため、他方においてHMatrix経由接続が不要だと推察される。



<<その他、感想>>

  • 結局、HMATRIXの設定はデフォルトのままでも問題なく動作する。
  • その一方で、HMATRIXは単一バス・システムに比べ高速化の可能性があり、性能を引き出すためには調整が必要かもしれない。最適な設定はアプリケーション毎に異なるはずで、実アプリケーションによるベンチ・マークが必要となる。これがHMATRIXの最大の欠点かもしれない。
  • 内蔵SRAMは各マスターからアクセスされるので配慮が必要である。またCPUとHMATRIXが同一クロック動作で、ほとんどのCPU命令が1cycleで完了するため、他のマスターが接続し続けると、ソフト処理性能が極端に悪化するはずである。
    • 製品版なら、コードをFlushROMへ配置すること。コードをSRAMに配置したとき、SRAMデータへアクセスする1サイクル命令は3サイクルで実行される(Instructionマスターで1つ、Dataマスターで1つ、どちらかがデフォルト・マスターでないため1つ遅延)。以下は私が考えた方針であり、性能が出せる保証はない。
  • 転送レートが高いUSBB DMAが連続アクセスするなら、SRAMのデフォルト・マスターは固定デフォルト・マスターに、PDCAによる単発アクセスが多いなら、SRAMのデフォルト・マスターはデフォルト・バス・マスター無しにする(わざわざ接続し続ける必要なし)。ただし、開発中にSRAMへコードを配置するなら最終アクセス・マスターを選択すべきかもしれない。
  • FlushROMはほぼ1サイクル毎にCPU Instructionマスターがアクセスするので、ほぼ固定デフォルト・バス・マスターでよい。ただし、USBパケットの固定送信データをFlushROMに格納→USBB DMAで送信するなら、USBB DMAマスターのULBを転送データに合うよう調整すべきである。
  • 初期化を除けば、PDCAマスターやHSB-PBブリッジ・スレーブはほぼ単発なのでデフォルト・バス・マスターに設定する必要はない。またULBやSlot Cycle Limitの制限を緩やかにする必要もない。