System Verilog 的类不仅提供了数据定义还提供了操作数据的函数(function)或任务(task),一般称为方法。在上节内容中已经简单介绍了方法的使用,如利用task定义了ADD方法。类里的方法可以直接访问类定义的数据。
-
数据成员的设置和访问
对象的数据成员可以通过对象的句柄来访问,也可以通过定义成员的方法来访问。例1演示了通过get和set进行数据。
例1:
class myclass; int number; task set (input int i); number=i; endtask function int get(); return number; endfunction endclass
在例1定义的类中可以利用对象的句柄直接访问,如:
myclass C1=new;
initial begin
C1.number =4; // 直接访问(设置)
$display(“C1.number=: %d”, C1.number); // 直接访问(引用)
end
在例1中可以使用get和set方法进行访问,如:
myclass C2=new;
initial begin
C1.set(3);//
$display(“C1.number=: %d”, C1.get()); // 方法访问(引用)
end
从上面的例子可以看出,对象的成员既可以直接访问(利用对象的句柄引用),也可以通过成员函数或人物进行设置或访问。那么利用成员函数访问有什么优点呢?
从数据的安全性考虑,利用成员函数访问可以根据数据的特点加以限制,从而保证数据在合理的范围之内。如上例中number 如果代表学生的成绩,则学生的成绩应该在0-100之间。如果直接引用可能会出现负值或大于100的值,这些值不是期望的值,可能是误输入或其它原因造成。如果采用方法操作,可以对输入数据加以限定。
例2: 利用成员函数对输入输出数据加以限制。
class myclass;
int number;
task set (input int i);
if((i>=0)&&(i<=100))
number=i;
else
$dispaly("The input value is not belong to proper range, please check the input value");
endtask
function int get();
if((number>=0)&&(number<=100))
return number;
else
$dispaly(" the member value out of range[0:100]: number=%d , please please modify the member value",number);
endfunction
endclass
这些好的编程习惯在利用System Verilog 验证编程中应注意使用,慢慢养成好的编程习惯。
2.构造函数
- 缺省的构造函数
在上节内容中已经介绍,定义的类并不能生成实体,也就是类是抽象的,不能直接使用。因此类必须通过例化生成对象才能使用。但例化后还要对成员变量进行初始化,对对象的指针(handle)进行初始化。因此类有一个缺省的方法new, 该方法有系统提供,不用在类中明确写出,该特殊的方法称为构造器。如:
myclass C2=new;
该方法根据数据类型的特点赋初值,如integer变量赋初值为0; reg, logic变量初值也赋值0,对于bool变量赋值“false” 等。同时系统给句柄赋值,以后就可以利用对象名称引用方法或成员。
- 重载构造函数
有时缺省的构造函数并不满足我们的要求,就可以对构造函数进行重载。重载构造函数一定要使用同名方法new。
例3:构造函数重载。
class myclass; int number; task set (input int i); number=i; endtask function new(); number=5; endfunction function int get(); return number; endfunction endclass
在例3中明确定义了方法new(),而且与缺省的构造函数同名。对象生成并构造时,系统会先引用类中的构造函数,如果没有重载才会引用缺省构造函数。构造函数重载时需要注意和其他方法不同的地方,(1)没有return语句,(2)没有函数返回类型。如:
function new();
number=5;
endfunction
也可以明晰的提供成员的初始值,如例4:
例4: 构造函数的多重重载
class myclass; int number; task set (input int i); number=i; endtask function new(); number=5; endfunction function new(input int i ); number=i endfunction function int get(); return number; endfunction endclass
例4中提供了两种重载构造函数的方法,其中一种带有输入参数,可以根据需要初始化成员变量。如:
myclass C3=new(8);//则对象(object) C3的成员变量的初值为8.
myclass C4=new();//则对象(object) C4的成员变量的初值为5.
因此合理使用构造函数重载,为对象提供不同的对成员变量赋初值的方法,合理使用可以使程序设计灵活多变,简化大型复杂程序的设计。
注意:不仅构造函数可以重载,类中的任何方法都可以重载,关于重载的使用详解请关注后续内容。