Initialising Memories

Keywords: $readmemb, $readmemh
Syntax:
$readmemb("<file_name>", <memory_name>");
$readmemb("<file_name>", <memory_name>, memory_start");
$readmemb("<file_name>", <memory_name>, memory_start, memory_finish");

The file_name and memory_nameare memory_start and memory_finish are optional, it missed out they default to the start index of the named memory and the end of the named memory respectively.

Memories can be stored in a file in the format shown below, the address is specified as @ <address>, where the address is in hexadecimal.

        @003
        00000011
        00000100
        00000101
        00000110
        00000111
        00001000
        00001001

With the above file it can be seen if the memory is large it would become very tedious to work out the address of a specific byte, so it is normally a good idea to use milestones along the memory file, so a larger file may look something like the following:
        @003
        00000011
        00000100
        00000101
        @006
        00000110
        00000111
        @008
        00001000
        00001001

or if the data is contiguous, omit the address entirely.

Now that a memory file exists to access it, it has to be initialised for memory reading. This can be done by the following.

        module testmemory;
           reg [7:0] memory [9:0];
           integer   index;

           initial begin
              $readmemb("mem.dat", memory);

              for(index = 0; index < 10; index = index + 1)
              $display("memory[%d] = %b", index[4:0], memory[index]);
           end
        endmodule // testmemory

with the file mem.data as

        1000_0001
        1000_0010
        0000_0000
        0000_0001
        0000_0010
        0000_0011
        0000_0100
        0000_0101
        0000_0110
        0000_0000

EXERCISE

Store the above data in a file and run the above programme

Consider and understand the following code (run it to check):

        module fileDemo;

           integer   handle, channels, index, rand;
           reg [7:0] memory [15:0];

           initial begin
              handle = $fopen("mem.dat");
              channels = handle | 1;
              $display("Generating contents of file mem.dat");
              $fdisplay(channels, "@2");

              for(index = 0; index < 14; index = index + 1) begin
              rand = $random;
              $fdisplay(channels, "%b", rand[12:5]);
              end

              $fclose(handle);

              $readmemb("mem.dat", memory);

              $display("\nContents of memory array");
              for(index = 0; index < 16; index = index + 1)
              $displayb(memory[index]);
           end

        endmodule // fileDemo

previous contents