您的位置:首页 > 其它

SystemVerilog - Classes

2020-04-07 12:25 459 查看

SystemVerilog引入类(classes)作为自动化TB语言的基石。类用来建模,其中包含数据的值可以作为受约束随机方法学的一部分被创建。
一个类属于一种用户定义的数据类型。类包含了数据(称为属性),任务和函数(称为方法)。类是面向对象的编程。在SystemVerilog,类支持下面面向对象的特性- 封装,数据隐藏,继承和多态。

类声明(Class Declaration)

这是一个简单的类声明实例

class C;
int x;
task set (int i);
x = i;
endtask
function int get;
return x;
endfunction
endclass

这个类有一个数据成员, x,和两个方法, set()和 get()。要使用类必须先创建对象:

C c1;
c1 = new;

第一行代码声明c1是一种C。换句话说,变量c1包含了一个句柄,指向类的对象。第二行代码创建了对象并且将句柄传递给c1。上述代码可以用下面代码替换,定义变量,创建类的对象以及初始化变量。

C c1 = new;

已经创建了类的对象,我们可以用类的方法处理其中数据,x:

initial
begin
c1.set(3);
$display("c1.x is %d", c1.get());
end

数据隐藏(Data Hiding)

虽然任务:set(),函数:get()是用来对类的数据成员x的赋值和取值的,下面这种方式也同样可以做到:

initial
begin
c1.x = 3;
$display("c1.x is %d", c1.x);
end

这是因为所有类的成员默认都是公共可见的。为了隐藏 x, 必须声明成local变量:

local int x;

现在在类的外部直接访问x变成非法的,必须用类的方法。

参数化类(Parameterised Classes)

类可以用模块类似的参数化:

class Register #(parameter int N = 1);
bit [N-1:0] data;
...
endclass

默认的参数值可以在类例化的时候覆盖:

Register #(4) R4;                   // data is bit [3:0]
Register #(.N(8)) R8                // data is bit [7:0]
Register R;                         // data is bit [0:0]

也可以传递数据类型:

class Register #(parameter type T = int);
T data;
...
endclass

Register Rint;                      // data is int
Register #(bit [7:0]) Rint;         // data is bit [7:0]

扩展类 - 继承(Extending Classes - Inheritance)

面向对象编程的一个关键特性就是可以基于现有的类,创建新的类。一个派生类默认继承基类的属性和方法。然而,派生类可以增加新的属性和方法,或者修改继承的属性和方法。换句话说,新的类是之前类更加定制化的版本。
在SystemVerilog中,派生类的语言如下:

class Derived extends BaseClass;
// New and overridden property and method declarations.
endclass

联系前面提到的Register类,这代表一种通用的数据寄存器。我们可以派生一个新的类,ShiftRegister,代表一种定制化的寄存器。

class ShiftRegister extends Register;
task shiftleft;  data = data << 1; endtask
task shiftright; data = data >> 1; endtask
endclass

ShiftRegister类的对象可以用之前的set()和get()方法,同样shiftleft和shiftright方法也可以。然而如果Register类的数据属性定义为local会有问题,在派生类中不可见。因为,它可以声明称protected:

class Register;
protected int data;
...
endclass

一个protected成员对于类外部不可见,但是派生类可见;而local成员只对声明它的类可见。

虚类和方法(Virtual Classes and Methods)

有时创建一个特殊类很有帮助(特意不创建任何对象)。类作为基类存在,可以派生其他类。在SystemVerilog中,这称为抽象类,用virtual关键字定义:

virtual class Register;
...
endclass

同样,方法也可以这样定义。这意味着如何该方法在派生类中重写,签名必须保持一致(签名包括返回值,参数的数量和类型)。这提供了一种机制,就像是在说“我想要所有的派生类中的方法都和基类中的看上去一样”。抽象类中的虚方法不必有实体,因为它会在非抽象派生类中定义实体。
注意,抽象类中的方法不一定是虚方法,同样,虚方法也可以定义在非抽象类中。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
ZHPM 发布了0 篇原创文章 · 获赞 0 · 访问量 130 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: