SystemVerilog Datatype: Class (Part 1)
A new entrant in SystemVerilog, the class datatype brings in
the essence of object oriented programming to the language. However,
as you will see in this article, you do not need to know object oriented
programming methodology to appreciate -- or even use -- the power of
class.
So, What's in a Class ?
A class is a collection of two types of things: some data and a set of
subroutines (i.e. Verilog tasks and functions) that operate on that data.
Each data part of a class is known as a class property (or, simply
property) and a subroutine defined in a class is called a class
method (or, just method).
Here, the important thing to remember is that a method has access
to the properties of the same class only. Barring few exceptions, a class
method can not operate on properties outside the scope of the same class.
Let us see an example of a class. The following example is from a
hardware model of a graphics engine. A graphics engine manages a
display by drawing and re-drawing various parts of the display. In order
to draw or paint a segment of the display, the engine divides it into
multiple triangular spaces and then paints the area of each triangle
with a given color.
Before we build this model, we notice that each triangle is an
independent entity that needs to be managed separately. However,
once the triangles are defined (in terms of the co-ordinates of
their vertices), the same set of functions (paint a triangle with
a given color, keep track of when this triangle was last updated
and so on) apply to all triangles.
This creates an opportunity for us to represent each triangle as a
class.
We create a class that defines and operates on a triangular space
of a display screen. This class Triangle has four properties
and three methods - seven members in all.
The first property lastFillTime is a variable of type time that
denotes the time when a traingular space was last filled up with some color.
The triangular space itself is defined by the three vertices contained in
the variables p1, p2 and p3 of union type point
defined earlier. Needless to say, you can have as
many properties in a class and of as many varied types as you want.
The methods that work on these properties are defined below that. The
function new() creates a new triangle, the task fillIt()
fills the triangle with a specified color (passed as an argument) and,
lastly, the function isFilled() returns a boolean variable that indicates
if the triangle is filled.
class Triangle;
// class properties
time lastFillTime;
point p1, p2, p3;
// class methods
// initialization
function new()
... // all initialization goes here
endfunction
// fill the triangle with the color defined by
// the rgb structure
task fillIt (struct rgb color);
... // details on how to fill
endtask
// is the triangle filled?
function bit isFilled();
... // details here
endfunction
endclass
We skip the details of the internal structure of the subroutines as
they are not relevant for our discussion. However, the rest of the
definition will be good enough for us to understand various interesting
aspects of a class - starting with the notion of object instance and
object handle.
Next: Object instance and
object handle
|