SEU Mitigation User Guide: Agilex™ 5 FPGAs and SoCs

ID 813649
Date 11/25/2024
Public
Document Table of Contents

4.5.2. Looking up the Sensitivity Map Header

Use the Advanced SEU Detection Intel® FPGA IP to perform .smh lookups.
Before you begin, ensure that you have turned on the Enable error detection check and Generate SEU sensitivity map file (.smh) options while setting up the SEU mitigation features.
To look up the Agilex™ 5 sensitivity map header, follow these steps:
  1. Read the .smh file header for the generic .smh information:
    Address = 0
    Word 0  = SMH_signature
    Word 1  = (reserved, region_mask_size)
    Word 2  = sector_info_base_address
  2. Read the three 32-bit words of sector information entry for:
    • Sector encoding scheme 32-bit address
    • Sector .smh data 32-bits address
    • 8 bits of sector .smh tag size (can be 1, 2, 4, or 8 bits)
    • 16 bits of ASD region map size that is the number of ASD region bit masks used by sector
    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. Read the following sector encoding scheme information for error location frame index and bit position within the frame:
    • Read the first three words of sector encoding scheme header information to obtain the encoding scheme parameters.
      Address = encoding_scheme_address
      Word 0  = (reserved, frame_encoding_map_size)
      Word 1  = frame_info_base_offset
      Word 2  = frame_encoding_base_offset
    • Read the 32-bit frame information string for the frame number.
      Address = encoding_scheme_address + frame_info_base_offset + frame_index
      Word 0  = (frame_encoding_index, frame_data_offset)
    • Get the 16-bit index into frame sensitivity data for a bit position.
      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. Read the following data from the sector .smh data to establish the affected ASD regions:
    • The smh_tag_size bit length .smh tag for frame_data_offset and tag_index from step 2.
      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);
    • A zero smh_tag indicates that the bit error location is not critical for any region. A non-zero tag indicates an index in the region map. To get a region mask for the 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);