100% found this document useful (1 vote)
471 views

Verification Academy - UVM OOP Basics

The document discusses object-oriented programming concepts in SystemVerilog including inheritance, polymorphism, and extending classes. It provides examples of extending class properties and methods, constructing extended classes, class variables with inheritance, dynamic casting of class handles, virtual class methods, mixing virtual and non-virtual methods, and accessibility and abstract classes.

Uploaded by

manchurico
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
471 views

Verification Academy - UVM OOP Basics

The document discusses object-oriented programming concepts in SystemVerilog including inheritance, polymorphism, and extending classes. It provides examples of extending class properties and methods, constructing extended classes, class variables with inheritance, dynamic casting of class handles, virtual class methods, mixing virtual and non-virtual methods, and accessibility and abstract classes.

Uploaded by

manchurico
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 14

SystemVerilog OOP for UVM Verification

Inheritance & Polymorphism


Dave Rich
Verification Architect

[email protected] | www.verificationacademy.com
Extending SystemVerilog Classes
• Inherit or extend properties and methods from
other classes
• Original class is the base or super class
• Extended class is the derived or sub-class
• Allows customization without breaking or
rewriting known-good functionality in the base
class

© Mentor Graphics Corporation, all rights reserved.


Extending Class Properties
• Inheritance creates a new class type based on an existing class type
typedef enum {IDLE, RUN, ...} cmd_t; class ErrorPkt extends Packet;
class Packet; bit Error;
cmd_t Command; endclass : ErrorPkt
int Status;
logic [31:0] Data [0:255];
endclass : Packet

Almost the class ErrorPkt;


same as cmd_t Command;
int Status;
logic [31:0] Data [0:255];
bit Error;
endclass : ErrorPct

© Mentor Graphics Corporation, all rights reserved.


Extending Class Methods
• Add new method or add new behavior of an existing method
typedef enum {IDLE, RUN, ...} cmd_t; class ErrorPkt extends Packet;
class Packet; bit Error;
cmd_t Command; function bit ShowError();
int Status; return(Error);
logic [31:0] Data [0:255]; endfunction
function void SetStatus (input int a); function
function void
void SetStatus
SetStatus (input
(input int
int a);
a);
Status = a; Status =
if (Error)a + 1;
endfunction endfunction
super.SetStatus(a+1);
endclass
else : ErrorPkt
endclass : Packet super.SetStatus(a);
endfunction

super. looks back from


the base class

© Mentor Graphics Corporation, all rights reserved.


Constructing Extended Classes

class thing; class thing;


string name; string m_name;
function new; function new( string name );
name = “thing”; m_name = name;
endfunction endfunction
endclass endclass
class component extends thing; class component extends thing;
int id; int id;
function new; call to base function new;
super.new(); constructor must super.new( “component” );
id = 1; be first id = 1;
endfunction statement endfunction need explicit
endclass endclass call to new()
with arguments

© Mentor Graphics Corporation, all rights reserved.


Class Variables with Inheritance
• Base class variable can hold handles to
extended objects, but not the reverse
class Packet; begin
cmd_t Command; Packet Pkt_h;
int Status;
logic [31:0] Data [0:255];
ErrorPkt Epkt_h;
function void SetStatus (input int a); Epkt_h = new;
Status = a; Epkt_h.Command = RUN;
endfunction Epkt_h.Error = 1;
endclass : Packet Epkt_h.SetStatus(1); // Status == 2
class ErrorPkt extends Packet;
bit Error;
Pkt_h = Epkt_h;
function bit ShowError(); Pkt_h.Command = IDLE;
return(Error); Pkt_h.SetStatus(1); // Status == 1
endfunction Pkt_h.Error = 0; // compiler error
function void SetStatus (input int a); Pkt_h = new;
Status = a + 1;
endfunction
Epkt_h = Pkt_h; // compiler error
endclass : ErrorPkt // Epkt_h.Error would not exist

© Mentor Graphics Corporation, all rights reserved.


Dynamic Casting of Class handles
E A int v
u class type available vars
x p A v
t - F extends A v,w
e F int w
B int x c B extends A v,x
n a
d G extends B v,x,y
s
G int y
C int z
s
C extends B v,x,z
t
function void func(A a_h);
G g_h; C c_h; • up-casting is always legal via
$display(a_h.v); direct assignment
if ( $cast(c_h, a_h) )
$display(c_h.z); • down-casting requires a run-
else if ( $cast(g_h, a_h) ) time check using $cast
$display(g_h.y);
endfunction
© Mentor Graphics Corporation, all rights reserved.
Polymorphism
• Ability to have the same code act differently for
different types
• A key requirement for any OOP Language
• Statically at compile time by using parameterized
types
• Dynamically during run-time using virtual class
methods

© Mentor Graphics Corporation, all rights reserved.


Virtual Class Methods
• Chose the method by the object type, not the class variable
typedef enum {IDLE, RUN, ...} cmd_t; class ErrorPkt extends Packet;
class Packet; bit Error;
cmd_t Command; virtual function void SetStatus
int Status; (input int a);
logic [31:0] Data [0:255]; Status = a + 1;
endfunction
virtual function void SetStatus
endclass : ErrorPkt
(input int a);
Status = a;
endfunction task run(Packet p_h);
endclass : Packet …
p_h.SetStatus(5);
$display(p_h.status); // 5 or 6
• Override must have the same …
endtask
prototype
• Once virtual -> Always virtual
© Mentor Graphics Corporation, all rights reserved.
Mixing Virtual and Non-Virtual Methods
• Clone is construction with copy
class A;
class B extends A;
int p1; class C extends B;
int p2;
virtual function A clone(); int p3;
virtual function A clone();
A h = new; virtual function A clone();
B h = new;
h.copy(this); C h = new;
h.copy(this);
return h; h.copy(this);
return h;
endfunction return h;
endfunction
function void copy(A rhs); endfunction
function void copy(B rhs);
this.p1 = rhs.p1; function void copy(C rhs);
this.p2 = rhs.p2;
endfunction this.p3 = rhs.p3;
super.copy(rhs);
endclass super.copy(rhs);
endfunction
endfunction
endclass
endclass
task burst(A a_h, int N);
repeat (N)
send( a_h.clone() );
endtask Each call to send() gets a new
task send(A a_h); object that is a full copy of

endtask the object passed into burst()
© Mentor Graphics Corporation, all rights reserved.
Accessibility and Abstract Classes
• By default, all members of a class are publically visible
• If you have a handle to an object, you can access any member
• local qualifier restricts access to only within the declared class
• protected qualifier restricts access to only within the declared
class and an extension of that class
• Abstract class can never be constructed directly
• Can construct class extended from abstract class
• Provide common API for class methodology
• Can declare virtual method prototypes that must be overridden in
extended class

© Mentor Graphics Corporation, all rights reserved.


Abstract Class example
virtual class Component; Abstract class declared
local Component children[$]; with virtual keyword
protected string m_name;
function new (string name,
Component parent);
local limits access outside base class
m_name = name; protected limits access outside class
if (parent != null)
parent.children.push_back(this);
Since function is declared as pure
endfunction : new
pure virtual function void print(); virtual, an implementation must be
function void printtree(); provided in the extended class
foreach (children[child])
children[child].printtree();
this.print();
endfunction : printtree
endclass : Component

© Mentor Graphics Corporation, all rights reserved.


Extending Abstract Class into Concrete

initial begin
class MyComponent extends Component; MyComponent m1,m2,m3,m4;
function new(string name, m1 = new(“roof”,null);
Component parent); m2 = new(“kitchen”,m1); stove
super.new(name, parent); m3 = new(“bedroom”,m1); kitchen
endfunction : new m4 = new(“stove”,m2); bedroom
virtual function void print(); m1.printtree(); roof
$display(m_name); m1.m_name = “off”; // illegal
endfunction m1.print;
endclass : MyComponent end

© Mentor Graphics Corporation, all rights reserved.


SystemVerilog OOP for UVM Verification
Inheritance & Polymorphism
Dave Rich
Verification Architect

[email protected] | www.verificationacademy.com

You might also like