System Verilog验证第八章笔记 - System Verilog验证里的OOP高级技巧

继承

基类:也叫父类。

拓展类:也叫子类。

如果基类的构造函数有参数,拓展类必须有构造函数并且在第一行调用基类的构造函数。

子类的约束会覆盖父类的同名约束。

多态

句柄的声明类型,句柄的真正指向的对象类型,方法是否定义为virtual。这三者会共同决定调用方法时调用的是父类的方法还是子类的方法。

未声明virtual时,方法会根据句柄的声明类型来调用。

声明为virtual时,方法会根据句柄真正指向的对象类型来调用。

blueprint蓝图模式

使用蓝图模式的类定义时,先new一个用于blueprint的trans,再在run里定义一个新的句柄,并把blueprint的trans进行copy给到该句柄,再应用。

在顶层,对该使用蓝图模式的类new之后,new一个trans拓展类,把该trans拓展类赋值给蓝图模式的类里的blueprint的trans,再调用蓝图模式的类的run。

$cast

父类tr,子类tr_bad

(1) tr=tr_bad, pass

(2) tr_bad=tr, fail

(3) tr1=tr_bad_1

tr_bad2=tr1, pass

(4) $cast(tr_bad,tr) 如果是情况3就pass,是情况2就仿真报错

也可以当函数用,情况3就返回1,情况2就返回0

抽象类和纯虚方法

用于代码重用

抽象类可以被拓展,不能被直接实例化。

纯虚方法必须有实体后,对应的抽象类才能被实例化。

回调callback

可复用基类里,写好virtual回调task,如pre_run,post_run并实际在run前后调用

使用时,在顶层test里定义回调task的实体,在底层可复用基类的run前后调用(事先写好,也就是留好所谓的钩子)

可用于链接scoreboard/coverage和drv(gen)

tips

参数化类的便捷,也可以用宏,宏更难调试

$display("%m")显示类的层次化路径

你可能感兴趣的:(芯片验证)