ECCメモリの有効化
宇宙線や放射線等によるメモリのソフトエラーを防ぐ技術として、ECCというものがあります。
ZYNQにはECCの機能が元から備わっているため、Cosmo-ZではECCを有効にしてソフトエラーを抑制することができます。
ECCを利用することには以下のようなメリットがあります。
- 1バイトの中の1bitのエラーを訂正
- 1バイトの中の2bitのエラーを検出
- ZYNQのPS内のハードウェアが自動的に行うので、ソフトウェアや、ハードウェア(FPGAのPL)には変更は不要
- デフォルトのLinuxカーネルに組み込まれたSynopsys ECCドライバでECCをフルサポートので、特になにもする必要はない
一方、ECCを利用するデメリットは以下のとおりです。
- メモリの容量が半分になる
ECCの有効化方法
ECCは、ZYNQの論理合成時にVivadoのDDRメモリ設定で下記の項目をEnabledにして、
DRAMのbit幅を16bitに変更するだけで有効になります。
特に部品を交換する必要はなく通常のCosmo-Zでも利用できます。
なお、ZYNQのECCは1バイトごとに符号を計算しての1バイトの領域を使って符号を格納しているので、32bitの幅もメモリを使用しながら16bit幅のメモリとして動かします。このため利用できるメモリの容量は半分になります。
FSBLの再生成
ECCを有効化した後は、FSBLを再ビルドする必要があります。U-Bootの再ビルドは必要ありません。
FSBLを再生成してU-bootが起動すると、下記の図のようにDRAM: ECC enabledと表示されます。
ECCのチェックタイミング
ECCはZYNQのDRAMコントローラがRead時に自動的に処理します。これをスクラブといいます。スクラブを行うにはハードウェア(PL)、またはソフトウェアからそのアドレスを読み出す必要があります。
読み出されないアドレスのECCはチェックされないので、まれにしかアクセスされない領域のECCチェックは長時間行われない可能性があります。結局のところ、Linuxのカーネル領域や重要なデータを守るには全領域をスクラブする必要があります。
また、スクラブは自動的には行われないので、PLにDDR3 DRAMアクセス用のAXIバーストリクエスト回路を入れて、周期的に全メモリ領域をスキャンして読み出すことをお勧めします。当社ではそのような回路を用意しています。
下の図は、4秒に1回、DDR3メモリの全領域をスキャンしているようすです。
エラーが検出されたときの動作
エラーが発生しても1bitのエラーであればDRAMコントローラが自動的に訂正してしまうので、何もする必要はありません。
Linuxに組み込まれたドライバは訂正したという結果のみを報告します。
この結果は
で表示することができます。
修正可能エラーの発生回数と、修正不可能エラーの発生回数は下記のシステムファイルから読み出せます。
- /sys/devices/system/edac/mc/mc0/ce_count 修正可能エラー
- /sys/devices/system/edac/mc/mc0/ue_count 修正不可能エラー
訂正不可能なエラーの対策方法
ソフトエラーは宇宙線などの放射線によって引き起こされると考えられます。
その頻度は高くはないので、最初は「1bit」のエラーとして発生するはずです。
1bitのエラーはscrubしながら自動巡回することによって100%修復されます。
修復が行われていないアドレスに2回目のソフトエラーが起きた場合には、回復不能なエラーとなります。
ただし、同じ番地に2回のソフトエラーが起こる確率は非常にまれといえます。
自動巡回の頻度を高めるなどの方法によって、2回目のエラーが発生する可能性を下げることができます。
お問い合わせ
ZYNQのECCメモリの使い方や、自動スクラブ回路、汚染データのinjectionによるテスト方法などのご相談は、
弊社 内藤 naitou@tokudenkairo.co.jp
までお問合せください。