Viewing VMM log details in waveforms
Posted by Avinash Agrawal on December 17th, 2009

Avinash Agrawal, Corporate Applications, Synopsys
Often engineers need a combination of logfile outputs and waveforms, to look at their simulations. And they wonder if it is possible to look at waveforms and get information on the number of simulation errors that might have occurred in a simulation upto any particular point of simulation time.
The good news is that the VMM log service helps a user track the source of different messages to different verification components.
When VMM macros such as `vmm_error, `vmm_note etc are used at different places in the verification environment, the user is able to view the corresponding information in the simulation output. This information includes the time at which the message was logged, the verification component and the specified instance of which the message was issued from. However, it can be very useful if the timing of the errors or warnings in the simulation output can be correlated with waveforms in simulation. For example, if there is a protocol violation message issued from one of the testbench monitors, the user can map the time when the message was issued to the actual signals in the waveform. That way user can quickly uncover the relevant problem in the DUT.
The VMM message service vmm_log consists of the vmm_log_format object to control the format of the messages. The vmm_log_format object also gets the information of the type/severity of the messsages. The vmm_log class for each component uses the default implementation of all these methods. The user can easily extend the vmm_log_format class and add in his modifications. Modifications can be either to trigger an assertion or incrememt a variable which can be dumped into the waveform window. This way, the engineer can correlate the errors with the change in the variable or an assertion in the waveform window.
The following code shows how this can be done:
module top();
int error_count;
initial begin
$vcdpluson();
end
endmodule
program P;
class env_format extends vmm_log_format; //extending vmm_log_format
// for adding in user modifications
virtual function string format_msg(string name,
string inst,
string msg_typ,
string severity,
ref string lines[$]);
if (msg_typ == "FAILURE" && severity == "!ERROR!") begin
top.error_count++; //incrementing error count for warnings and errors
end
//or trigger an assertion which can also be seen in the waveform
assert (~(msg_typ == "FAILURE" && severity == "!ERROR!"));
format_msg = super.format_msg(name, inst, msg_typ, severity, lines);
endfunction
endclass
class xactor extends vmm_xactor;
int id;
function new(int id, string instance);
super.new("xactor", instance);
this.id = id;
endfunction
virtual task main();
super.main();
`vmm_note(log, "This is a note message");
#5;
`vmm_error(log, "This is an error message");
if (id == 0)
#10 `vmm_error(log, "This is an error message");
else
#30 `vmm_error(log, "This is an error message");
endtask
endclass
class env extends vmm_env;
xactor x1;
xactor x2;
vmm_log log;
function new();
env_format fmt;
log = new("env", "class");
fmt = new();
log.set_format(fmt);
endfunction
virtual function void build();
super.build();
x1 = new(0, "x1");
x2 = new(1, "x2");
endfunction
virtual task start();
super.start();
x1.start_xactor();
x2.start_xactor();
endtask
virtual task wait_for_end();
super.wait_for_end();
#1000;
endtask
virtual task stop();
super.stop();
x1.stop_xactor();
x2.stop_xactor();
endtask
endclass
initial begin
env e = new;
e.run();
end
endprogram








