Bird
Raised Fist0
Verilogprogramming~5 mins

File I/O for test vectors ($readmemh, $writememh) in Verilog

Choose your learning style10 modes available
Introduction

We use $readmemh and $writememh to load and save data from files in Verilog. This helps test designs with real data easily.

When you want to load a list of test inputs into a memory in your design.
When you want to save the output data from your design to a file for checking.
When you want to reuse test data without rewriting it inside your code.
When you want to simulate your design with large data sets stored in files.
Syntax
Verilog
$readmemh("filename", memory_array);
$writememh("filename", memory_array);

$readmemh reads a file with hexadecimal values into a memory array.

$writememh writes the contents of a memory array to a file in hexadecimal format.

Examples
Loads hexadecimal values from input_data.hex into mem_array.
Verilog
$readmemh("input_data.hex", mem_array);
Saves the contents of mem_array into output_data.hex as hex values.
Verilog
$writememh("output_data.hex", mem_array);
Defines an 8-bit wide memory with 16 locations and loads it at start from testvec.hex.
Verilog
reg [7:0] mem_array [0:15];
initial begin
  $readmemh("testvec.hex", mem_array);
end
Sample Program

This program loads 4 bytes from input.hex into memory, prints them, changes two values, and saves the memory to output.hex.

Verilog
module testmem;
  reg [7:0] mem [0:3];
  integer i;

  initial begin
    // Load memory from file
    $readmemh("input.hex", mem);

    // Display loaded values
    $display("Memory contents after loading:");
    for (i = 0; i < 4; i = i + 1) begin
      $display("mem[%0d] = %h", i, mem[i]);
    end

    // Modify memory
    mem[0] = 8'hAA;
    mem[1] = 8'hBB;

    // Save memory to file
    $writememh("output.hex", mem);

    $finish;
  end
endmodule
OutputSuccess
Important Notes

Files used with $readmemh must contain hex values separated by spaces or newlines.

Memory arrays must be declared before using these system tasks.

Use $readmemb and $writememb for binary files instead of hex.

Summary

$readmemh loads hex data from a file into a memory array.

$writememh saves memory array data to a hex file.

These tasks help test your design with real data easily and save results for checking.

Practice

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

Solution

  1. Step 1: Understand $readmemh usage

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

    Other options describe writing data, random initialization, or display, which are not the purpose of $readmemh.
  3. Final Answer:

    To load hexadecimal data from a file into a memory array -> Option A
  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 writes data instead of reading
  • Assuming it reads binary instead of hex
2. Which of the following is the correct syntax to write memory contents to a hex file in Verilog?
easy
A. $readmemh("data.hex", mem_array);
B. $writememh("output.hex", mem_array);
C. $writehex("output.hex", mem_array);
D. $dumpmemh("output.hex", mem_array);

Solution

  1. Step 1: Identify the correct system task for writing

    $writememh is the Verilog system task used to write memory contents to a hex file.
  2. Step 2: Check syntax correctness

    The syntax $writememh("output.hex", mem_array); correctly specifies the file name and memory array.
  3. Final Answer:

    $writememh("output.hex", mem_array); -> Option B
  4. Quick Check:

    Write memory to hex file = $writememh [OK]
Hint: Use $writememh to save memory to hex file [OK]
Common Mistakes:
  • Using $readmemh instead of $writememh
  • Misspelling the system task name
  • Using non-existent tasks like $writehex
3. Given the following Verilog code snippet, what will be the content of mem[0] after $readmemh executes if the file data.hex contains:
0A
1F
2B

reg [7:0] mem [0:2];
initial begin
$readmemh("data.hex", mem);
end
medium
A. 8'h00
B. 8'h1F
C. 8'h2B
D. 8'h0A

Solution

  1. Step 1: Understand $readmemh file loading order

    $readmemh loads the first line of the file into mem[0], second line into mem[1], and so on.
  2. Step 2: Match file content to memory

    The first line is 0A, so mem[0] will be 8'h0A.
  3. Final Answer:

    8'h0A -> Option D
  4. Quick Check:

    First file line -> mem[0] = 0A [OK]
Hint: First file line loads into mem[0] with $readmemh [OK]
Common Mistakes:
  • Assuming mem[0] gets last file line
  • Confusing hex values with decimal
  • Forgetting zero-based indexing
4. Identify the error in the following Verilog code snippet that attempts to write memory contents to a hex file:
reg [7:0] mem [0:3];
initial begin
$writememh(mem, "output.hex");
end
medium
A. Missing file extension in filename
B. Memory array size is invalid
C. Arguments to $writememh are in wrong order
D. Cannot use $writememh inside initial block

Solution

  1. Step 1: Check $writememh argument order

    The correct syntax is $writememh("filename", memory_array);. The code reverses these arguments.
  2. Step 2: Verify other aspects

    Memory size and file extension are valid, and $writememh can be used inside initial blocks.
  3. Final Answer:

    Arguments to $writememh are in wrong order -> Option C
  4. Quick Check:

    Filename first, memory second in $writememh [OK]
Hint: Filename is first argument in $writememh [OK]
Common Mistakes:
  • Swapping filename and memory array arguments
  • Thinking file extension is mandatory
  • Believing $writememh can't be in initial block
5. You want to test a memory module by loading test vectors from a hex file and then save the modified memory contents back to another hex file. Which sequence of Verilog system tasks correctly achieves this?
hard
A. $readmemh("input.hex", mem); // test
$writememh("output.hex", mem); // save
B. $writememh("input.hex", mem); // test
$readmemh("output.hex", mem); // save
C. $readmemh(mem, "input.hex"); // test
$writememh(mem, "output.hex"); // save
D. $readmemh("output.hex", mem); // test
$writememh("input.hex", mem); // save

Solution

  1. Step 1: Load test vectors correctly

    Use $readmemh("input.hex", mem); to load test vectors from the input file into memory.
  2. Step 2: Save modified memory correctly

    Use $writememh("output.hex", mem); to write the memory contents to the output file.
  3. Final Answer:

    $readmemh("input.hex", mem); // test
    $writememh("output.hex", mem); // save
    -> Option A
  4. Quick Check:

    Read first, then write with correct syntax [OK]
Hint: Read test vectors first, write results second [OK]
Common Mistakes:
  • Reversing read and write order
  • Swapping filename and memory arguments
  • Using wrong filenames for read/write
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