Bird
Raised Fist0
Verilogprogramming~20 mins

Memory initialization with $readmemh in Verilog - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Memory Initialization Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this Verilog memory initialization?

Given the following Verilog code snippet, what will be the value of mem[2] after initialization?

Verilog
module test;
  reg [7:0] mem [0:3];
  initial begin
    $readmemh("data.hex", mem);
  end
endmodule

// Contents of data.hex:
// 0A
// 1B
// 2C
// 3D
A8'h1B
B8'h3D
C8'h2C
D8'h0A
Attempts:
2 left
💡 Hint

Remember that $readmemh loads data line by line starting at index 0.

🧠 Conceptual
intermediate
1:30remaining
How does $readmemh interpret the input file?

Which statement best describes how $readmemh initializes memory from a file?

AIt reads hexadecimal values line by line and stores them sequentially starting at the specified memory address.
BIt reads binary values separated by spaces and stores them randomly in memory.
CIt reads decimal values and stores them in reverse order in memory.
DIt reads ASCII characters and stores their decimal codes in memory.
Attempts:
2 left
💡 Hint

Think about the format of the file and how memory addresses are assigned.

🔧 Debug
advanced
2:00remaining
Why does this $readmemh initialization fail?

Consider this Verilog code snippet:

reg [7:0] mem [0:3];
initial begin
  $readmemh("data.hex", mem, 1, 4);
end

The file data.hex contains 4 lines of hex data. What is the problem with this code?

AThe $readmemh call must not include start and end addresses.
BThe ending address 4 is out of bounds for mem[0:3], causing an error.
CThe memory array must be declared as <code>reg [3:0] mem [0:7]</code> for $readmemh to work.
DThe file name must be an absolute path, not a relative one.
Attempts:
2 left
💡 Hint

Check the memory array size and the range specified in $readmemh.

📝 Syntax
advanced
1:30remaining
Identify the syntax error in this $readmemh usage

What is wrong with this Verilog code snippet?

reg [7:0] mem [0:3];
initial begin
  $readmemh(data.hex, mem);
end
AThe $readmemh function requires a third argument specifying the start address.
BThe memory array must be declared as <code>wire</code>, not <code>reg</code>.
CThe <code>initial</code> block must be replaced with an <code>always</code> block.
DThe file name must be a string literal enclosed in double quotes.
Attempts:
2 left
💡 Hint

Look carefully at how the file name is passed to $readmemh.

🚀 Application
expert
2:30remaining
How many memory locations are initialized by this $readmemh call?

Given the following code and file, how many memory locations in mem will be initialized?

reg [15:0] mem [0:7];
initial begin
  $readmemh("data.hex", mem, 2, 5);
end

// data.hex contains 8 lines of hex values.
A4
B6
C8
D5
Attempts:
2 left
💡 Hint

Count the number of addresses from start to end inclusive.

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