1.类型转换
显式转换:静态转换:加上单引号
动态转换:$cast(get, src),有返回值
隐式转换:如左侧5位矢量,右侧4位矢量,右侧位宽扩展
父类句柄转换为子类句柄 $cast(h2,h1) h2.super.del找到父类变量
$cast(target,src)会检查句柄所指向的对象类型,而不仅仅检查句柄本身
一旦源对象和目的句柄是同一类型,或者是目的句柄的扩展类,$cast()函数执行即会成功,返回1,否则返回0
2.虚方法
类的特性:封装,继承,多态
类的多态
通过虚方法,实现动态绑定,在sv中称之为动态方法查找
动态绑定,在调用时,会在运行时来确定句柄指向对象的类型,句柄指向子类,调用子类中的方法,再动态指向应该调用的方法
为了实现动态绑定,将basic_test::test定义为虚方法
virtual task test();//只有虚方法,没有虚成员
与父类虚方法同名的子类的继承方法不能使用不同类型的参数定义
3.对象拷贝
浅拷贝
Packet p1;
Packet p2;
p1 = new();
p2 = new() p1;//拷贝其成员变量,integer,string和句柄
子类的copy()方法继承自父类,需要考虑句柄的转换
$cast(h, wr.copy());
class basic test;
...
virtual function void copy_data(basic_test t); //父类方法
t.def = def;
t.fin = fin;
endfunction
virtual function basic_test copy();
basic_test t = new(0);
copy_data(t);
return t;
endfunction
endclass
class test_wr extends basic_test;
...
function void copy_data(basic_test t)
test_wr h;
super.copy_data(t); //返回的父类句柄
$cast(h,t);
h.def = def;
endfunction
function basic_test copy();
test_wr t = new();
copy_data(t);
return t;
endfunction
endclass
4.回调函数
水平复用和垂直复用,应尽可能少的修改验证环境本身
顶层环境的配置对象,不修改原始类的情况下,注入新的代码
父类中预留回调函数入口,继承的子类中填充回调函数,完成对父类方法的修改
虚类不能例化,类的模板
class Driver_cbs_drop extends Driver_cbs;
virtual task pre_tx(ref Transaction tr, ref bit drop);//ref引用
// 1/100的传输事务丢弃概率
drop = ($urandom_range(0, 99) == 0);
endtask
endclass
class Driver;
Driver_cbs cbs[$];
task run();
bit drop;
Transaction tr;
forever begin
drop = 0;
agt2drv.get(tr);
foreach (cbs[i]) cbs[i].pre_tx(tr, drop));//产生新的drop
if(drop) continue; //如果为1,不发送信息了
transmit(tr);
foreach(cbs[i]) cbs[i].post_tx(tr);
end
endtask
endclass
program automatic test;
Environment env;
initial begin
env = new();
env.gen_cfg();
env.bulid();//构建函数
begin //创建回调对象并且植入driver
Driver_cbs_drop dcd = new();
env.drv.cbs.push_back(dcd);
end
env.run();
env.wrap_up();
end
endprogram
回调的使用:
1.类中预留回调路口
2.定义回调类和函数
3.例化及添加回调类的实例