-
Notifications
You must be signed in to change notification settings - Fork 9
/
producer.sv
82 lines (61 loc) · 2.38 KB
/
producer.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//----------------------------------------------------------------------
// Copyright 2007-2010 Mentor Graphics Corporation
// Copyright 2007-2011 Cadence Design Systems, Inc.
// Copyright 2010-2011 Synopsys, Inc.
// All Rights Reserved Worldwide
//
// Licensed under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in
// writing, software distributed under the License is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See
// the License for the specific language governing
// permissions and limitations under the License.
//----------------------------------------------------------------------
class producer #(type T=packet) extends uvm_component;
uvm_blocking_put_port #(T) out;
function new(string name, uvm_component parent=null);
super.new(name,parent);
out = new("out",this);
void'(uvm_config_int::get(this, "", "num_packets", this.num_packets));
endfunction
protected T proto = new;
protected int num_packets = 1;
protected int count = 0;
`uvm_component_utils_begin(producer #(T))
`uvm_field_object(proto, UVM_ALL_ON + UVM_REFERENCE)
`uvm_field_int(num_packets, UVM_ALL_ON + UVM_DEC)
`uvm_field_int(count, UVM_ALL_ON + UVM_DEC + UVM_READONLY)
`uvm_component_utils_end
task run_phase(uvm_phase phase);
T p;
string image, num;
`uvm_info("producer", "Starting.", UVM_MEDIUM)
for (count =0; count < num_packets; count++) begin
$cast(p, proto.clone());
num.itoa(count);
p.set_name({get_name(),"-",num});
p.set_initiator(this);
if (uvm_verbosity'(recording_detail)!=UVM_NONE) begin
`ifndef UVM_1p1d
p.enable_recording(get_tr_stream("packet_stream"));
`else
p.enable_recording("packet_stream");
`endif
end
void'(p.randomize());
`uvm_info("producer", $sformatf("Sending %s",p.get_name()), UVM_MEDIUM)
if(uvm_report_enabled(UVM_HIGH,UVM_INFO,""))
p.print();
out.put(p);
#10;
end
`uvm_info("producer", "Exiting.", UVM_MEDIUM)
endtask
endclass