Viewing VMM log details in waveforms
转自:http://www.vmmcentral.org/vmartialarts/2009/12/viewing-vmm-log-details-in-waveforms/
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
浙公网安备 33010602011771号