(一)class
- 面向对象编程的三要素:封装、继承和多态。
一、类和对象
1.class类
- class类包含成员变量(property)和成员方法(method)的声明,属于软件的范畴,只能定义软件变量(reg和wire等硬件信号是不能用的),且默认其生命周期是动态的。此外,class可以通过interface作为媒介获取硬件信号。
2.object对象和handle句柄
- object对象是类的实例,类的例化可以在任意时间点发生;handle句柄是用来指向对象的指针(悬空的句柄为
null
),示例如下。
Example ex; //声明句柄
ex = new(); //创建对象
3.创建对象
- 每个class的都需要有new()函数,该函数为系统预留函数,也可进行自定义。不需指定返回值。
- 在创建对象后,该对象的空间位置不会更改,指向该空间的句柄可以有多个,当没有句柄指向该对象时,sv会自动回收空间。
4.静态变量与静态方法
- 使用
static
来声明class内的变量则是静态变量,该类无论例化多少个对象,都会共享一个同名的静态变量。 - 静态方法中可以声明并使用动态变量,但是不能使用类的动态成员变量。(在使用静态方法是可能并没有创建具体的对象,也就并没有为动态成员变量开辟空间)
- 静态方法可以使用类的静态成员变量。二者都在编译阶段就开辟了对应的内存空间。
二、类成员的封装性
- 成员默认类型为
public
,子类和外部均可访问。 - 指明
protected
则只有该类或者子类可以访问。 - 指明
local
则只有该类可以访问成员。 this.xx
表明调用的成员为当前类的成员。
三、类的继承
- 继承的关键字为
extends
class son extends father;
...
endclass
- 通过
super
来索引父类的同名函数。子类在定义new函数时应首先通过super.new()
调用父类的new函数,若父类new函数没有参数则可省略,系统自动调用。
※如果子类的句柄赋给了父类的句柄,则父类句柄也只能访问共有的父类成员变量和方法。而反之则不允许父类句柄赋给子类的句柄。(欢迎讨论!)
四、句柄的使用
- 句柄可以作为形式参数通过方法来完成对象指针的传递。
- 任意时刻都可以为句柄创建新的对象,注意同一个对象可能有多个句柄(不管通过哪个句柄读出数据结果也自然是一样的)。
(二)package
- package中可以定义类、静态方法和静态变量,不可以定义硬件相关的module、interface等。
- 通过
package::xx
的方式导入package中的类、方法等。 - 如果package名称唯一且内部定义的名称也与其他package各不相同,则可通过
import package_name::*
的方式使得包中的内容可以被搜索到。