blob: 525ba46fc1868a424cad49555d94697d28a77ba9 [file] [log] [blame]
//----------------------------------------------------------------------
// 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.
//----------------------------------------------------------------------
/*
About: uvm_tlm_fifo
This test case supposed to test a producer consumer connection through a uvm_tlm_fifo of 10 levels.
Walk through the test:
Inside a module, there will be two threads established, the first one the *producer* will put a packet of an integer to put port, the second one *consumer* will get this packet through a get port. The put and get ports will be connected to the uvm_tlm_fifo exports.
the method *fifo.used* will be used here to display which fifo level is used.
*/
module test;
import uvm_pkg::*;
`include "uvm_macros.svh"
class packet;
int i;
function new(int v); i=v; endfunction
endclass
class producer extends uvm_component;
uvm_put_port #(packet) data_out;
function new(string name, uvm_component parent);
super.new(name,parent);
data_out = new("data_out", this);
endfunction
task run_phase(uvm_phase phase);
packet p, pp;
#1 p=new(0);
while(data_out.try_put(p)) begin
$display("%0t: put data %0d", $time, p.i);
#10 p = new(p.i+1);
end
$display("try_put status return: %0d", p.i);
$display("%0t: do a blocking put", $time);
data_out.put(p);
$display("%0t: blocking put succeeded", $time);
endtask
endclass
class consumer extends uvm_component;
uvm_get_port #(packet) data_in;
function new(string name, uvm_component parent);
super.new(name,parent);
data_in = new("data_in", this);
endfunction
task run_phase(uvm_phase phase);
packet p;
#100; // fifo will fill up
$display("%0t: getting one", $time);
data_in.get(p);
$display("%0t: received data %0d", $time, p.i);
#100; // let the blocking put succeed
while(data_in.try_get(p)) begin
$display("%0t: received data %0d", $time, p.i);
#10;
end
endtask
endclass
class test extends uvm_test;
`uvm_component_utils(test)
function new(string name = "", uvm_component parent = null);
super.new(name, parent);
endfunction
task run_phase(uvm_phase phase);
phase.raise_objection(null);
#5us;
phase.drop_objection(null);
endtask
endclass
producer prod = new("prod", null);
consumer cons = new("cons", null);
uvm_tlm_fifo #(packet) fifo = new("fifo", null, 10);
initial begin
prod.data_out.connect(fifo.put_export);
cons.data_in.connect(fifo.get_export);
fork
run_test("test");
repeat(30) begin
$display("%0t: FIFO level %0d of %0d", $time, fifo.used(), fifo.size());
#10;
end
join
end
endmodule