You are on page 1of 2

import uvm_pkg::*;

`include "uvm_macros.svh"

class simple_packet extends uvm_sequence_item;


rand int src_addr;
rand int dst_addr;
//rand byte unsigned data[];

`uvm_object_utils_begin(simple_packet)
`uvm_field_int(src_addr, UVM_DEFAULT)
`uvm_field_int(dst_addr, UVM_DEFAULT)
`uvm_object_utils_end

constraint addr_constraint { src_addr != dst_addr; }

function new(string name = "simple_packet");


super.new(name);
endfunction

endclass

class producer extends uvm_component;

uvm_blocking_put_port#(simple_packet) put_port;

`uvm_component_utils(producer)

function new(string name = "producer", uvm_component parent = null);


super.new(name, parent);
put_port = new("put_port", this);
endfunction

virtual task run_phase(uvm_phase phase);


super.run_phase(phase);

for(int i =0; i<2; i++) begin


simple_packet p;

p = new();
p.randomize();
`uvm_info("Producer", $sformatf(" src_addr = %d, dst_addr =
%d",p.src_addr,p.dst_addr), UVM_NONE);
put_port.put(p);
end

endtask

endclass

class consumer extends uvm_component;


uvm_blocking_put_imp#(simple_packet, consumer) put_export;

`uvm_component_utils(consumer)

function new(string name = "consumer", uvm_component parent = null);


super.new(name, parent);
put_export = new("put_export", this);
endfunction
task put(simple_packet p);
`uvm_info("Consumer", $sformatf(" src_addr = %d, dst_addr =
%d",p.src_addr,p.dst_addr), UVM_NONE);
endtask

endclass

class env extends uvm_env;


producer p;
consumer c;

`uvm_component_utils(env)

function new(string name = "env", uvm_component parent = null);


super.new(name, parent);
endfunction

function void build_phase(uvm_phase phase);


super.build_phase(phase);
p = producer::type_id::create("p",this);
c = consumer::type_id::create("c",this);
endfunction

function void connect_phase(uvm_phase phase);


super.connect_phase(phase);
p.put_port.connect(c.put_export);
endfunction

endclass

class test extends uvm_test;

env e;
`uvm_component_utils(test)

function new(string name = "env", uvm_component parent = null);


super.new(name, parent);
endfunction

function void build_phase(uvm_phase phase);


super.build_phase(phase);
e = env::type_id::create("e", this);
endfunction

task run_phase(uvm_phase phase);


phase.raise_objection(this);
#1000;
phase.drop_objection(this);
endtask

endclass

module tb;

initial begin
run_test("test");
end
endmodule

You might also like