さてこのRAS機能だが、実は小規模なMCUにはかなりOverkillである。まずRegister。そもそも何か発生した場合に最初に参照するのはRFSR(RAS Fault Status Register)だが、ここは極端に言えばRecoverable errorかUnrecoverable errorかのサマリーを出す程度であって、詳細情報は別のレジスタを参照する必要がある。このレジスタが16種類あり、うち10種類のレジスタは最大で56個実装可能だ。つまり、フルセットで実装すると、レジスタが600個近く増える事になる(サイズは32bit)。

これはかなりの面積増になる筈で、Cortex-M3/4クラスのMCUでも厳しいだろう。また、例えばERRMISC0n~7n(Error Record Miscellaneous Register 0~7)は、用途は"Imprementation Defined"扱いである。要するにRAS機能を実装したいメーカーはこのレジスタを好きに使っていいよ、という話であって、具体的にどう使うかはメーカー任せである。

まぁ実際MCUの場合、プロセッサコアそのものよりも周辺回路の方が遥かに規模が大きいというケースはままある訳で、そうなると問題が発生する頻度もプロセッサコア以外の方が多い可能性がある。この部分はMCUベンダーの設計に任せてるわけだから、Armが出来る事は殆ど無いとも言える。

また先のHeliumの話に戻ると、そもそもデータキャッシュを持たないという前提でアーキテクチャを組んでいる訳で、するとData Poisoningの対象は何? という話になる(もちろんTCMがPoisonedされる可能性もあるから、まるっきり無い訳ではないが)。こうした事を考えると、このRAS機能は恐らくはCortex-M7グレードのかなり大きなMCUで、かつ自動車とか産業機器向けに高信頼性が要求される製品が主なターゲットであり、一般のMCUでは無縁という感じになりそうだ。もちろん、こうしたニーズは僅かとはいえ確実にあるのも事実で、そうした用途向けにアーキテクチャは定義した(実装はまた別の話)という事であろう。

ということで簡単ながらArm v8.1-Mの特徴をご紹介させていただいた。個人的にはLow Overhead Loopが非常にツボに入っている。実はArm、2014年のTechConで「Cortex-M7がZero overhead loopsを実現した」というスライドを公開して突っ込みを入れられまくった過去がある。

おそらくCortex-M7にはBTACが搭載されているので、分岐先アドレスがBTACにHitすれば0cycleで取得できる、という意味だったと思うのだが、もちろんLoopそのものはZero Cycle Overheadでは回せない。ただ今回のLow Overhead Loopはかなり実装的にZero Cycle Overheadに近いものがあり、従来のDSP ExtensionよりもよりDSPっぽくなっている。演算とロードの並列処理も可能になっており、HeliumとあわせてかなりDSP風の使い方が可能になってきたのは非常に興味深いところだと思う。