数字验证学习笔记——SystemVerilog芯片验证11 ——类的继承

一、类和继承

类的第二核心要素,即类的“继承”,继承也符合我们认识实际的观点,在自然界和科学界我们对世界的认识无外乎归纳法和演绎法。
归纳论证是一种由个别一般的论证方法。它通过许多个别的事例或分论点,然后归纳出它们所共有的特性,从而得出一个一般性的结论。所以从具体对象抽象出类的属性和方法,就符合定义类时的思维方式。
class cat;
protected color_t color;
local bit is_good;
function set_good(bit s);
this.is_good = s;
endfunction
endclass

class black_cat extends cat; //extends 继承
function new();
this.color = BLACK;
endfunction
endclass

class white_cat extends cat;
function new();
this.color = WHITE;
endfunction
endclass

black_cat bk;
white_cat wk;
initial begin
bk=new();
wt=new();
bk.set_good(1);
wt.set_good(1);
end
在这里插入图片描述
如果我们要将数据发送给dut,那么需要有以下的基本元素和数据处理方法,我们将它封装到Transaction类种。

class Transaction;
rand bit [31:0] src,dst,data[8]; //随机成员变量
bit [31:0] crc ; //二次处理后的成员数据
virtual function void clac_crc();
crc=src^ dst^ data.xor ;
endfuction
virtual function void display( input string prefix= “”);
$display("%sTr: src=%h, dst=%h , crc=%h “, prefix, src, dst crc);
endfuction
endclass
在这里插入图片描述
如果我们为了测试DUT 的稳定性 ,需要加如一些错误的数据来测试DUT的反馈,但我们又想复用原有的验证环境(也包括定义好的类)
那我们就需要考虑使用继承的方式来创建一个类BadTr。
class BadTr extends Transaction;
rand bit bad_crc;
virtual function void calc_crc(); // 父类有两个成员方法,子类也定义了两个这样的成员方法,是没有关系的
super.calc_crc(); // 通过super来调用父类的方法,就表示继承啦
if(bad_crc) crc=~crc;
endfuction
virtual function void display( input string prefix= “”);
$write(”%sBadTr: bad_crc=%b ", prefix, bad_crc);
super.display();
endfuction
endclass:BadTr

BadTr是Transaction的子类,Transaction是BadTr的父类。
BadTr重新定义了函数 calc_crc()和 display (),而在其内部通过索引super来索引父类的同名函数。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
子类在定义new函数时,应该首先调用父类的new函数即super.new() 。
如果父类的new函数没有参数,子类也可以省略调用,系统在编译时会自动添加super.new() 。

在这里插入图片描述
在这里插入图片描述
super.def = 100 this.def=200
在这里插入图片描述
其中t(t是父类句柄但指向的是一个子类对象)不可以赋值wr2(wr2也是一个子类句柄),不然编译会直接报错,可以通过$cast(wr2,t) , 将父类句柄转为子类句柄(这时的父类句柄应该指向的是子类对象,这样转化才能成功返回一个1,否则为0)。

wr.def 和 t.def 分别是多少 wr.def = 200 , t.def=100
在这里插入图片描述
wr.def 优先访问的是子类里面的 def, wr.super.def 这个访问的是父类的def

wr句柄对应的是整个存储basic_test 和 test_wr 空间,而 t 对应的是仅仅存储basic_test的空间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值