继承
基类:也叫父类。
拓展类:也叫子类。
如果基类的构造函数有参数,拓展类必须有构造函数并且在第一行调用基类的构造函数。
子类的约束会覆盖父类的同名约束。
多态
句柄的声明类型,句柄的真正指向的对象类型,方法是否定义为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")显示类的层次化路径
本文围绕System Verilog展开,介绍了继承中基类与拓展类的关系、构造函数调用及约束覆盖规则;多态中句柄类型和方法声明对方法调用的影响;还阐述了blueprint蓝图模式、$cast用法、抽象类和纯虚方法以及回调callback的使用,最后给出了参数化类和显示类路径的小提示。
1285

被折叠的 条评论
为什么被折叠?



