📖 Scenario: You are designing a simple memory module in Verilog. You want to load initial data into the memory from a file using the $readmemh system task. This is useful when you want your memory to start with known values, like a small program or data table.
🎯 Goal: Build a Verilog module that declares a memory array and initializes it with values from a hex file using $readmemh. Then, display the loaded memory contents.
📋 What You'll Learn
Declare a memory array of 8 elements, each 8 bits wide.
Use $readmemh to load data from a file named memory_init.hex.
Display the memory contents after initialization using a for loop.
Use a testbench to run the initialization and display.
💡 Why This Matters
🌍 Real World
Memory initialization is common in FPGA and ASIC designs to preload programs or data tables before running hardware simulations or actual hardware.
💼 Career
Understanding how to initialize memory with <code>$readmemh</code> is important for hardware engineers working on embedded systems, firmware loading, and testbench creation.
Progress0 / 4 steps
1
Declare the memory array
Declare a memory array called mem with 8 elements, each 8 bits wide.
Verilog
Hint
Use reg [7:0] mem [0:7]; to declare 8 elements of 8 bits each.
2
Add memory initialization with $readmemh
Inside an initial block, use $readmemh to load data from the file memory_init.hex into the memory array mem.
Verilog
Hint
Use $readmemh("memory_init.hex", mem); inside an initial block.
3
Display the memory contents
Inside the same initial block, add a for loop with variable i from 0 to 7 to display each memory element using $display in the format: mem[i] = value.
Verilog
Hint
Use a for loop with an integer i and $display to print each element.
4
Run the simulation and observe output
Run the simulation to see the memory contents printed. Use $finish after displaying all elements to end the simulation.
Verilog
Hint
Use $finish; to stop the simulation after printing.
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
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.
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.
Final Answer:
To load hexadecimal data from a file into a memory array before simulation. -> Option D
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
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.
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.
Final Answer:
$readmemh("data.hex", mem); -> Option B
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
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.
Step 2: Identify value at memory[2]
memory[2] will hold the third value, which is 2C in hex.
Final Answer:
8'h2C -> Option A
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
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].
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
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.
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.
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.
Final Answer:
Use $readmemh("init.hex", mem, 0, 15); -> Option C
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 unknownstrongwhile earning +1 Grip toward your certificate.