SystemVerilog class的简短介绍

Class Types

当你声明一个class时,你正在声明一组成员和一组对这些成员操作的方法。

class MyClass;
bit [7:0] member1;
bit member2;
function void method;
$display("members are %h %b", member1, member2);
endfunction
endclass

我们正在声明一个class的形式和行为,但没有分配任何内容来存储这种类的值。


Class Objects

类对象是类的特定实例。创建对象的唯一方法是使用类的内置new()方法调用类构造函数。


Class Handles

每次调用new()方法时,它都会构造一个新的类对象,该方法会返回类对象的类句柄。句柄是对类对象的间接引用,就像指向内存中地址的指针一样。


Class Variables

类变量是存储引用特定class类型的特定类对象的类句柄的地方。

有点拗口~

声明类变量不会创建类对象,只会创建保存类句柄的空间。这与其他数据类型形成鲜明对比,在其他数据类型中,变量的声明会创建该类型的对象,并为你提供一个符号名称来引用这些对象。例如:

typesef struct {bit [7:0] member1; bit member2;} MyStruct;
MyStruct StructVar1,StrucVar2

这为两个MyStruct类型对象创建和分配空间,可以使用StructVar1.member1访问其成员之一。

另一方面:

MyClass ClassVar1,ClassVar2;

这为两个MyClass变量创建和分配空间,但只分配空间来保存MyClass对象的句柄,而不是对象本身。如果你现在尝试访问ClassVar1.member1,你将收到一个空句柄引用错误,因为类变量的初始值是特殊值null

关于句柄而不是指针的好处之一是,它们消除了访问未初始化的对象引用的可能性。


Class Types, Objects, Handles, and Variables

一旦你有了类变量,就可以调用new()方法来构建类对象

ClassVar1 = new();

这调用MyClass类型的构造函数,该构造函数将该句柄存储在MyClass变量ClassVar1中。你现在可以访问ClassVar1.member1,因为ClassVar1引用了一个实际的对象。如果你那么做:
ClassVar2 = ClassVar1; 
两个类变量现在都引用了同一个类对象——但MyClass仍然只有一个对象。ClassVar1.member1和ClassVar2.member1指的是同一个类成员。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值