Tutorials
Learn More
Print method in UVM
The print method is used to deep print UVM object class properties in a well-formatted manner. An appropriate `uvm_field_* macro is required to use based on the data type of class properties.
Note: sprint() method is the same as print() method except that sprint() method prints the object in string format.
Print method example
typedef enum{RED, GREEN, BLUE} color_type;
class temp_class extends uvm_object;
rand bit [7:0] tmp_addr;
rand bit [7:0] tmp_data;
function new(string name = "temp_class");
super.new(name);
endfunction
`uvm_object_utils_begin(temp_class)
`uvm_field_int(tmp_addr, UVM_ALL_ON)
`uvm_field_int(tmp_data, UVM_ALL_ON)
`uvm_object_utils_end
endclass
class my_object extends uvm_object;
rand int value;
string names;
rand color_type colors;
rand byte data[4];
rand bit [7:0] addr;
rand temp_class tmp;
`uvm_object_utils_begin(my_object)
`uvm_field_int(value, UVM_ALL_ON)
`uvm_field_string(names, UVM_ALL_ON)
`uvm_field_enum(color_type, colors, UVM_ALL_ON)
`uvm_field_sarray_int(data, UVM_ALL_ON)
`uvm_field_int(addr, UVM_ALL_ON)
`uvm_field_object(tmp, UVM_ALL_ON)
`uvm_object_utils_end
function new(string name = "my_object");
super.new(name);
tmp = new();
this.names = "UVM";
endfunction
endclass
class my_test extends uvm_test;
`uvm_component_utils(my_test)
my_object obj;
bit packed_data_bits[];
byte unsigned packed_data_bytes[];
int unsigned packed_data_ints[];
my_object unpack_obj;
function new(string name = "my_test", uvm_component parent = null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
super.build_phase(phase);
obj = my_object::type_id::create("obj", this);
assert(obj.randomize());
obj.print();
// or
//`uvm_info(get_full_name(), $sformatf("obj = \n%s", obj.sprint()), UVM_LOW);
endfunction
endclass
module tb_top;
initial begin
run_test("my_test");
end
endmodule
Output:
UVM_INFO @ 0: reporter [RNTST] Running test my_test...
--------------------------------------------
Name Type Size Value
--------------------------------------------
obj my_object - @349
value integral 32 'h1f135537
names string 3 UVM
colors color_type 32 GREEN
data sa(integral) 4 -
[0] integral 8 'h9f
[1] integral 8 'h33
[2] integral 8 'h12
[3] integral 8 'h9c
addr integral 8 'h2f
tmp temp_class - @350
tmp_addr integral 8 'h39
tmp_data integral 8 'hbd
--------------------------------------------
print method with `uvm_object_utils
If the print method is used with `uvm_object_utils, no class properties will be printed.
typedef enum{RED, GREEN, BLUE} color_type;
class my_object extends uvm_object;
rand int o_var;
string o_name;
rand color_type colors;
rand byte data[4];
rand bit [7:0] addr;
`uvm_object_utils(my_object)
function new(string name = "my_object");
super.new(name);
endfunction
endclass
class my_test extends uvm_test;
`uvm_component_utils(my_test)
my_object obj;
function new(string name = "my_test", uvm_component parent = null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
super.build_phase(phase);
obj = my_object::type_id::create("obj", this);
assert(obj.randomize());
obj.print();
endfunction
function void end_of_elaboration_phase(uvm_phase phase);
super.end_of_elaboration_phase(phase);
uvm_top.print_topology();
endfunction
endclass
module tb_top;
initial begin
run_test("my_test");
end
endmodule
Output:
UVM_INFO @ 0: reporter [RNTST] Running test my_test...
----------------------------
Name Type Size Value
----------------------------
obj my_object - @1872
----------------------------
UVM_INFO /xcelium20.09/tools//methodology/UVM/CDNS-1.2/sv/src/base/uvm_root.svh(605) @ 0: reporter [UVMTOP] UVM testbench topology:
----------------------------------
Name Type Size Value
----------------------------------
uvm_test_top my_test - @1805
----------------------------------
do_print() method
The UVM automation macros primarily involve a lot of additional code that affects simulator performance. Hence, it is not recommended to use. Instead, do_print() callback method is a user-defined hook which is called by print() or sprint() method. The user must call the printer’s API in the do_print() implementation to add information to be printed.
do_print() method example
typedef enum{RED, GREEN, BLUE} color_type;
class temp_class extends uvm_object;
rand bit [7:0] tmp_addr;
rand bit [7:0] tmp_data;
function new(string name = "temp_class");
super.new(name);
endfunction
`uvm_object_utils(temp_class)
function void do_print(uvm_printer printer);
super.do_print(printer);
printer.print_field_int("tmp_addr", tmp_addr, $bits(tmp_addr), UVM_HEX);
printer.print_field_int("tmp_data", tmp_data, $bits(tmp_data), UVM_HEX);
endfunction
endclass
class my_object extends uvm_object;
rand int value;
string names = "UVM";
rand color_type colors;
rand byte data[4];
rand bit [7:0] addr;
rand temp_class tmp;
`uvm_object_utils(my_object)
function new(string name = "my_object");
super.new(name);
tmp = new();
endfunction
function void do_print(uvm_printer printer);
super.do_print(printer);
printer.print_field_int("value", value, $bits(value), UVM_HEX);
printer.print_string("names", names);
printer.print_string("colors", colors.name);
foreach(data[i])
printer.print_field_int($sformatf("data[%0d]", i), data[i], $bits(data[i]), UVM_HEX);
printer.print_field_int("addr", addr, $bits(addr), UVM_HEX);
printer.print_object("tmp", tmp);
endfunction
endclass
class my_test extends uvm_test;
`uvm_component_utils(my_test)
my_object obj;
function new(string name = "my_test", uvm_component parent = null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
super.build_phase(phase);
obj = my_object::type_id::create("obj", this);
assert(obj.randomize());
obj.print();
endfunction
endclass
module tb_top;
initial begin
run_test("my_test");
end
endmodule
Output:
UVM_INFO @ 0: reporter [RNTST] Running test my_test...
------------------------------------------
Name Type Size Value
------------------------------------------
obj my_object - @1876
value integral 32 'ha4a4f87e
names string 3 UVM
colors string 3 RED
data[0] integral 8 'hc6
data[1] integral 8 'h4c
data[2] integral 8 'hf
data[3] integral 8 'h89
addr integral 8 'h53
tmp temp_class - @1878
tmp_addr integral 8 'hea
tmp_data integral 8 'hdf
------------------------------------------
UVM Tutorials