Systemverilog 第八课 面向对象编程

第八课 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_crc

function display;
	$display("BusTran:%h",addr);
endfunction:display

endclass: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;
endclass

class BadTr extends Transaction;
	bit bad_crc;
endclass

BadTr 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
endclass

class 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 虚类
    相当于一个空壳,虚类不能单独使用,必须要由一个实类继承
    在这里插入图片描述
    虚类不会被用于例化,但是可以储存最基本的类属性,方便在多个子实类当中重复继承。
    可以理解为一种“模板”或者“框架”,由子实类来补充框架中的细节。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值