Intel Agilex® 7 SEUの緩和ユーザーガイド

ID 683128
日付 4/10/2023
Public
ドキュメント目次

4.5.2. センシティビティー・マップ・ヘッダーの検索

Advanced SEU Detection Intel® FPGA IPを使用して、.smh ルックアップを実行します。
開始する前に、SEUの緩和機能の設定中にEnable error detection checkオプションとGenerate SEU sensitivity map file (.smh) オプションがオンになっていることを確認してください。
Intel Agilex® 7センシティビティー・マップ・ヘッダーを検索するには、次の手順に従います。
  1. .smh ファイルのヘッダーを読み出し、一般的な .smh 情報を確認します。
    Address = 0
    Word 0  = SMH_signature
    Word 1  = (reserved, region_mask_size)
    Word 2  = sector_info_base_address
  2. 以下のセクター情報エントリーの3つの32ビット・ワードを読み出します。
    • セクターエンコード方式32ビットアドレス
    • セクター .smh データ32ビットアドレス
    • 8ビットのセクター .smh タグサイズ (1、2、4、または8ビット)
    • セクターによって使用されるASD領域ビットマスクの数である16ビットのASD領域マップサイズ
    Address = sector_info_base_address + (sector_index*3)
    Word 0  = encoding_scheme_address
    Word 1  = sector_data_address
    Word 2  = (reserved, regions_map_size, smh_tag_size)
  3. エラー位置のフレーム・インデックスとフレーム内のビット位置については、次のセクターエンコード方式情報を読み出します。
    • セクター・エンコード方式ヘッダー情報の最初の3ワードを読み出し、エンコード方式パラメーターを取得します。
      Address = encoding_scheme_address
      Word 0  = (reserved, frame_encoding_map_size)
      Word 1  = frame_info_base_offset
      Word 2  = frame_encoding_base_offset
    • フレーム番号の32ビットのフレーム情報文字列を読み出します。
      Address = encoding_scheme_address + frame_info_base_offset + frame_index
      Word 0  = (frame_encoding_index, frame_data_offset)
    • ビット位置のフレーム・センシティビティー・データの16ビット・インデックスを取得します。
      int16* frame_encoding_map = encoding_scheme_address
                                  + frame_encoding_base_offset
                                  + (frame_encoding_map_size 
                                  * frame_encoding_index) / 4;
      int16 tag_index           = frame_encoding_map[bit_position];
  4. セクター .smh データから次のデータを読み出し、影響を受けるASD領域を確立します。
    • 2 の手順からの、frame_data_offset および tag_indexsmh_tag_size ビット長 .smh タグの場合、次を実行します。
      int8* frame_data  = (sector_data_address + 1 
                          + (regions_map_size * region_mask_size + 31) / 32
                          + frame_data_offset*smh_tag_size);
      int8 sensitivity_byte = frame_data[tag_index * smh_tag_size / 8];
      int8 smh_tag      = (sensitivity_byte >> (tag_index * smh_tag_size % 8))
                          & ((0x1 << smh_tag_size) - 1);
    • ゼロの smh_tag は、ビットエラーの位置がどの領域にとっても重要ではないことを示します。ゼロ以外のタグは、領域マップ内のインデックスを示します。smh_tag の領域マスクを取得するには、次を実行します。
      int32* region_masks      = sector_data_address + 1;
      int32 region_mask_offset = (smh_tag - 1) * region_mask_size;
      int32 region_mask_word   = region_masks[region_mask_offset / 32];
      int32 region_mask        = (region_mask_word >> region_mask_offset % 32)
                                 & ((0x1 << (region_mask_size) - 1);