Using $display and $monitor in Verilog - Time & Space Complexity
We want to understand how the time cost changes when using $display and $monitor in Verilog simulations.
How does the number of print operations grow as the simulation runs longer or with more changes?
Analyze the time complexity of the following code snippet.
module test;
reg clk;
reg [3:0] count;
initial begin
clk = 0;
count = 0;
forever #5 clk = ~clk;
end
always @(posedge clk) begin
count = count + 1;
$display("Count is %d", count);
end
initial $monitor("At time %0t, count = %d", $time, count);
endmodule
This code toggles a clock and increments a counter on each positive clock edge. It uses $display to print the count each time it changes and $monitor to print whenever count changes.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The $display statement runs once every positive clock edge.
- Secondary operation: The $monitor prints whenever the count changes, which happens every clock edge as well.
- How many times: Both print operations happen once per clock cycle, repeating indefinitely.
As the number of clock cycles (n) increases, the number of print operations grows linearly.
| Input Size (n = clock cycles) | Approx. Print Operations |
|---|---|
| 10 | About 20 prints |
| 100 | About 200 prints |
| 1000 | About 2000 prints |
Pattern observation: The number of print statements grows directly with the number of clock cycles.
Time Complexity: O(n)
This means the time spent printing grows in a straight line as the simulation runs longer.
[X] Wrong: "$monitor only prints once, so it does not affect time complexity much."
[OK] Correct: $monitor prints every time the watched variable changes, which can be many times, so it adds up linearly with input size.
Understanding how print statements affect simulation time helps you write efficient testbenches and debug code without slowing down your simulation too much.
"What if we replaced $display with $write inside the always block? How would the time complexity change?"
Practice
$display and $monitor in Verilog?Solution
Step 1: Understand
$displaybehavior$displayprints a message only once at the time it is called during simulation.Step 2: Understand
$monitorbehavior$monitorautomatically prints a message every time any of the monitored variables change value.Final Answer:
$displayprints once when called;$monitorprints whenever a variable changes. -> Option BQuick Check:
$display= once,$monitor= on change [OK]
- Thinking $display prints continuously
- Confusing $monitor with file output
- Assuming $monitor prints only once
reg [3:0] count; using $display?Solution
Step 1: Identify the data type and format specifier
The registercountis 4-bit binary, so binary format specifier%bis appropriate.Step 2: Match format specifier with
$displaysyntax$display("Count value: %b", count);correctly prints the binary value ofcount.Final Answer:
$display("Count value: %b", count); -> Option DQuick Check:
Binary format = %b [OK]
- Using %s which is for strings, not numbers
- Using %d for binary values
- Forgetting to include variable after format string
reg [1:0] a;
initial begin
a = 2'b00;
$monitor("Time=%0t a=%b", $time, a);
#5 a = 2'b01;
#5 a = 2'b11;
#5 a = 2'b10;
endSolution
Step 1: Understand $monitor initial print
$monitor prints immediately when called (time 0) and then whenever monitored variables change.Step 2: Trace changes to 'a' and timing
'a' changes at 5, 10, and 15 time units, so $monitor prints at these times plus initial time 0.Final Answer:
Prints four lines showing time and value of 'a' at 0, 5, 10, and 15 time units. -> Option AQuick Check:
$monitor prints on call + changes = 4 prints [OK]
- Assuming $monitor prints only on changes, missing initial print
- Thinking $monitor prints only once
- Confusing $display behavior with $monitor
reg clk;
initial begin
$monitor("Clock = %b", clk);
clk = 0;
#10 clk = 1;
#10 clk = 0;
endSolution
Step 1: Check order of $monitor and variable initialization
$monitor is called before clk is assigned a value, so initial print shows 'x' (unknown).Step 2: Understand $monitor initial print behavior
$monitor prints immediately on call, so it prints clk's value before initialization.Final Answer:
$monitor is called before clk is initialized, so initial print shows unknown value. -> Option CQuick Check:
Initialize variables before $monitor call [OK]
- Assuming $monitor waits for variable initialization
- Thinking missing semicolon causes error here
- Confusing reg and wire for $monitor usage
reg [3:0] data; and reg valid; so that the simulation prints their values only when valid changes. Which is the best way to do this using $monitor?Solution
Step 1: Understand $monitor behavior with multiple variables
$monitor prints whenever any monitored variable changes. Monitoring both data and valid prints on either change.Step 2: Restrict printing to valid changes only
To print only when valid changes, monitor only valid. But then data won't print updated values automatically.Step 3: Best practical approach
Monitoring both variables prints all changes, but since data changes only when valid changes, this works well. $monitor("Data=%b Valid=%b", data, valid); is simplest and correct.Final Answer:
$monitor("Data=%b Valid=%b", data, valid); -> Option AQuick Check:
Monitor all needed vars; prints on any change [OK]
- Trying to put conditions inside $monitor (not allowed)
- Monitoring only one variable and missing others' changes
- Using $display inside $monitor incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
