Professional Documents
Culture Documents
RegisterVerEnvironmentsUVM Mentor
RegisterVerEnvironmentsUVM Mentor
RegisterVerEnvironmentsUVM Mentor
Use Models
Mark Glasser
Methodology Architect
DVT
October 2010
UVM Register
Driven by Sequences
www.mentor.com
RAL
test
Maps:
APB:
A:
F[7:0]
X:
F[7:0]
addr
CVT
data
blk_APB_seq
ral.A.write
A
env
RAL
RAL
CVT
RTL BLK
www.mentor.com
test
Human-Readable
RAL
Maps:
APB:
A:
F[7:0]
X:
F[7:0]
CVT
blk_APB_seq
class ral_block_B extends uvm_ral_block;
ral.A.write
rand ral_reg_R A;
RAL
rand ral_reg_R X;
uvm_ral_map APB;
env
RTL BLK
www.mentor.com
RAL
test
Maps:
APB:
F[7:0]
CVT
F[7:0]
X:
virtual function uvm_sequence_item
ral2bus(uvm_ral_item
ral_item);
apb_item apb = apb_item::type_id::create("apb_item");
blk_APB_seq
apb.read = (ral_item.oper == uvm_ral::READ) ? 1 : 0;
ral.A.write
apb.addr = ral_item.addr;
RAL
apb.data = ral_item.data;
return apb;
endfunction
env
virtual
function void bus2ral(uvm_sequence_item bus_item,
RAL
uvm_ral_item ral_item);
apb_item apb;
CVT
if (!$cast(apb,bus_item)) begin
`uvm_fatal("NOT_APB_TYPE","Provided bus_item is the wrong type")
return;
end
ral_item.oper = apb.read ? uvm_ral::READ : uvm_ral::WRITE;
ral_item.addr = apb.addr;
ral_item.data = apb.data;
endfunction
RTL BLK
endclass
www.mentor.com
RAL
APB:
class blk_APB_test_seq extends uvm_ral_sequence;
`uvm_object_utils(blk_AXW_test_seq)
F[7:0]
A:
addr
ral_block_B ral;
CVT
data
F[7:0]
X:
test
blk_APB_seq
ral.A.write
RAL
env
Maps:
RAL
CVT
RTL BLK
www.mentor.com
RAL
class blk_env extends uvm_env;
`uvm_component_utils(blk_env)
F[7:0]
A:
ral_block_B ral;
F[7:0]
X:
apb_agent
apb;
wsh_agent
wsh;
test
blk_APB_seq
ral.A.write
APB:
CVT
RAL
env
Maps:
RAL
CVT
RTL
BLK
endclass
www.mentor.com
ral;
apb;
wsh;
env
RAL
CVT
www.mentor.com
RAL
APB:
test
F[7:0]
A:
blk_env env;
CVT
F[7:0]
X:
blk_APB_seq
ral.A.write
RAL
env
Maps:
task run();
blk_APB_seq seq = blk_APB_seq::type_id::create("blk_APB_seq",this);
seq.ral = env.ral;
RAL
CVT
seq.start(null);
seq.wait_for_sequence_state(FINISHED);
global_stop_request();
endtask
endclass
RTL BLK
www.mentor.com
RAL_SYS
RAL0
sys_test
sys_test_seq
blk_test_seq
ral.A.write
blk_test_seq
ral.A.write
RAL
Maps:
Maps:
APB:
APB:
CVT
A:
F[7:0]
X:
F[7:0]
CVT
RAL
RAL1
sys_env
Maps:
APB:
RAL
CVT
A:
F[7:0]
X:
F[7:0]
CVT
Different Base
Addresses
RTL BLK
RTL BLK
10
www.mentor.com
RAL_SYS
RAL0
sys_test
sys_test_seq
blk_test_seq
ral.A.write
blk_test_seq
ral.A.write
Maps:
Maps:
APB:
CVT
RAL
A:
F[7:0]
X:
F[7:0]
CVT
RAL
sys_env
RAL1
Maps:
APB:
RTL BLK
RTL BLK
APB:
www.mentor.com
RAL_SYS
RAL0
sys_test
sys_test_seq
blk_test_seq
ral.A.write
blk_test_seq
ral.A.write
RAL
APB:
APB:
CVT
A:
F[7:0]
X:
F[7:0]
CVT
RAL
class sys_env extends uvm_env;
`uvm_component_utils(sys_env)
sys_env
RAL
CVT
RAL1
Maps:
APB:
ral_sys_S ral;
apb_agent apb;
F[7:0]
A:
virtual function void build();
CVT
F[7:0]
X:
super.build();
apb = apb_agent::type_id::create("apb_agent",this);
ral = ral_sys_S::type_id::create("ral_sys_S");
ral.build();
Set sequencer
endfunction: build
virtual function void connect();
RTL BLK
ral2apb_adapter ral2apb = new;
ral.set_sequence(apb.sqr,ral2apb);
RTL BLK endfunction
endclass: sys_env
12
Maps:
Maps:
for ral_block_S
www.mentor.com
RAL_SYS
RAL0
sys_test
sys_test_seq
blk_test_seq
ral.A.write
blk_test_seq
ral.A.write
RAL
Maps:
Maps:
APB:
APB:
CVT
A:
F[7:0]
X:
F[7:0]
CVT
RAL
sys_env
RAL1
Maps:
APB:
RAL
13
www.mentor.com
RAL_SYS
RAL0
sys_test
sys_test_seq
blk_test_seq
ral.A.write
blk_test_seq
ral.A.write
RAL
RAL
sys_env
RAL
CVT
APB:
APB:
CVT
A:
F[7:0]
X:
class sys_R_test extends uvm_test;
`uvm_component_utils(sys_R_test)
sys_env env;
Maps:
Maps:
F[7:0]
RAL1
CVT
Maps:
task run();
sys_R_test_seq seq;
seq = sys_R_test_seq::type_id::create("sys_R_test_seq",this);
seq.ral = env.ral;
seq.start(null);
RTL BLK
Set RAL Block
global_stop_request();
endtask
RTL BLK
Start System-level sequence
endclass
14
www.mentor.com
sys_test
RAL0
blk_test_seq
ral.A.write
ral.W.write
A:
F[7:0]
X:
F[7:0]
Maps:
APB:
CVT
RAL
WSH:
sys_env
RAL
W
:
X:
CVT
F[7:0]
F[7:0]
CVT
RTL BLK
15
www.mentor.com
sys_test
RAL0
APB.add_reg(A,
APB.add_reg(X,
WSH.add_reg(X,
WSH.add_reg(W,
endfunction
endclass
h0,
'h10,
'h0,
'h10,
uvm_ral::RW);
uvm_ral::RW);
uvm_ral::RW);
uvm_ral::RW);
APB:
Declare Maps
ral.A.write
uvm_ral_map APB;
ral.W.write
uvm_ral_map
RAL WSH;
sys_env
Maps:
A:
F[7:0]
X:
F[7:0]
CVT
WSH:
Add Maps
W
:
X:
F[7:0]
F[7:0]
CVT
RTL BLK
16
www.mentor.com
sys_test
ral_block_B ral;
blk_test_seq
ral.A.write
virtual task body();
ral.W.write
uvm_ral::status_e
status;
RAL
RAL0
A:
F[7:0]
X:
F[7:0]
uvm_ral_data_t
data;
fork
ral.A.write(status, 'h33, .parent(this));
ral.X.write(status, 'h44, .parent(this));
ral.W.write(status, 'hcc, .parent(this));
join RAL
Maps:
APB:
WSH:
sys_env
Explicit Map
W
F[7:0]
:
ral.X.write(status,
~ral.A.get(), .map(ral.APB), .parent(this));
CVT
CVT
F[7:0]
ral.X.mirror(status, uvm_ral::VERB, .map(ral.WSH), X:.parent(this));
endtask
endclass
RTL BLK
17
www.mentor.com
RAL
env
blk_APB_seq
ral.A.write
A
Maps:
APB:
A:
F[7:0]
X:
F[7:0]
CVT
RAL
Start_item()
RAL item
Passthru Converter
get_next_item()
addr
CVT
data
Translation Sequence
RTL BLK
18
www.mentor.com
Thank You!
19
www.mentor.com
www.mentor.com
20
www.mentor.com