Bird
Raised Fist0
Verilogprogramming~5 mins

Memory initialization with $readmemh in Verilog - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of the $readmemh system task in Verilog?

$readmemh is used to initialize memory arrays in Verilog by reading hexadecimal values from an external file into a memory block.

Click to reveal answer
beginner
How does $readmemh differ from $readmemb?

$readmemh reads memory initialization data in hexadecimal format, while $readmemb reads data in binary format.

Click to reveal answer
beginner
Show a simple example of using $readmemh to initialize a memory array.
reg [7:0] memory [0:15];
initial begin
  $readmemh("memory_init.hex", memory);
end

This loads the contents of memory_init.hex into the memory array at simulation start.

Click to reveal answer
beginner
What format should the file used with $readmemh have?

The file should contain hexadecimal values, one per line or separated by spaces, representing the memory contents to load.

Click to reveal answer
beginner
When is the best time to call $readmemh in your Verilog code?

It is best to call $readmemh inside an initial block so the memory is loaded at the start of simulation.

Click to reveal answer
What does $readmemh do in Verilog?
ALoads memory contents from a hexadecimal file
BReads binary input from a user
CWrites data to a file
DInitializes registers with zeros
Which file format is used with $readmemh?
ADecimal
BBinary
CHexadecimal
DASCII text
Where should $readmemh be placed in your Verilog code?
AInside an <code>always</code> block
BInside an <code>initial</code> block
COutside any block
DInside a function
What is the difference between $readmemh and $readmemb?
A<code>$readmemh</code> reads hex, <code>$readmemb</code> reads binary
B<code>$readmemh</code> writes memory, <code>$readmemb</code> reads memory
CThey are the same
D<code>$readmemh</code> reads decimal, <code>$readmemb</code> reads hex
If your memory file has values like 0A 1F 2B, which system task should you use?
A$writememh
B$readmemb
C$display
D$readmemh
Explain how to initialize a memory array in Verilog using $readmemh.
Think about when and how the file is read into memory.
You got /4 concepts.
    Describe the difference between $readmemh and $readmemb and when to use each.
    Focus on the file content format.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the primary purpose of the $readmemh system task in Verilog?
      easy
      A. To write memory contents to a file in hexadecimal format.
      B. To initialize registers with random values.
      C. To convert binary data into hexadecimal format during simulation.
      D. To load hexadecimal data from a file into a memory array before simulation.

      Solution

      1. Step 1: Understand the function of $readmemh

        $readmemh is used to read hexadecimal data from a file and load it into a memory array in Verilog.
      2. Step 2: Compare options with the function

        To load hexadecimal data from a file into a memory array before simulation. correctly describes loading hex data into memory before simulation. Other options describe writing data, converting formats, or random initialization, which are incorrect.
      3. Final Answer:

        To load hexadecimal data from a file into a memory array before simulation. -> Option D
      4. Quick Check:

        $readmemh loads hex data [OK]
      Hint: Remember: $readmemh reads hex data into memory [OK]
      Common Mistakes:
      • Confusing $readmemh with $writememh
      • Thinking it initializes registers randomly
      • Assuming it converts data formats
      2. Which of the following is the correct syntax to initialize a memory array named mem using $readmemh with a file named data.hex?
      easy
      A. $readmemh(mem, "data.hex");
      B. $readmemh("data.hex", mem);
      C. readmemh("data.hex", mem);
      D. $readmemh("mem", data.hex);

      Solution

      1. Step 1: Recall the correct order of arguments in $readmemh

        The syntax is $readmemh(filename, memory_array); where filename is a string and memory_array is the target memory.
      2. Step 2: Match options to syntax

        $readmemh("data.hex", mem); matches the correct syntax. $readmemh(mem, "data.hex"); reverses arguments. readmemh("data.hex", mem); misses the $ sign. $readmemh("mem", data.hex); swaps arguments and uses incorrect quotes.
      3. Final Answer:

        $readmemh("data.hex", mem); -> Option B
      4. Quick Check:

        Syntax is $readmemh(filename, memory) [OK]
      Hint: Filename first, memory second in $readmemh [OK]
      Common Mistakes:
      • Swapping filename and memory arguments
      • Omitting the $ sign
      • Using incorrect quotes or missing parentheses
      3. Given the following Verilog code snippet and a file memfile.hex containing:
      0A
      1B
      2C
      3D

      What will be the value of memory[2] after initial block executes?
      reg [7:0] memory [0:3];
      initial begin
        $readmemh("memfile.hex", memory);
      end
      medium
      A. 8'h2C
      B. 8'h1B
      C. 8'h0A
      D. 8'h3D

      Solution

      1. Step 1: Understand memory indexing and file data

        The file has 4 hex values: 0A at index 0, 1B at index 1, 2C at index 2, 3D at index 3.
      2. Step 2: Identify value at memory[2]

        memory[2] will hold the third value, which is 2C in hex.
      3. Final Answer:

        8'h2C -> Option A
      4. Quick Check:

        memory[2] = 2C hex [OK]
      Hint: Index matches line number starting at 0 [OK]
      Common Mistakes:
      • Confusing index with line number (off by one)
      • Misreading hex values
      • Assuming decimal instead of hex
      4. Consider this Verilog code snippet:
      reg [7:0] mem [0:3];
      initial begin
        $readmemh("data.hex", mem, 1, 3);
      end

      If data.hex contains:
      AA
      BB
      CC
      DD
      EE

      What values will mem[0] and mem[1] hold after initialization?
      medium
      A. mem[0] = 8'h00, mem[1] = 8'hAA
      B. mem[0] = 8'hAA, mem[1] = 8'hBB
      C. mem[0] = 8'hBB, mem[1] = 8'hCC
      D. mem[0] = 8'h00, mem[1] = 8'hCC

      Solution

      1. Step 1: Understand $readmemh with start and end addresses

        The call $readmemh("data.hex", mem, 1, 3); loads file lines starting at mem[1] up to mem[3].
      2. Step 2: Map file lines to memory

        File lines: 0=AA, 1=BB, 2=CC, 3=DD, 4=EE.
        mem[1] = AA, mem[2] = BB, mem[3] = CC.
        mem[0] remains uninitialized (default 8'h00).
      3. Final Answer:

        mem[0] = 8'h00, mem[1] = 8'hAA -> Option A
      4. Quick Check:

        Start=1 loads from line 0 to mem[1] [OK]
      Hint: Start address shifts file lines to memory indices [OK]
      Common Mistakes:
      • Assuming mem[0] is loaded when start address is 1
      • Confusing file line numbers with memory indices
      • Ignoring default zero initialization
      5. You want to initialize a 16-word memory array mem with 8-bit width using $readmemh. The hex file init.hex contains 20 lines of data. Which approach correctly loads only the first 16 lines into mem without causing simulation errors?
      hard
      A. Use $readmemh("init.hex", mem, 0, 19); and truncate memory size to 16.
      B. Use $readmemh("init.hex", mem, 0, 19); and ignore extra lines automatically.
      C. Use $readmemh("init.hex", mem, 0, 15); to load lines 0 to 15.
      D. Manually edit the file to 16 lines before loading.

      Solution

      1. Step 1: Understand memory size and file length

        The memory has 16 words (indices 0 to 15). The file has 20 lines, more than memory size.
      2. Step 2: Use $readmemh with start and end addresses

        Using $readmemh("init.hex", mem, 0, 15); loads only the first 16 lines safely into memory without overflow.
      3. Step 3: Evaluate other options

        Use $readmemh("init.hex", mem, 0, 19); and ignore extra lines automatically. tries to load 20 lines into 16 words, causing out-of-bounds error.
        Use $readmemh("init.hex", mem, 0, 19); and truncate memory size to 16. tries to load 20 lines into 16 words, causing overflow.
        Manually edit the file to 16 lines before loading. is manual and not always practical.
      4. Final Answer:

        Use $readmemh("init.hex", mem, 0, 15); -> Option C
      5. Quick Check:

        Limit loading to memory size with start/end [OK]
      Hint: Limit $readmemh range to memory size to avoid errors [OK]
      Common Mistakes:
      • Loading more lines than memory size causing errors
      • Assuming $readmemh ignores extra lines automatically
      • Editing files manually instead of using range parameters
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard