File I/O for test vectors ($readmemh, $writememh) in Verilog - Time & Space Complexity
When using file input/output in Verilog for test vectors, it's important to understand how the time to read or write data grows as the data size increases.
We want to know how the number of operations changes when the test vector size changes.
Analyze the time complexity of the following code snippet.
module test_vector_io;
reg [7:0] memory [0:255];
initial begin
$readmemh("input_vectors.hex", memory);
// ... simulation code ...
$writememh("output_vectors.hex", memory);
end
endmodule
This code reads 256 8-bit values from a file into memory, then later writes them back to another file.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Reading or writing each memory element one by one.
- How many times: Once for each element in the memory array (256 times in this example).
As the number of test vectors increases, the time to read or write grows proportionally.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 read or write steps |
| 100 | 100 read or write steps |
| 1000 | 1000 read or write steps |
Pattern observation: The operations grow linearly with the number of test vectors.
Time Complexity: O(n)
This means the time to read or write test vectors grows directly in proportion to how many vectors there are.
[X] Wrong: "Reading or writing test vectors happens instantly regardless of size."
[OK] Correct: Each vector must be processed one by one, so more vectors mean more time needed.
Understanding how file I/O scales helps you reason about simulation performance and testbench design in hardware projects.
"What if we used $readmemb instead of $readmemh? How would the time complexity change?"
Practice
$readmemh?Solution
Step 1: Understand
$readmemhusage$readmemhis used to read hexadecimal data from a file and load it into a memory array in Verilog.Step 2: Compare with other options
Other options describe writing data, random initialization, or display, which are not the purpose of$readmemh.Final Answer:
To load hexadecimal data from a file into a memory array -> Option AQuick Check:
$readmemhloads hex data [OK]
$readmemh reads hex data into memory [OK]- Confusing
$readmemhwith$writememh - Thinking it writes data instead of reading
- Assuming it reads binary instead of hex
Solution
Step 1: Identify the correct system task for writing
$writememhis the Verilog system task used to write memory contents to a hex file.Step 2: Check syntax correctness
The syntax$writememh("output.hex", mem_array);correctly specifies the file name and memory array.Final Answer:
$writememh("output.hex", mem_array); -> Option BQuick Check:
Write memory to hex file =$writememh[OK]
$writememh to save memory to hex file [OK]- Using
$readmemhinstead of$writememh - Misspelling the system task name
- Using non-existent tasks like
$writehex
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
Solution
Step 1: Understand
$readmemhfile loading order$readmemhloads the first line of the file intomem[0], second line intomem[1], and so on.Step 2: Match file content to memory
The first line is0A, somem[0]will be8'h0A.Final Answer:
8'h0A -> Option DQuick Check:
First file line -> mem[0] = 0A [OK]
- Assuming mem[0] gets last file line
- Confusing hex values with decimal
- Forgetting zero-based indexing
reg [7:0] mem [0:3];
initial begin
$writememh(mem, "output.hex");
end
Solution
Step 1: Check
The correct syntax is$writememhargument order$writememh("filename", memory_array);. The code reverses these arguments.Step 2: Verify other aspects
Memory size and file extension are valid, and$writememhcan be used inside initial blocks.Final Answer:
Arguments to$writememhare in wrong order -> Option CQuick Check:
Filename first, memory second in$writememh[OK]
- Swapping filename and memory array arguments
- Thinking file extension is mandatory
- Believing $writememh can't be in initial block
Solution
Step 1: Load test vectors correctly
Use$readmemh("input.hex", mem);to load test vectors from the input file into memory.Step 2: Save modified memory correctly
Use$writememh("output.hex", mem);to write the memory contents to the output file.Final Answer:
$readmemh("input.hex", mem); // test
$writememh("output.hex", mem); // save -> Option AQuick Check:
Read first, then write with correct syntax [OK]
- Reversing read and write order
- Swapping filename and memory arguments
- Using wrong filenames for read/write
Ready to prove it?
Pass the test and this pattern moves unknown
