System Verilog OOP: encapsulation, inheritance, and polymorphism

Keywords: systemverilog SV

1. Three basic characteristics of object-oriented

Object: everything is an object
Class: a class is an abstract collection of objects with the same properties and behavior
Instance: an object is an instance of a class

Encapsulation can hide the implementation details and make the code modular; Inheritance can extend existing code modules, both for code reuse, and polymorphism for another purpose - Interface reuse.

1.1 difference between Class 1 and structure

A structure can define a type, and a class is also a type. The similarities and differences between that class and a structure are as follows:

  • Both can define data members themselves
  • Class needs to be built after variable declaration to create object entity; struct has opened up memory when variables are declared
  • Classes can declare methods and tasks, but structs cannot
  • Fundamentally, struct is a data structure, while class contains data members and operation methods for members

2. Packaging

Encapsulation for information hiding, using abstract data types to encapsulate data and data-based operations, hide some internal details as much as possible, and only retain some external interfaces to make them contact with the outside. Data encapsulation, method encapsulation.
When new() is constructed, it does not need to return a value, and the function will implicitly return the instantiated object pointer.

//Declaration class
class Transaction;
	bit[31:0] addr,crc;
	function new();
		...
	endfunction
endclass:Transaction
//Declare a handle
Transaction tr,tr1,tr2;//The pointer is null and does not point to any object
Transaction tr = new();//Declare handle + create object and assign an address to the object
//create object
tr1 = new(); //Assign handle to tr1
tr2 = tr1;//Assign the value of tr1 to tr2, that is, tr1 and tr2 point to the same object
tr2 = new();//Assign handle to tr2

Note: the variables defined in the class cannot be wire and reg, nor initial and always, that is, parts of the hardware world cannot be defined in the software world.
When new() is called, the system steps are as follows:
1. System development space;
2. Allocate the opened space to the variable and enter the new() function to initialize the variable
3. When exiting new(), return the handle of the current object
Note: when the new() function creates an object, it assigns an address to the object and initializes the variables in the class (the binary variable is 0 and the Quaternary variable is x).
System Verilog automatically reclaims space. When an object is no longer needed anywhere in the whole program, it will be "destroyed", that is, reclaim its space.
Variables declared in a class are dynamic (as opposed to module), but static variables can be declared with static.
To declare a pointer to an interface in a class, you must add virtual

class TB;
	static int count = 0;//Declare a static variable
	local virtual interface_test it;//Declare a pointer
endclass

3. Succession

Subclasses inherit all member methods and properties of the parent class, and can have their own characteristics. Implement inheritance through the keyword extends to solve the reusability of code.

  • Subclasses have non private properties and methods of the parent class.
  • Subclasses can have their own properties and methods, that is, subclasses can extend the parent class.
  • Subclasses can implement the methods of their parent classes in their own way.

3.1 member access rights

  • By default, both subclasses and external can be accessed
  • protected only this class and subclasses can be accessed, but not externally
  • local is accessible only by this class, but not by subclasses or outside

3.2 difference between this and super

  • this will search in the current scope first. If it is not in the current scope, it will search in the previous scope until the variable is found
  • super will first find the parent class of this class
class Father
	string name = "father";
	function new(string name);
		this.name = name;
	endfunction
endclass
class Son extends Father;
	int son_age = 5;
	function new(string name);
		super.new(name);
		name = "son";
		son_age = 15;
	endfunction
endclass

3.3 method of class

Class method -- that is, the internal task or function defined by the scope of the class

class Transaction;
	bit [31:0] addr,crc,data[8];
	function void display();
		$diaplay("@%0t:TR addr = %h,crc = %h",$time,addr,crc);
		$write("\tdata[0-7]=");
		foreach(data[i]) $write(data[i]);
		$display();
	endfunction
endclass

class PCI_tran;
	bit [31:0] addr,data;
	function void display();
		$display("@a%0t:PCI:addr = %h",$time,addr,data);
	endfunction
endclass

Transaction t;//Declaration handle
PCI_Tran pc;

initial begin
	t=new();//Create a Transaction object
	t.display();//Call the method of the transfer
	pc=new();//Create a PCI transaction
	pc.display();//Method of calling PCI transaction
end

4. Polymorphism

"One interface, multiple methods". The same operation acts on different objects, can have different interpretations and produce different execution results.

Three conditions for polymorphism:

  • Existence of inheritance
  • Subclasses override methods of the parent class
  • The parent class reference variable points to the child class object
    overload and override are two main ways to realize polymorphism.

Posted by 9911782 on Mon, 06 Dec 2021 12:16:05 -0800