UVM: do_pack/do_unpack method - EDA Playground
Warning! This exercise has been opened in another tab; autosave has been disabled. Close this tab or refresh to reactivate.

 Languages & Libraries

 Tools & Simulators

 Examples

205


126
 
1
`include "uvm_macros.svh"
2
import uvm_pkg::*;
3
4
typedef enum{RED, GREEN, BLUE} color_type;
5
6
class temp_class extends uvm_object;
7
  rand bit [7:0] tmp_addr;
8
  rand bit [7:0] tmp_data;
9
  
10
  function new(string name = "temp_class");
11
    super.new(name);
12
  endfunction
13
  
14
  `uvm_object_utils(temp_class)
15
    
16
  function void do_print(uvm_printer printer);
17
    super.do_print(printer);
18
    printer.print_field_int("tmp_addr", tmp_addr, $bits(tmp_addr), UVM_HEX);
19
    printer.print_field_int("tmp_data", tmp_data, $bits(tmp_data), UVM_HEX);
20
  endfunction
21
  
22
  function void do_pack(uvm_packer packer);
23
    super.do_pack(packer);
24
    packer.pack_field_int(tmp_addr, $bits(tmp_addr));
25
    packer.pack_field_int(tmp_data, $bits(tmp_data));
26
  endfunction
27
  
28
  function void do_unpack(uvm_packer packer);
29
    super.do_unpack(packer);
30
    tmp_addr = packer.unpack_field_int($bits(tmp_addr));
31
    tmp_data = packer.unpack_field_int($bits(tmp_data));
32
  endfunction
33
endclass
34
35
class my_object extends uvm_object;
36
  rand int        value;
37
  rand color_type colors;
38
  rand byte       data[4];
39
  rand bit [7:0]  addr;
40
  rand temp_class tmp;
41
  
42
  `uvm_object_utils(my_object)
43
  
44
  function new(string name = "my_object");
45
    super.new(name);
46
    tmp = new();
47
  endfunction
48
  
49
  function void do_print(uvm_printer printer);
50
    super.do_print(printer);
51
    printer.print_field_int("value", value, $bits(value), UVM_HEX);
52
    printer.print_string("colors", colors.name);
53
    foreach(data[i])
54
      printer.print_field_int($sformatf("data[%0d]", i), data[i], $bits(data[i]), UVM_HEX);
55
    printer.print_field_int("addr", addr, $bits(addr), UVM_HEX);
56
    printer.print_object("tmp", tmp);
57
  endfunction
58
  
59
  function void do_pack(uvm_packer packer);
60
    super.do_pack(packer);
61
    packer.pack_field_int(value, $bits(value));
62
    packer.pack_field_int(colors, $bits(colors));
63
    foreach(data[i])
64
      packer.pack_field_int(data[i], $bits(data[i]));
65
    packer.pack_field_int(addr, $bits(addr));
66
    packer.pack_object(tmp);
67
  endfunction
68
  
69
  function void do_unpack(uvm_packer packer);
70
    super.do_unpack(packer);
71
    value = packer.unpack_field_int($bits(value));
72
    colors = packer.unpack_field_int($bits(colors));
73
    foreach(data[i])
74
      data[i] = packer.unpack_field_int($bits(data[i]));
75
    addr = packer.unpack_field_int($bits(addr));
76
    packer.unpack_object(tmp);
77
  endfunction
78
endclass
79
80
class my_test extends uvm_test;
81
  `uvm_component_utils(my_test)
82
  my_object obj;
83
  bit packed_data_bits[];
84
  byte unsigned packed_data_bytes[];
85
  int unsigned packed_data_ints[];
86
  
87
  my_object unpack_obj;
88
  
89
  int pack_values[3];
90
  int unpack_values[3];
91
  
92
  function new(string name = "my_test", uvm_component parent = null);
93
    super.new(name, parent);
94
  endfunction
95
  
96
  function void build_phase(uvm_phase phase);
97
    super.build_phase(phase);
98
    obj = my_object::type_id::create("obj", this);
99
    assert(obj.randomize());
100
    `uvm_info(get_full_name(), $sformatf("obj = \n%s", obj.sprint()), UVM_LOW);
101
    
102
    // pack methods
103
    pack_values[0] = obj.pack(packed_data_bits);
104
    pack_values[1] = obj.pack_bytes(packed_data_bytes);
105
    pack_values[2] = obj.pack_ints(packed_data_ints);
106
    `uvm_info(get_full_name(), $sformatf("packed_data_bits = %p", packed_data_bits), UVM_LOW);
107
    `uvm_info(get_full_name(), $sformatf("packed_data_bytes = %p", packed_data_bytes), UVM_LOW);
108
    `uvm_info(get_full_name(), $sformatf("packed_data_ints = %p", packed_data_ints), UVM_LOW);
109
    `uvm_info(get_full_name(), $sformatf("pack_values[BITS] = %0d, pack_values[BYTES] = %0d, pack_values[INTS] = %0d", pack_values[0], pack_values[1], pack_values[2]), UVM_LOW);
110
    // unpack methods
111
    unpack_obj = my_object::type_id::create("unpack_obj", this);
112
    unpack_values[0] = unpack_obj.unpack(packed_data_bits);
113
    `uvm_info(get_full_name(), $sformatf("bits: unpack_obj = \n%s", unpack_obj.sprint()), UVM_LOW);
114
    unpack_values[1] = unpack_obj.unpack_bytes(packed_data_bytes);
115
    `uvm_info(get_full_name(), $sformatf("bytes: unpack_obj = \n%s", unpack_obj.sprint()), UVM_LOW);
116
    unpack_values[2] = unpack_obj.unpack_ints(packed_data_ints);
117
    `uvm_info(get_full_name(), $sformatf("ints: unpack_obj = \n%s", unpack_obj.sprint()), UVM_LOW);
118
    `uvm_info(get_full_name(), $sformatf("unpack_values[BITS] = %0d, unpack_values[BYTES] = %0d, unpack_values[INTS] = %0d", unpack_values[0], unpack_values[1], unpack_values[2]), UVM_LOW);
119
  endfunction
120
endclass
121
122
module tb_top;
123
  initial begin
124
    run_test("my_test");
125
  end
126
endmodule
xxxxxxxxxx
1
 
1
724 views and 0 likes     
 
Example for uvm_object with do_pack/do_unpack method

Example for uvm_object with do_pack/do_unpack method

170:0