一、“virtual”的作用
面向对象编程(OOP)三大特性(封装,继承,多态)中的 多态 在SystemVerilog中一般通过 “virtual” 关键字实现。通过virtual声明的类,接口,任务与函数,其本身自带一些方法或者函数。后续的例化或者扩展可以对原有的内容进行增加或者修改,从而实现同一函数不同方法的多种形态。
二、“virtual”在system Verilog中的用法
其主要应用场景在virtual interface,virtual task/function以及virtual class 中。
1. virtual interface
- 在interface定义时,如果不使用关键字 “virtual” 那么在多次调用该接口时,在其中的一个实例中对接口中某一信号的修改会影响其他实例接口;如果使用了 “virtual” 关键字,那么每个实例是独立的。
- 习惯上在声明interface时均添加 "virtual"关键字。
2. virtual task/function
- 用于OOP思想的继承使用。即子类可以继承父类的成员及方法。当定义了virtual时,在子类中调用某task/function时,会先查找在子类中是否定义了该 task/function,如果子类没有定义,则在父类中查找。未定义virtual时,只在子类中查找,没有定义就是编译器报错。
- 如果某一class会被继承,则用户定义的task/function(除new(),randomized(),per_randomize(),pose_randomize()