当前位置: 代码迷 >> 综合 >> Systemverilog 第八课 面向对象编程
  详细解决方案

Systemverilog 第八课 面向对象编程

热度:22   发布时间:2023-12-18 22:41:08.0

第八课 OOP

  • 什么是OOP?
    可以帮助你搭建并维护一个大型的testbench;提升代码效率;提升代码的复用性。

Terminology

Class(类,蓝图) -> Object(对象,表示具体的物件) -> Handle(句柄,指向对象的指针/地址)-> Properties(属性,类当中定义的变量)-> Methods(方法,控制属性的方法)

在这里插入图片描述
SV当中尽量不要写always,而是用task和function处理任务的过程(偏软件思维)
OOP的三大特点:封装、继承、多态

语法

  • 创建class:
class BusTran;bit[31:0] addr,crc,data[8];//data是8x32的数组function calc_crc;crc = addr^data.xor;
endfunction:calc_crcfunction display;$display("BusTran:%h",addr);
endfunction:displayendclass:BusTran //最后的名字可以不写
  • 创建 object:
BusTran b;
b = new();

new有三个作用:1.在内存中分配空间给b,2.给b当中的变量赋初值,(二太赋0,四态赋x),3.返回存储了对象的地址
***也可以自己编写一个针对物件初始化的new函数。
***若对同一个object进行new,则新new的空间赋给object后原来的空间被释放,new的时候要确定object确实需要一个新的空间。

b = null;

使用null关键字可以手动释放空间

  • 使用object
b.addr = 32'h42;  //给b当中的变量赋值
b.display();	//调用b中的函数

变量

  • Static Variables
    创建一个静态变量,可以在模块中被使用,并且不会被new函数释放或初始化。(注意,不是全局变量)
    静态变量与class的种类有关,而不受object初始化影响,由属于该class的所有object共享
    经常用于储存元数据,例如创建了多少个object等等。
    在这里插入图片描述
    在这里插入图片描述
    在这里b1.id=0,b2.id=1,而count在b1和b2当中都是2。

  • Class routines
    routine指在class当中定义的task或者function,它们的名字和功能是可以重复的。
    class当中是可以引用其它class的,这个和verilog中module当中例化其它的module用法相似。

Handles

  • shallow copy
    在这里插入图片描述
 b2 = new b1 ;

语句属于浅拷贝,只能拷贝class本身含有的属性,但是class中嵌套的class只能复制其指针,因此两个B模块(b1和b2)指向的是同一个指针,也就是同一个a模块

  • deep copy
    深拷贝下所有的定义都被全新复制了一遍。
b1 = new;
b2 = new;
b2.copy(b1);

在这里插入图片描述

Inheritance

关键字:extends
在类之间共享代码的方式:1.例化另一个类 2.继承另一个类
继承能够增加额外的properties和methods,因此能够让代码具有很高的复用性

class Transaction;bit [31:0] src,dst,data[1024],crc;
endclassclass BadTr extends Transaction;bit bad_crc;
endclassBadTr bt;
bt = new;
bt.src = 42;
bt.bad_crc = 1;

可以看到在上面的例子中BadTr继承了Transaction,Transaction所有的属性都能够在BadTr中看到。
除此之外还能修改原来的method,关键字:super

class Transaction bit [31:0] src,dst,data[1024],crc;function void calc_crc();crc = src^dst^data.xor;endfunction
endclassclass BadTr extends Transaction;rand bit bad_crc;function void calc_crc();super.calc_crc();if(bad_crc) crc = ~crc;endfunction
endclass

可以看到在用super调用了父类的函数之后,又添加了新的语句来修改crc的算法。

  • virtual class 虚类
    相当于一个空壳,虚类不能单独使用,必须要由一个实类继承
    在这里插入图片描述
    虚类不会被用于例化,但是可以储存最基本的类属性,方便在多个子实类当中重复继承。
    可以理解为一种“模板”或者“框架”,由子实类来补充框架中的细节。