Documente Academic
Documente Profesional
Documente Cultură
UVM
Tutorial
Taking
Reuse
to
the
Next
Level
Mark
Li6erick
Jason
Spro6
Jonathan
Bromley
S D M S D D S
M M M
S D D S S D D S
M M M M
S D D S
M M
S D
S D M
M
M
DVCon EU 2015
Configuration Object
Encapsulation & Appropriate
config_db Usage STIMULUS
Effective Stimulus
& Sequence Hierarchies
ARCHITECT
-URE
COVERAGE
Parameterized Classes, Self-Tuning
Interfaces & Registers Functional Coverage -
Strategy & Implementation
MODELING
VERTICAL REUSE
Reality
check:
dont
try
to
second
guess
everything
the
user
might
need
get
structure
right,
validate
operaAon
&
allow
for
adapAon
REUSE GUIDELINES RETROFITTING REUSE
Verilab & Accellera 13
AcAve/Passive
OperaAon
Ac3ve
components
provide
or
aect
the
s3mulus
driven
to
the
DUT,
inuencing
the
sAmulus
ow
Passive
components
do
not
provide
or
aect
the
s3mulus
in
any
way,
they
just
observe
Ac3ve/Passive
mode
aects:
run-Ame
architecture
funcAonal
capability
error
tolerance
debug
capability
MASTER SLAVE
C
ENV C
ENV
SVA
SVA
S
D
D
S
VIF
VIF
DUT
INTERFACE
INTERFACE
REQ M
M
RESP
VIF
VIF
AGENT AGENT
MASTER SLAVE
C
ENV C
ENV
SVA
SVA
DUT
INTERFACE
INTERFACE
REQ M
M
RESP
VIF
VIF
AGENT AGENT
BUS
env
S
D
interface
A
BUS M
C
agent OUT
env
if
C
EFFECTIVE
TXRX
env
VALIDATION OF BLOCK IN TOP-LEVEL CONTEXT
COMPREHENSIVE
S
D
TOP-LEVEL OPERATION AND DEBUG
interface
S
RESP
TX M
env
D
S
interface
agent
SB
M
RESP
agent C
S
D
interface
RX M
C
agent
DUT TOP
BUS
env
S
D
A B
interface
MANY INCONSISTENT
C
BUS CONFIG
agent
M
X OUT
OBJECTS & FIELDS TO MAINTAIN env
MANY SMALL
M
agent INTERFACES
OUT
TO
if
C
TXRX INSTANTIATE & SET IN CONFIG_DB
env
S
D
interface
S
RESP
TX M
env
D
S
interface
agent
SB
M
RESP
agent C
S
D
interface
RX M
C
agent
UN-ENCAPSULATED REUSE
DUT TOP IS ERROR-PRONE,
HARD TO MAINTAIN & TOO MUCH EFFORT
BUS
env
BLOCK-LEVEL ENV
S
D
A B ENCAPSULATION
interface
HIERARCHICAL
C
CONFIG
BUS
agent
M
X OUT
(TOP CONTROLS BLOCKS, env
if
agent C
TXRX (1 INST & 1 SET IN CONFIG_DB)
env
S
D
interface
S
RESP
TX M
env
D
S
interface
agent
SB
M
RESP
agent C
S
D
interface
RX M
C
agent
PROPER ENCAPSULATION MAKES VERTICAL REUSE
DUT TOP
OF MANY BLOCK-LEVEL ENVS A FEASIBLE PROPOSITION
Retrofng
Reuse:
adding
reuse
capability
to
an
exisAng
component
or
environment
that
does
not
yet
support
reuse
Specically:
xing
a
vericaAon
component
to
comply
with
guidelines
re-architec3ng
a
block-level
environment
for
verAcal
reuse
...aKemp3ng
reuse
of
an
environment
for
the
rst
Ame!
ACTIVE
LIB BLOCK
C
S
SB
ENV
MASTER SLAVE
C
ENV C
ENV
SVA
SVA
S
D
D
S
VIF
VIF
DUT
INTERFACE
INTERFACE
REQ M M RESP
VIF
VIF
AGENT AGENT
Jonathan Bromley
covergroup cg;
...
Coverage
coverpoint cov_txn.size {...}
... subscriber
endgroup
Cfg
Sqr
Driver
covergroup cg;
... AGENT
Monitor
endgroup can
be
sampled
at
any
point
in
the
code
... has
access
to
all
class
members
Cover
code
uvm_factory f = uvm_factory::get();
f.set_type_override_by_type (
dvcon_monitor::get_type(),
dvcon_cov_monitor::get_type()
);
no override, no coverage!
Cfg
class dvcon_cov extends uvm_component; or uvm_object Sqr
Driver
`uvm_component_utils(dvcon_cov)
AGENT
dvcon_monitor p_monitor; Monitor
covergroup cg;
coverpoint p_monitor.value {...} Cov
... object
function new(string name, uvm_component parent);
back
super.new(name, parent); pointer
$cast(p_monitor, parent);
cg = new();
endfunction No instance, no coverage!
LIB ENVIRONMENT
C
S
SB
configuration
coverage MASTER SLAVE
C
ENV C
ENV
SVA
SVA
S
D
D
S
VIF
VIF
DUT
INTERFACE
INTERFACE
REQ M M RESP
VIF
VIF
AGENT AGENT
LIB ENVIRONMENT
C
S
SB
MASTER SLAVE
C
ENV C
ENV
SVA
SVA
S
D
D
S
VIF
VIF
DUT
INTERFACE
INTERFACE
REQ M M RESP
VIF
VIF
AGENT AGENT
active 1
0
1
0
Illegal
if
active==0
or
iillegal
f
active==ready
example ready 0
1
1
0
Illegal
if
active
has
any
bits
set
that
are
not
set
in
ready
covergroup cg_active_ready(int Nbits); Easy in SV-2012!
...
binsof
expressions:
messy,
inexible
active_X_ready: cross active, ready {
function CrossQueueType all_illegals(int n);
for (int R=0; R<(1<<n); R++)
for (int A=0; A<(1<<n); A++)
if ( A==0 || A==R || (A & ~R)!=0 )
all_illegals.push_back( '{A,R} );
endfunction
illegal_bins bad_active = all_illegals(Nbits);
}
self-tuning for Nbits
endgroup
Verilab & Accellera 48
RECONFIGURABLE
COVERAGE
We need a workaround...
C
S
D
SVA
VIF
M
VIF
ENV TESTBENCH
UVC MODULE this interface is required
AGENT I/F for UVC-DUT signals
M VIF D VIF +SVA
... but what about SVA?
DUT
OTHER AGENTS
OTHER
I/F
OTHER UVCS
C DUT
interface my_sva_checker(...);
CONTROL
// control knobs KNOBS
bit checks_enable = 1; No class variables inside
// config object CONFIG concurrent assertions
my_config cfg; FIELDS
// local variables for SVA
class variables are
my_speed_enum cfg_speed_mode;
int unsigned cfg_max_value;
allowed in support code
bit cfg_data_en;
// properties and assertions... Interface is not a
// update local vars from cfg... phased component
endinterface
when is config class built?
Verilab & Accellera 66
Method
API
TESTBENCH MODULE
UVC INTERFACE
AGENT
C
SVA C
MON VIF
C
DUT
C
endinterface sva_checker.set_config(cfg);
endfunction
SVA C
CLASS
locally declared class can see
all local variables in interface
interface my_sva_checker(...);
// declare local variables (cfg, checks_enabled, etc.)
...
class checker_phaser extends uvm_component;
// use local variables (cfg, checks_enabled, etc.)
// use UVM phases (build, connect, run, etc.)
endclass no component_utils if multiple instances required
(cant
// construct register
unique same type
instance multiple class
of phaser times with factory)
// (at the top-level under uvm_top)
checker_phaser m_phase = new($psprintf("%m.m_phase"));
endinterface
unique name required for multiple instances
UVM_TOP
UVM phases run in parallel
ENV
SVA
UVM phase
CLASS
CLASS
addr_width 2**AW-1
Configuration objects at the same level often have common configuration data
e.g. DUT parameter derived values
Env
1
Env2
May be appropriate for upper level to
extract entries from pool for lower levels
Agent1
Agent2
CONCRETE
CONCRETE
Only
get()
works
set() using derived type
CONCRETE
uvm_object
get() must use derived
Wrong
uvm_object tmp;
uvm_config_object::get(..., "m_config", tmp);
$cast(m_config, tmp); // back to original type
uvm_object tmp;
uvm_config_object::get(..., "m_config", tmp);
$cast(m_config, tmp); // back to original type
USER
USER
Only
get()
works
uvm_bitstream_t tmp;
uvm_config_int::get(..., "m_bus_sz", tmp);
m_bus_sz = my_enum_t'(tmp); // back to original type
test1
We can use a sequencer as the
env
context for uvm_config_db lookup
agent1
seq1
A sequence can lookup entry using
seq1
seqr
seq
handle to the sequencer
uvm_config_db#(T)::get(p_sequencer,"","err_cfg", m_err_cfg)
seqTXERR seqRXERR
uvm_config_db#(T)::get(null,"ERRINJ::","err_cfg", tmp)
$cast(m_err_config, tmp); // back to original type
uvm_config_db#(T)::get(null,this.get_name(),"m_val", m_val)
Example: setting the value from the test using the full path
e.g. A repeated phase get() could fetch a value out of sync with
a register state OR race with a register callback
Mon
Multiple people may be using the same
Drv
reference. It could be important to stay in sync.
Chk
UVC_PRX
UVC_STXRX
TX RX RX D S
C
C
S
D
1-4 M
M
VS
MY
RX TX DUT TX UVC_PTX
S
D
1-4 D S
C
M
M
SERIAL PARALLEL
CONFIG-AWARE MAX-FOOTPRINT
AGENTS & SEQUENCES INTERFACES
Verilab & Accellera 113
Parameterized
Environment
REGISTER MODEL
OF PARAMETER TYPE SHARED ENVIRONMENT
SHARED SEQUENCES
HAVE ACCESS TO seq lib
P_ENV#(REG,T,R)
PARAMETERIZED PARAMETERIZED
AGENTS & SEQUENCES INTERFACES
Verilab & Accellera 114
Reuse
of
Parameterized
Env
A FEW DERIVATIVE-SPECIFIC DERIVATIVE-SPECIFIC ENVS e.g. B12_ENV SETS:
REG TYPE = REG_B,
REGISTER SEQUENCES (SPECIALIZE PARAMETERS) NUM SERIAL TX = 1
NUM SERIAL RX = 2
A21_ENV B12_ENV
seq lib seq lib
P_ENV#(REG_A,2,1) P_ENV#(REG_B,1,2)
seq lib seq lib
UVC_BUS UVC_BUS
VS
P
C VS
P
C
REG_A
S
C
REG_B
S
C
REG
REG
MODEL
MODEL
A D M SCOREBOARD
A D M SCOREBOARD
UVC_PRX#(2) UVC_PRX#(1)
UVC_STXRX#(2,1) UVC_STXRX#(1,2)
TX RX RX D S
C
TX RX RX D S
C
C
S
D C
S
D
M M
M M
VS
A21 B12
VS
DUT TX TX
S
D
RX TX UVC_PTX#(1)
S
D
RX TX DUT UVC_PTX#(2)
D S
C
D S
C
M M
M M
my_reg
REG reg_model;
reg_model;
// //
handle
handle
to to
register
register
model
model
`uvm_component_param_utils_begin(p_env_sequencer #(REG))
`uvm_component_utils_begin(p_env_sequencer)
`uvm_field_object(reg_model, UVM_ALL_ON | UVM_NOPRINT)
...
function void build_phase(...);
super.build_phase(...); DONT FORGET
if (reg_model == null)
`uvm_fatal("NOREG", null handle for reg_model")
...
`uvm_declare_p_sequencer(p_env_sequencer #(REG))
`uvm_declare_p_sequencer(p_env_sequencer)
`uvm_object_param_utils(p_env_base_seq)#(REG))
`uvm_object_param_utils(p_env_base_seq
...
SEQUENCES MUST EXTEND CORRECT BASE TYPE
=> SEQUENCES MUST BE PARAMETERIZED
class p_env_init_seq #(type REG=uvm_reg_block)
extends p_env_base_seq
p_env_base_seq;#(REG);
p_env_reset_seq #(REG)
reset_seq;
reset_seq;
// drive
//reset
drive reset
p_env_wait_cfg_seq #(REG)
cfg_seq;
cfg_seq;
// wait//cfg
wait
ackcfg ack
p_env_wait_ready_seq #(REG)
ready_seq;
ready_seq;
// wait//ready
wait ready
`uvm_object_param_utils_begin(p_env_init_seq #(REG))
`uvm_object_param_utils_begin(p_env_init_seq)
...
DONT EVER FORGET
`uvm_component_utils_begin(a21_env)
...
function void build_phase(...);
env = p_env#(reg_a,2,1)::type_id::create("env",
p_env::type_id::create("env", this); this);
...
uvm_config_db#(virtual my_intf)
INTERFACE (MIF)
S
D
VIF
DUT ::set(null,"*","cif",mif);
M
VIF
AGENT run_test();
end
Other AGENTs
interface my_intf();
Other OVCs
logic [31:0] addr;
...