A Memory (MEM) file is a manually edited text file that describes contiguous blocks of data. that can be used in place of the ELF file. The format of MEM files is an industry standard, consisting of two basic elements:
- Hexadecimal address specifier: An address specifier is indicated by an @ character followed by the hexadecimal address value. There are no spaces between the @ character and the first hexadecimal character.
- Hexadecimal data values: Hexadecimal data values follow the hexadecimal address value, separated by spaces, tabs, or carriage-return characters.
Because the MEM file is in hexadecimal format, each character represents four bits, or a nibble, in the memory.
Hexadecimal data values can consist of as many hexadecimal characters as desired. However, when a value has an odd number of hexadecimal characters, the first hexadecimal character is assumed to be a zero. For example, hexadecimal values A, C74, and 84F21 are interpreted as the values 0A, 0C74, and 084F21 respectively.
There must be at least one data value following an address, up to as many data values that belong to the previous address value. Following is an example of the most common MEM file format:
@0000 3A @0001 7B @0002 C4 @0003 56 @0004 02 @0005 6F @0006 89...
UpdateMEM requires a less redundant format. An address specifier is used only once at the beginning of a contiguous block of data. The previous example is rewritten as:
@0000 3A 7B C4 56 02 6F 89...
The address for each successive data value is derived according to its distance from the previous address specifier. A MEM file can have as many contiguous data blocks as required. While the gap of address ranges between data blocks can be any size, no two data blocks can overlap an address range.
The Vivado Design Suite also supports a MEM File format for memory initialization as described in the Initializing RAM Contents section of Vivado Design Suite User Guide: Synthesis (UG901). The MEM File format supported by the Vivado Design Suite is different from the file format supported by UpdateMEM.
You should define the MEM file structure for Vivado tools to match the synthesis view of the memory as an array, which adheres to the Verilog language specification. The MEM file used for UpdateMEM should include spaces to match the <Datawidth> tag as defined in the memory map info (MMI) file. For more information, see MMI File Syntax.
According to the Verilog language specification, the memory is treated as an array, so for AMD Vivado™ synthesis the MEM file for a 64k memory (256x256 array) should look as follows:
@00000000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
For the UpdateMem command, which has a post implementation physical view of the memory, the MEM file should look as follows:
@00000000 aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbb
<Datawidth>tag defined in the MMI file.