TLM 2.0: Generic Payload extension - 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

203


113
 
1
`include "uvm_macros.svh"
2
import uvm_pkg::*;
3
class gp_extension extends uvm_tlm_extension;
4
  rand bit enable;
5
  rand bit [31:0] e_addr;
6
  rand bit [31:0] e_data;
7
  
8
  `uvm_object_utils_begin(gp_extension)
9
    `uvm_field_int(enable, UVM_PRINT)
10
    `uvm_field_int(e_addr, UVM_PRINT)
11
    `uvm_field_int(e_data, UVM_PRINT)  
12
  `uvm_object_utils_end
13
  
14
  function new(string name = "gp_extension");
15
    super.new(name);
16
  endfunction
17
endclass
18
19
class producer extends uvm_component;
20
  uvm_tlm_generic_payload req;
21
  gp_extension extension;
22
  uvm_tlm_b_initiator_socket #(uvm_tlm_generic_payload) sender_port;
23
  uvm_tlm_time tlm_delay;
24
  
25
  `uvm_component_utils(producer)
26
  
27
  function new(string name = "producer", uvm_component parent = null);
28
    super.new(name, parent);
29
  endfunction
30
  
31
  function void build_phase(uvm_phase phase);
32
    super.build_phase(phase);
33
    sender_port = new("sender_port", this);
34
    tlm_delay = new("tlm_delay", 0);
35
  endfunction
36
  
37
  task run_phase(uvm_phase phase);
38
    super.run_phase(phase);
39
    req = uvm_tlm_generic_payload::type_id::create("req");
40
    extension = gp_extension::type_id::create("extension");
41
    req.set_extension(extension);
42
    assert(req.randomize with {m_address == 5;});
43
    `uvm_info(get_name(), $sformatf("Number of extensions = %0d", req.get_num_extensions()), UVM_NONE);
44
    `uvm_info(get_name(), $sformatf("With set_extension: req =\n%s", req.sprint()), UVM_NONE);
45
    sender_port.b_transport(req, tlm_delay);
46
    #5;
47
    req.clear_extensions();
48
    assert(req.randomize with {m_address == 7;});
49
    `uvm_info(get_name(), $sformatf("With clear_extension: req =\n%s", req.sprint()), UVM_NONE);
50
  endtask
51
endclass
52
53
class consumer extends uvm_component;
54
  uvm_tlm_b_target_socket #(consumer, uvm_tlm_generic_payload) receiver_port;
55
  
56
  `uvm_component_utils(consumer)
57
  
58
  function new(string name = "consumer", uvm_component parent = null);
59
    super.new(name, parent);
60
    receiver_port = new("receiver_port", this);
61
  endfunction
62
  
63
  virtual task b_transport(uvm_tlm_generic_payload req, uvm_tlm_time tlm_delay);
64
    `uvm_info(get_type_name(), $sformatf("Received payload =\n%s", req.sprint()), UVM_NONE);
65
  endtask
66
endclass
67
68
class env extends uvm_env;
69
  producer pro;
70
  consumer con;
71
  `uvm_component_utils(env)
72
  
73
  function new(string name = "env", uvm_component parent = null);
74
    super.new(name, parent);
75
  endfunction
76
  
77
  function void build_phase(uvm_phase phase);
78
    super.build_phase(phase);
79
    pro = producer::type_id::create("pro", this);
80
    con = consumer::type_id::create("con", this);
81
  endfunction
82
  
83
  function void connect_phase(uvm_phase phase);
84
    super.connect_phase(phase);
85
    pro.sender_port.connect(con.receiver_port);
86
  endfunction
87
endclass
88
              
89
class test extends uvm_test;
90
  env env_o;
91
  `uvm_component_utils(test)
92
  
93
  function new(string name = "test", uvm_component parent = null);
94
    super.new(name, parent);
95
  endfunction
96
  
97
  function void build_phase(uvm_phase phase);
98
    super.build_phase(phase);
99
    env_o = env::type_id::create("env_o", this);
100
  endfunction
101
 
102
  task run_phase(uvm_phase phase);
103
    phase.raise_objection(this);
104
    #50;
105
    phase.drop_objection(this);
106
  endtask
107
endclass
108
109
module tb_top;
110
  initial begin
111
    run_test("test");
112
  end
113
endmodule
xxxxxxxxxx
1
 
1
// Code your design here
2
294 views and 0 likes     
 
Example of TLM 2.0: Generic Payload extension

Example of TLM 2.0: Generic Payload extension

180:0