面向对象编程基础 | Systemverilog 笔记 4

Posted by Kion on January 20, 2020

什么是类?

一种将复杂数据及操作数据的方法封装在一起的数据类型。

如何声明类?

class firstcls;/*类名*/
    logic [7:0] data; /*数据,即属性*/
    static int count=0; /*共享属性(静态变量)*/
    
    function void display; /*显示数据的函数,即方法;方法可以在类之外定义(extern/::)*/
        $display("Data:%h", data);
    endfunction:display
    
    static function void displaycnt;/*静态方法,可以读写静态变量,不能读写非静态变量*/
        $display("Number of objects:%d",count);
    endfunction
    
    function new;/*构造函数,创建对象,初始化变量*/
        data = 8'h0;
    endfunction
    
    task start();/*类中方法默认自动存储*/
        $display("Start!");
    endtask
endclass:firstcls /*添加标记*/

如何使用类?

使用类之前,需要了解相关术语。

术语 描述
包含属性和方法的基本构建块
对象 类的一个实例
句柄 指向对象的指针
属性 储存数据的变量
方法 操作变量的任务或者函数
原型 程序的头(程序名,返回参数和参数列表)

因此,使用类,要先实例化一个属于该类的对象,然后使用其属性或者方法。类就像一张飞机图纸,根据图纸,可以制造出真实的飞机(对象),依据一张图纸可以制造许多飞机,同样一个类可以实例化出许多对象。句柄就像飞机的生产编号,一一对应,某架飞机生产时,应当为其分配特定编号。

fisrtcls aobj; /*声明一个句柄*/
aobj = new(); /*构造函数,为firstcls对象分配空间*/
aobj.display; /*调用显示函数*/
$display("%d %d",aobj.count,firstcls::count);/*两种方法都能调用静态变量*/
aobj = null;/*解除分配*/

如何嵌套类?

可以在类中使用其他类,不过要注意编译顺序问题,可用typedef class语句提前声明要用到的嵌套类。

如何传递对象?

利用句柄可以传递对象,但是要注意使用ref关键词,否则无法修改对象的属性。否则调用时,是把参数复制进去,对原先的对象无法造成影响。

如何复制对象?

可以用new操作符复制对象,但是对象内若包含了其他句柄,则无法自动复制,仍然保持原样。因此通常在类中定义一个copy方法用于复制。