Professional Documents
Culture Documents
Top----------------------------------------|
|
|
Test--------------------------------|
|Env------------------------------ |
|
| |
Scoreboard
| |
|
| |
||
|
|
| |Agent--------------------| |
|
| |
|
||
sequencer |
|
| |
| Mon
||
|
|
|
| |
|
||
||
|DUT<================> Driver
|
| |
|
| |
|
|
| |
|
| |
---------------------| |
|
| -------------------------------|
|
|
|
|
----------------------------------------------------------------------------------
|
|
|
|
|
| | |
|
|
|
| |
|
|
|
|
//////////////
Top :
//////////////
creates instances of DUT , testbench , interfaces.
connects them
registers interfaces
provides signals to DUT
top.sv :
`include "DUT.v"
`include "sample_interface.sv"
module top;
import uvm_pkg::*;
sample_interface vif(); //create instance
DUT dut(vif.inputs,vif.output); // Connect
initial begin
`uvm_resource_db#(virtual sample_interface)::set(.scope(ifs),.name(sample_in
terface)) //Register
run_test();
end
initial begin
//clk = 1;
end
endmodule:top
////////////////////////////////
Transactions:
///////////////////////////////
specifies inputs to DUT
multiple transactions } sequence -> sequencer -> driver
transaction class:
class sample_transaction extends uvm_sequence_item;
rand inputs;
bit output;
function new(string name, uvm_component parent)
super.new(name,parent);
endfunction:new
`uvm_object_utils_begin(sample_transaction)
`uvm_field_int(inputs,UVM_ALL_ON)
`uvm_field_int(output,UVM_ALL_ON)
`uvm_object_utils_end(sample_transaction)
endclass: sample_transaction
/////////////////////////////////////////////
Sequence:
////////////////////////////////////////////
class sample_sequence extends uvm_sequence#(sample_transaction);
`uvm_object_utils(sample_sequence);
function new(string name, uvm_component parent)
super.new(name,parent);
endfunction:new
task body()
repeat ( 10 ) begin
sample_transaction s_trans;
s_trans = sample_transaction::type_id::create(..);
start_item(s_trans);
// blocking function .. waits till
s_trans is created
assert(s_trans.randomize())
finish_item(s_trans);
// blocking function .. waits till
s_trans is finished
end
endtask: body
endclass: sample_sequence
///////////////////////////////////////////////////////
Sequencer
///////////////////////////////////////////////////////
sends sequ to driver
sequencer:
typedef uvm_sequencer#(sample_transaction) sample_sequencer;
////////////////////////////////////////////////////////
Driver:
///////////////////////////////////////////////////////
gets sequence from sequencer ; drives inputs to DUT .
sequencer| export
->
driver| port
imp1.test(t);
endtask: run_phase
endclass : producer
driver :
class sample_driver extends uvm_driver
`uvm_component_utils(sample_driver)
sample_interface vif;
sample_transaction s_trans;
function new(string name, uvm_component parent)
super.new(name,parent);
endfunction:new
//Build
function void build_phase(uvm_phase phase)
super.build_phase(phase);
`uvm_resource_db#(virtual sample_interface)::read_by_name(.scop
e(ifs),.name(sample_interface)) //Register
endfunction: build_phase
e(ifs),.name(sample_interface)) //Register
an_port = new(.name("an_port"),.parent(this))
endfunction: build_phase
endclass : sample_monitor
/////////////////////////////////////////////////
Agent :
/////////////////////////////////////////////////
class sample_agent extends uvm_agent
`uvm_component_utils(sample_agent)
`uvm_analysis_port #(sample_transaction) an_port1;
sample_driver sa_drv;
sample_monitor sa_mon;
sample_sequencer sa_seqr;
function new(string name, uvm_component parent)
super.new(name,parent);
endfunction:new
//Build
function void build_phase(uvm_phase phase)
super.build_phase(phase);
sa_drv = sample_driver::type_id::create(..)
sa_mon = sample_monitor::type_id::create(..)
sa_seqr = sample_sequencer::type_id::create(..)
an_port = new(.name("an_port"),.parent(this))
endfunction: build_phase
use FIFO
super.build_phase(phase);
sa_ag = sample_agent::type_id::create(..)
sa_sb = sample_scoreboard::type_id::create(..)
endfunction: build_phase
endclass : sample_env
///////////////////////////////////////////////
TEST
//////////////////////////////////////////////
class sample_test extends uvm_test
`uvm_component_utils(sample_test)
sample_env sa_env;
function new(string name, uvm_component parent)
super.new(name,parent);
endfunction:new
//Build
function void build_phase(uvm_phase phase)
super.build_phase(phase);
sa_env = sample_env::type_id::create(..)
endfunction: build_phase
task run_phase()
sample_sequence seq;
phase.raise_objection(.obj(this))
seq = sample_sequence::type_id::create(..)
assert(seq.randomize())
seq.start(sa_env.sa_ag.sa_seqr);
phase.drop_objection(.obj(this))
endtask: run_phase
endclass : sample_test