blob: 6c42bd609fee43a0cb651962a2fe5659d2abe6ec [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_exmples/mechanism/interfaces
This example will illustrate how to create a pin interface and mod port interfaces for a simple dut.
Connect a component "driver" to the pin interfaces, then to the dut.
*/
//----------------------------------------------------------------------
// interface mem_pins_if
//----------------------------------------------------------------------
interface pin_if (input clk);
bit [15:0] address;
bit [7:0] wr_data;
bit [7:0] rd_data;
bit rst;
bit rw;
bit req;
bit ack;
bit err;
modport master_mp(
input clk,
input rst,
output address,
output wr_data,
input rd_data,
output req,
output rw,
input ack,
input err );
modport slave_mp(
input clk,
input rst,
input address,
input wr_data,
output rd_data,
input req,
input rw,
output ack,
output err );
modport monitor_mp(
input clk,
input rst,
input address,
input wr_data,
input rd_data,
input req,
input rw ,
input ack,
input err );
endinterface
import uvm_pkg::*;
package top_pkg;
typedef virtual pin_if pin_vif;
endpackage
package user_pkg;
import uvm_pkg::*;
import top_pkg::*;
`include "uvm_macros.svh"
//---------------------------------------------------------------------
// component driver
//----------------------------------------------------------------------
class driver extends uvm_component;
pin_vif pif;
function new(string name, uvm_component parent = null);
super.new(name, parent);
endfunction
function void connect_phase(uvm_phase phase);
assert(uvm_resource_db#(pin_vif)::read_by_name(get_full_name(),
"pif", pif));
endfunction
task run_phase(uvm_phase phase);
forever begin
@(posedge pif.clk);
`uvm_info("driver", "posedge clk", UVM_NONE);
//...
end
endtask
endclass
//----------------------------------------------------------------------
// environment env
//----------------------------------------------------------------------
class env extends uvm_env;
local pin_vif pif;
driver d;
function new(string name, uvm_component parent = null);
super.new(name, parent);
d = new("driver", this);
endfunction
task run_phase(uvm_phase phase);
phase.raise_objection(this);
#100;
phase.drop_objection(this);
endtask
endclass
endpackage
import user_pkg::*;
//----------------------------------------------------------------------
// module dut
//----------------------------------------------------------------------
module dut(pin_if pif);
always @(posedge pif.clk) begin
`uvm_info("dut", "posedge clk", UVM_NONE);
//...
end
endmodule
//----------------------------------------------------------------------
// module clkgen
//----------------------------------------------------------------------
module clkgen(output bit clk);
initial begin
forever begin
#5 clk = 1;
#5 clk = 0;
end
end
endmodule
//----------------------------------------------------------------------
// module top
//----------------------------------------------------------------------
module top;
import top_pkg::*;
bit clk;
clkgen ck(clk);
pin_if pif(clk);
env e;
dut d(pif.slave_mp);
initial begin
e = new("env");
uvm_resource_db#(pin_vif)::set("env.driver", "pif", pif);
uvm_resource_db#(pin_vif)::dump();
run_test();
//$finish;
end
endmodule