Systemverilog 的 virtual 关键字的用法

1. 主要应用场景

  virtual interface
  virtual class
  virtual task
  virtual function

2. 简介

由virtual所声明的内容可理解为一个模板,后续的例化和引用可在这个模板上进行增加或修改,这样就呈现出特定的内容或特性。不同的引用或修改实现不同的对象、接口和方法。这样就很方便的实现了面向对象的特性,即多态实现随继承对象的不同而不同。

3. 详细说明

virtual interface:
定义一个interface,且实例化多个后,如果没有定义virtual,则在任何一个实例中修改了某个信号值,在其他实例中都会受到影响。如果定义了virtual,则每个实例独立。

virtual function/task
用于OOP思想的继承使用。当定义了virtual时,在子类中调用某function/task,会先查找在子类中是否定义该function/task,如果没有定义该function/task,则在父类中查找。未定义virtual时,只在子类中查找,没有定义就是编译错误。

virtual class:
虚类只用来定义类的格式, 和成员的名字, 参数, 不能被实例化, 只能被重载, 用于在项目中定义一些标准的类, 例如driver类, 这样大家extend出来的driver的基本的格式都是一样的, 易读易理解. 在virtual class里的方法最好使用 pure virtual 修饰, 叫做纯虚方法, 也是用来定义方法的名字和参数列表的, 方便大家统一名字。对于virtual class 必须使用 extends class来进行实体化才可以使用,OOP规定,只要class中存在一个没有实现的pure function,就不允许例化这个class …

4. 使用场景

virtual interface:
如果该interface只有一个实例,可用可不用virtual,有多个实例,需要virtual。更好的办法是,都加上virtual。

virtual function/task
如果该class不会被继承,则所有的function/task都不需要加virtual。如果该class会被继承,则用户定义的function/task(除了new()/randomized()/per_randomize()/pose_randomize()以外),都应该加上virtual。更简单的做法是,在用户定义的function/task都加上virtual是不会错的

如果把一个class的方法定义为virtual,那么在进行调用的时候,是根据对象的类型,而非句柄的类型,如果方法没有使用virtual进行修饰,则会调用句柄类型的方法,而非对象类型的方法。这个体现了OOP中的多态的特性。
举例如此下:

class a;
    virtual function a1;
    function a2;
endclass

class b extends a;
    virtual function a1;
    function a2;
endclass


module test;
    a a_1;
    b b_1;
    initial begin
        a_1=new();
        a_1.a1;//调用的是a::a1
        a_1.a2;//调用的是a::a2
        b_1=new();
        a_1=b_1;
        a_1.a1;//调用的是b::a1,根据对象的类型的,其对象为class b类型
        a-1.a2;//调用的是a::a2,根据的是句柄的类型,其句柄类型为class a //定义为vritual与不定义为virtual的区别
    end
endmodule
  • 12
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值