0% found this document useful (0 votes)
41 views55 pages

DVCon Europe 2015 T08 Presentation

The document describes the Easier UVM code generator, which aims to make learning and using the Universal Verification Methodology (UVM) framework easier. The generator takes design specifications as input and automatically produces a UVM verification environment implementation, reducing the learning curve and risk of errors. It discusses how the generator can be used to learn UVM, create initial verification IP frameworks, and regenerate code throughout a project.

Uploaded by

Jon DC
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
41 views55 pages

DVCon Europe 2015 T08 Presentation

The document describes the Easier UVM code generator, which aims to make learning and using the Universal Verification Methodology (UVM) framework easier. The generator takes design specifications as input and automatically produces a UVM verification environment implementation, reducing the learning curve and risk of errors. It discusses how the generator can be used to learn UVM, create initial verification IP frameworks, and regenerate code throughout a project.

Uploaded by

Jon DC
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 55

Easier UVM:

Learning and Using UVM with a


Code Generator
John Aynsley, Doulos

© Accellera Systems Initiative 1


Easier UVM:
Learning and Using UVM with a Code Generator

• Introduction to UVM
• Easier UVM?
• The Easier UVM Code Generator
• Reporting
• Phases and Configuration
• TLM Connections
• The Factory
• Sequences and Tests

© Accellera Systems Initiative 2


What is UVM?

• The Universal Verification Methodology for SystemVerilog

• Supports constrained random, coverage-driven verification

• An open-source base class library

• An Accellera standard

• Supported by all major simulator vendors

• Very strong adoption!

© Accellera Systems Initiative 3


Why UVM?

• Best practice
• Consistency, uniformity, don't reinvent the wheel, avoid pitfalls

• Reuse
• Verification IP, verification environments, tests, people, knowhow

© Accellera Systems Initiative 4


Constrained Random Verification

Coverage Coverage
Checking Checking

Response Stimulus

VIP VIP

Test
harness Interface Interface

Design Under Test

© Accellera Systems Initiative 5


UVM Verification Environment
Checking Configuration
Test Config
Factory overrides
Env Virtual seq
Coordination

Coverage Subsc'r Scoreb'd Subsc'r

Transaction-Level
Connections Config Config
Stimulus
Agent Agent
Sequ'r Seq Sequ'r Seq
Agent per-interface
Transactions
Monitor Driver Monitor Driver

Class-based
Pin wiggles
Module-based Test
harness Interface Interface

DUT

© Accellera Systems Initiative 6


Easier UVM:
Learning and Using UVM with a Code Generator

• Introduction to UVM
• Easier UVM?
• The Easier UVM Code Generator
• Reporting
• Phases and Configuration
• TLM Connections
• The Factory
• Sequences and Tests

© Accellera Systems Initiative 7


UVM Itself is Challenging

• ~ 300 classes in UVM Base Class Library


• The UVM documentation does not answer all the questions
• There are many ways to do the same thing - need a methodology

© Accellera Systems Initiative 8


The Learning Curve
• Doulos training

Verilog SystemVerilog for Verification UVM Adopter

4 days 4 days

What next?
Significant
up-skilling Coaching
UVM-aware tools
Coding guidelines

© Accellera Systems Initiative 9


Doulos – Easier UVM

• Coding guidelines – "One way to do it" Free and open

• Automatic code generator Apache 2.0 license

• Help individuals and project teams


• learn UVM and avoid pitfalls
• become productive with UVM (saves ~ 6 weeks)
• use UVM consistently
• Reduce the burden of supporting UVM code

© Accellera Systems Initiative 10


Easier UVM Coding Guidelines

• 180 detailed guidelines with explanations and examples


• Consistent with code generator
• Common sense

Consistency
Avoiding pitfalls
Reusability
High quality verification

© Accellera Systems Initiative 11


Easier UVM:
Learning and Using UVM with a Code Generator

• Introduction to UVM
• Easier UVM?
• The Easier UVM Code Generator
• Reporting
• Phases and Configuration
• TLM Connections
• The Factory
• Sequences and Tests

© Accellera Systems Initiative 12


Ways to Use the Code Generator

• Generate examples simply as a learning aid

• Create an initial framework for production code

• Continue to regenerate the code throughout the project

© Accellera Systems Initiative 13


Code Generator Inputs and Outputs
Input Files Script Output Files

Interface Template generated_tb


Interface Template
Interface
File Template
File
File Code Generator dut

Common Template
File sim

Simulation scripts
Design Under
Pin List File
Test
tb
<agent>
<agent>
<agent>
DUT Directory
files.f
<top>

Include Directory <top_test>

include
User-defined code
fragments inserted into
generated code

© Accellera Systems Initiative 14


Download Easier UVM

http://www.doulos.com/easier

easier_uvm_gen.pl
release_notes
examples
example_templates
minimal
minimal_plus
minimal_reg
multi_if

© Accellera Systems Initiative 15


From the Command Line

unzip easier_uvm_gen-2015-06-29.zip
cd examples/minimal_plus

Run the code generator

perl ../../easier_uvm.pl clkndata.tpl

cd generated_tb/sim

Run your simulator

compile_ius.sh

or compile_vcs.sh

or vsim –c –do "do compile_questa.do; run –all"

or cd ../dut
vsimsa –do ../sim/compile_riviera.do

© Accellera Systems Initiative 16


Generated Files
tb/clkndata/sv/ Per-agent tb/top/sv/ Env
clkndata_data_tx.sv Transaction top_config.sv
top_env.sv
clkndata_if.sv Interface
top_seq_lib.sv
clkndata_config.sv top_pkg.sv

clkndata_driver.sv
tb/top_test/sv/ Test
clkndata_monitor.sv Agent top_test.sv
clkndata_sequencer.sv top_test_pkg.sv

clkndata_agent.sv
tb/top_tb/sv/ Modules
clkndata_coverage.sv top_tb.sv
clkndata_seq_lib.sv Sequences top_th/sv

clkndata_pkg.sv Package
tb/include User-defined

© Accellera Systems Initiative 17


Through Code Generation to the Simulator
Interface template: 1 agent + 1 interface
agent_name = clkndata
trans_item = data_tx
trans_var = rand byte data; UVM component hierarchy
driver_inc = clkndata_do
monitor_inc = clkndata_do  uvm_test_top
agent_cover_inc = clkndata_co
agent_seq_inc = my_clkndata  m_env
agent_factory_set = clkndata_

if_port = logic clk;  m_clkndata_coverage


if_port = byte data; Code
if_clock = clk
Simulator  m_clkndata_agent
Generator
Common template  m_sequencer
dut_source_path = mydut
dut_top = mydut  m_monitor
dut_pfile = pinlist
inc_path = include
 m_driver
Pin list
!clkndata_if
clk clk
data data

perl ../../easier_uvm.pl clkndata.tpl

© Accellera Systems Initiative 18


Modules and UVM Objects
Top

Test Harness module hierarchy

Interface
in uvm_config_db
Test
Config
Env Virtual seq

Subsc'r
Config
uvm_component Agent
quasi-static
Sequ'r Seq Trans

Driver
uvm_object
Monitor dynamic
© Accellera Systems Initiative 19
Easier UVM:
Learning and Using UVM with a Code Generator

• Introduction to UVM
• Easier UVM?
• The Easier UVM Code Generator
• Reporting
• Phases and Configuration
• TLM Connections
• The Factory
• Sequences and Tests

© Accellera Systems Initiative 20


Transaction Class
`ifndef CLKNDATA_SEQ_ITEM_SV
`define CLKNDATA_SEQ_ITEM_SV

class data_tx extends uvm_sequence_item;


`uvm_object_utils(data_tx)

rand byte data; User-defined in template file

extern function new(string name="");


extern function void do_copy(uvm_object rhs);
extern function bit do_compare(uvm_object rhs, uvm_comparer comparer);
extern function void do_print(uvm_printer printer);
extern function void do_record(uvm_recorder recorder);
extern function string convert2string();

endclass : data_tx

function void data_tx::do_copy(uvm_object rhs);


data_tx rhs_;
if (!$cast(rhs_, rhs))
`uvm_fatal(get_type_name(), "cast of rhs object failed") UVM reporting
super.do_copy(rhs);
data = rhs_.data;
endfunction : do_copy

© Accellera Systems Initiative 21


Reporting
id Verbosity

`uvm_info (get_type_name(), "Message", UVM_MEDIUM)

`uvm_warning(get_type_name(), "Message")

`uvm_error (get_type_name(), "Message")

`uvm_fatal (get_type_name(), "Message")

UVM_WARNING foo.sv(320) @ 105: uvm_test_top.env.path [data_tx] Bad!

Severity File Line Time Instance id Message

© Accellera Systems Initiative 22


Verbosity
id Verbosity

`uvm_info (get_type_name(), "Message", UVM_MEDIUM)

`uvm_warning(get_type_name(), "Message")

`uvm_error (get_type_name(), "Message")

`uvm_fatal (get_type_name(), "Message")

simulator ... +UVM_VERBOSITY=UVM_FULL Report all info messages

simulator ... +UVM_VERBOSITY=UVM_NONE Report only UVM_NONE messages

© Accellera Systems Initiative 23


Easier UVM:
Learning and Using UVM with a Code Generator

• Introduction to UVM
• Easier UVM?
• The Easier UVM Code Generator
• Reporting
• Phases and Configuration
• TLM Connections
• The Factory
• Sequences and Tests

© Accellera Systems Initiative 24


Execution Phases
build

connect
Env
pre_reset
Virtual seq
end_of_elaboration
reset
post_reset
Subsc'r

start_of_simulation pre_configure
configure
post_configure Agent
run Sequ'r Seq
pre_main
main
extract post_main
Monitor Driver
check pre_shutdown
shutdown
post_shutdown
report

final
© Accellera Systems Initiative 25
Configuration Database
module top
Configuration database
Config
set
Scope Name = Value
Scope Name = Value
Scope Name = Value
Test
Env get
Agent Config
Sequ'r

Monitor Driver

Test
harness interface

DUT

© Accellera Systems Initiative 26


Env and Agent Configuration Objects
Top-level module
set

Test get & modify


Config
Top-level env
get set
set Env

Config Config
Agent Agent
get get

Sequ'r Sequ'r

Monitor Driver Monitor Driver

© Accellera Systems Initiative 27


Configuration Class
// You can insert code here by setting agent_config_inc_before_class

class top_config extends uvm_object;

virtual clkndata_if clkndata_vif;

uvm_active_passive_enum is_active_clkndata = UVM_ACTIVE;


bit checks_enable_clkndata;
bit coverage_enable_clkndata;

// You can insert variables here by setting config_var in clkndata.tpl

extern function new(string name = "");

// You can insert code here by setting agent_config_inc_inside_class

endclass : top_config

function top_config::new(string name = "");


super.new(name);
endfunction : new

// You can insert code here by setting agent_config_inc_after_class

© Accellera Systems Initiative 28


Inserting User-Defined Code Fragments

Common Template File


file.sv
top_env_inc_after_class = file.sv inline

top_env_generate_methods_after_class = no

class top_env extends uvm_env;


...
extern function void build_phase(uvm_phase phase);
Code
extern function void connect_phase(uvm_phase phase);
Generator
extern task run_phase(uvm_phase phase);
...
endclass : top_env

// Start of inlined include file generated_tb/include/file.sv


...
// End of inlined include file

© Accellera Systems Initiative 29


Template Settings

Test Config
Env
Env
Virtual seq
_generate_methods_inside_ Subsc'r
_generate_methods_after_

_inc_before_ Config
_inc_inside_ Agent
Sequ'r Seq
_inc_after_

_prepend_to_build_phase
Monitor Driver
_append_to_build_phase
_append_to_connect_phase

Test
harness Interface

DUT

© Accellera Systems Initiative 30


Top-Level Module
module top_tb;

...

top_th th(); Test harness

top_config env_config;

initial
begin
env_config = new("env_config");
if ( !env_config.randomize() )
`uvm_fatal("top_tb", "Failed to randomize config object")

env_config.clkndata_vif = th.clkndata_if_0;
env_config.is_active_clkndata = UVM_ACTIVE;
env_config.checks_enable_clkndata = 1;
env_config.coverage_enable_clkndata = 1;

uvm_config_db #(top_config)::set(
null, "uvm_test_top.m_env", "config", env_config); config_db

run_test();
end
endmodule

© Accellera Systems Initiative 31


Top-Level Env
function void top_env::build_phase(uvm_phase phase);
`uvm_info(get_type_name(), "In build_phase", UVM_HIGH)

// You can insert code here by setting top_env_prepend_to_build_phase

if (!uvm_config_db #(top_config)::get(this, "", "config", m_config))


`uvm_error(get_type_name(), "Unable to get top_config")

m_clkndata_config = new("m_clkndata_config");
m_clkndata_config.vif = m_config.clkndata_vif;
m_clkndata_config.is_active = m_config.is_active_clkndata;
m_clkndata_config.checks_enable = m_config.checks_enable_clkndata;
m_clkndata_config.coverage_enable = m_config.coverage_enable_clkndata;

// You can insert code here by setting agent_copy_config_vars

uvm_config_db #(clkndata_config)::set(
this, "m_clkndata_agent", "config", m_clkndata_config);
config_db

if (m_config.is_active_clkndata == UVM_ACTIVE )
uvm_config_db #(clkndata_config)::set(
this, "m_clkndata_agent.m_sequencer", "config", m_clkndata_config);
...

© Accellera Systems Initiative 32


Agent Class – Build Phase
function void clkndata_agent::build_phase(uvm_phase phase); config_db
if (!uvm_config_db #(clkndata_config)::get(this, "", "config", m_config))
`uvm_error(get_type_name(), "clkndata config not found")

m_monitor = clkndata_monitor ::type_id::create("m_monitor", this);

if (get_is_active() == UVM_ACTIVE)
begin
m_driver = clkndata_driver ::type_id::create("m_driver", this);
m_sequencer = clkndata_sequencer_t::type_id::create("m_sequencer", this);
end
Factory methods
endfunction : build_phase

Config
Agent
Sequ'r

Active vs passive

Monitor Driver

© Accellera Systems Initiative 33


Easier UVM:
Learning and Using UVM with a Code Generator

• Introduction to UVM
• Easier UVM?
• The Easier UVM Code Generator
• Reporting
• Phases and Configuration
• TLM Connections
• The Factory
• Sequences and Tests

© Accellera Systems Initiative 34


TLM, UVM-Style

Export Port

Sequencer Driver

task get(REQ t); seq_item_port.get(req);

© Accellera Systems Initiative 35


TLM, UVM-Style

Export Port

Sequencer Driver

Provides the get()


uvm_seq_item_pull_imp #(REQ) seq_item_export;

uvm_seq_item_pull_port #(REQ) seq_item_port;


Requires a get()

m_driver.seq_item_port.connect( In agent

m_sequencer.seq_item_export);

© Accellera Systems Initiative 36


Driver Class – Run Phase
task clkndata_driver::run_phase(uvm_phase phase);
`uvm_info(get_type_name(), "run_phase", UVM_HIGH)

forever
begin
seq_item_port.get_next_item(req); Get transaction from sequencer
`uvm_info(get_type_name(), {"req item\n",req.sprint}, UVM_HIGH)
do_drive();
seq_item_port.item_done();
end
endtask : run_phase

Interface template file


driver_inc = clkndata_do_drive.sv inline

// Start of inlined include file generated_tb/tb/include/clkndata_do_drive.sv


task clkndata_driver::do_drive();
vif.data <= req.data;
@(posedge vif.clk); Wiggle pins of DUT
endtask
// End of inlined include file
© Accellera Systems Initiative 37
Agent Connect Phase

function void clkndata_agent::connect_phase(uvm_phase phase);

if (m_config.vif == null)
`uvm_fatal(get_type_name(), "clkndata virtual interface is not set!")

m_monitor.vif = m_config.vif;
m_monitor.analysis_port.connect(analysis_port);

if (get_is_active() == UVM_ACTIVE)
begin
m_driver.seq_item_port.connect(m_sequencer.seq_item_export); TLM connections
m_driver.vif = m_config.vif;
end
endfunction : connect_phase

© Accellera Systems Initiative 38


Analysis Port
function void write(input data_tx t);
...

Subscriber Subscriber Subscriber

uvm_analysis_export

Readonly, non-blocking
uvm_analysis_port
Agent

Sequencer

Export

uvm_analysis_port Port

port.write(tx); Monitor Driver

© Accellera Systems Initiative 39


Monitor Class
class clkndata_monitor extends uvm_monitor;

`uvm_component_utils(clkndata_monitor)

virtual clkndata_if vif;

uvm_analysis_port #(data_tx) analysis_port; TLM port


data_tx m_trans;

extern function new(string name, uvm_component parent);


extern task run_phase(uvm_phase phase);
extern task do_mon();

endclass : clkndata_monitor

© Accellera Systems Initiative 40


Monitor Class – Run Phase
task clkndata_monitor::run_phase(uvm_phase phase);
`uvm_info(get_type_name(), "run_phase", UVM_HIGH)

m_trans = data_tx::type_id::create("m_trans"); Factory method


do_mon();
endtask : run_phase

Interface template file


monitor_inc = clkndata_do_mon.sv inline

// Start of inlined include file generated_tb/tb/include/clkndata_do_mon.sv


task clkndata_monitor::do_mon;
forever @(posedge vif.clk)
begin
m_trans.data = vif.data;
analysis_port.write(m_trans);
end
endtask
// End of inlined include file

© Accellera Systems Initiative 41


Easier UVM:
Learning and Using UVM with a Code Generator

• Introduction to UVM
• Easier UVM?
• The Easier UVM Code Generator
• Reporting
• Phases and Configuration
• TLM Connections
• The Factory
• Sequences and Tests

© Accellera Systems Initiative 42


The Factory
data_tx m_trans;

task clkndata_monitor::run_phase(uvm_phase phase);

// m_trans = new; Always creates a data_tx

© Accellera Systems Initiative 43


The Factory
data_tx m_trans;

task clkndata_monitor::run_phase(uvm_phase phase);

// m_trans = new; Always creates a data_tx

m_trans = data_tx::type_id::create("m_trans");

Can be overridden

class my_tx extends data_tx;


...

Interface template file


agent_factory_set = data_tx my_tx

data_tx::type_id::set_type_override( my_tx::get_type() );

© Accellera Systems Initiative 44


Easier UVM:
Learning and Using UVM with a Code Generator

• Introduction to UVM
• Easier UVM?
• The Easier UVM Code Generator
• Reporting
• Phases and Configuration
• TLM Connections
• The Factory
• Sequences and Tests

© Accellera Systems Initiative 45


Ways to Instantiate an Agent
At the top level In its own env In another env

Env Env Env

Coverage A Env A Env A

Agent A Coverage A Coverage A

Agent A Agent A
Coverage B

Agent B Coverage B

Coverage B
Agent B

agent_has_env = no Agent B

Interface template file

agent_has_env = yes additional_agent = B

© Accellera Systems Initiative 46


How the Agent is Instantiated
Interface template file
number_of_instances = 2 agent_is_active = UVM_ACTIVE

Env
Env

Agent
Env A

Sequencer
Coverage A
Driver
Agent A
Monitor

Coverage A

Agent A
agent_is_active = UVM_PASSIVE

Env

Agent

Monitor

© Accellera Systems Initiative 47


Sequence Organization

Test
Factory overrides

Top-level env
Virtual seq Default sequences

Env
Virtual seq

Agent Agent
Sequ'r Seq Sequ'r Seq

Monitor Driver Monitor Driver

© Accellera Systems Initiative 48


Test
Interface template file
test_prepend_to_build_phase = test_prepend_to_build_phase.sv inline
agent_factory_set = clkndata_default_seq my_clkndata_seq

function void top_test::build_phase(uvm_phase phase);

// Start of inlined include file .../include/test_prepend_to_build_phase.sv

if (!uvm_config_db #(top_config)::get(this, "m_env", "config", m_config))


`uvm_error(get_type_name(), "Unable to get top_config")
m_config.coverage_enable = 0; Modify config
// End of inlined include file

Factory override
clkndata_default_seq::type_id::set_type_override(
my_clkndata_seq::get_type());

m_env = top_env::type_id::create("m_env", this);

endfunction : build_phase

© Accellera Systems Initiative 49


Top-Level Env – Run Phase
Test

Top-level env
Virtual seq

Env
Virtual seq

Agent Agent
Sequ'r Seq Sequ'r Seq

Monitor Driver Monitor Driver

task top_env::run_phase(uvm_phase phase);


top_default_seq vseq;
vseq = top_default_seq::type_id::create("vseq");
if ( !vseq.randomize )
`uvm_fatal(get_type_name(), "Failed to randomize sequence")
vseq.m_clkndata_agent = m_clkndata_agent;
vseq.set_starting_phase(phase);
vseq.start(null);
endtask : run_phases

© Accellera Systems Initiative 50


Virtual Sequence
class top_default_seq extends uvm_sequence #(uvm_sequence_item);
`uvm_object_utils(top_default_seq)
Test

extern function new(string name = ""); Top-level env


Virtual seq

extern task body();


endclass : top_default_seq Env
Virtual seq

...
Agent Agent
Sequ'r Seq Sequ'r Seq

task top_default_seq::body();
repeat(m_seq_count) Monitor Driver Monitor Driver

begin
fork
if (m_clkndata_agent.m_config.is_active == UVM_ACTIVE)
begin
clkndata_default_seq seq;
seq = clkndata_default_seq::type_id::create("seq");
if ( !seq.randomize() )
...
seq.start(m_clkndata_agent.m_sequencer, this);
end
... // Other agents
join
end
endtask : body

© Accellera Systems Initiative 51


Agent Sequence
Test

Top-level env
Virtual seq

Env
Virtual seq

Agent Agent
task clkndata_default_seq::body(); Sequ'r Seq Sequ'r Seq

Monitor Driver Monitor Driver

req = data_tx::type_id::create("req");
start_item(req);
if ( !req.randomize() )
`uvm_error(get_type_name(), "Failed to randomize transaction")
finish_item(req);

endtask : body
create - start_item – randomize - finish_item

© Accellera Systems Initiative 52


Summary 1

• UVM is a widely used standard


• UVM captures best practice and enables reuse

• UVM is not easy!


• The Easier UVM Code Generator can help

© Accellera Systems Initiative 53


Summary 2
Input Files Script Output Files

Interface Template generated_tb


Interface Template
Interface
File Template
File
File Code Generator dut

Common Template
File sim

Simulation scripts
Design Under
Pin List File
Test
tb
<agent>
<agent>
<agent>
DUT Directory
files.f
<top>

Include Directory <top_test>

include
User-defined code
fragments inserted into
generated code

© Accellera Systems Initiative 54


Any Questions?

© Accellera Systems Initiative 55

You might also like