在SystemVerilog中,可以通过关键字implements指定实现类关联的接口类,接口类中定义的方法都是pure virtual方法,不能直接创建对象,其中的方法需要在与其关联的对象类中实现,这里需要注意,接口类与其对应的实现类之间的关系不是继承和被继承的关系。下面是接口类使用方式的简单示例:
// 接口类定义interfaceclassABC;...endclass// 实现类关联对应的接口类classitf_impimplementsABC;...endclass
而类的扩展则是通过关键字extends实现的,此时,如果不加特殊声明的话,子类将继承父类中所有的成员,即子类和父类之间的关系是继承和被继承的关系,其使用方式的简单示例如下:
// 父类定义classparent;...endclass// 子类派生自父类classchildextendsparent;...endclass
当然接口类也可以使用关键字extends派生,但是此时的extends和implements并不是一回事,并且接口类的父类只能是接口类,那么非接口类可不可以implements其他非接口类呢?extends和implements之间到底是不是一回事儿?下面我们通过示例进行说明。
1 接口类可以使用关键字extends派生自0个或者多个接口类。但是需要注意的这里派生自多个接口类,并不是指有多个父类,即并不是多继承,更确切的说这里指的应该是一种多层继承,类似于多代单传。
【示例】

【仿真结果】

在这个示例中,iftc2派生自itfc1,并且iftc2中增加了一个pure virtual方法disp2。类imp对接口类itfc2进行了实现,在其中实现了itfc1和itfc2中的pure virtual方法。这里需要注意,虽然imp直接实现的接口类为itfc2,但是因为iftc2派生自itfc1,所以imp需要将itfc1和itfc2中的pure virtual方法都予以实现。通过这个示例也可以看到,首先接口类可以派生自其他接口类,另一方面,当派生接口类需要实现时,实现类需要将派生接口类及其父类中所有的pure virutal方法都要实现。
2 接口类不能实现接口类
接口类中的pure virtual方法可以在对应的实现类中实现,但是不能在接口类中实现。
【示例】

【仿真结果】

示例中,接口类itfc2实现itfc1,此时编译报错,提示接口类只能在非接口类中实现。其实这一点也很好理解,因为接口类中只能包含pure virtual方法,那么其中就不可能实现其他接口类中的方法。(题外话:要注意工具提供的错误和警告信息,提供的信息对于一些语法理解还是很有帮助的)
3 接口类不能派生自非接口类
前面已经看到,接口类可以派生自接口类,那么,接口类是否可以派生自非接口类呢?我们可以看看下面的示例。
【示例】

【仿真结果】

示例中,接口类itfc派生自normal类,但是normal类并不是接口类,编译报错提示:非接口类不能被接口类扩展派生。那么接口类是否可以implements一般非接口类呢?我们再来看看下面的示例。
【示例】

【仿真结果】

示例中,接口类itfc通过implements实现normal类,此时编译同样报错,报错提示:接口类不能实现非接口类。其实不止非接口类不能实现,接口类也不能实现其他接口类。
另外,我们知道非接口类可以派生自非接口类和抽象类,但是,是不是可以派生自接口类呢?请看下例。
【示例】

【仿真结果】

示例中,normal类派生自接口类itfc,此时编译报错,提示信息为:接口类不能被非接口类派生。虽然非接口类不能派生自接口类,但是非接口类可以implements接口类,并且可以实现多个接口类。那么非接口类是否可以使用关键字implements实现其他非接口类呢?请看下例。
【示例】

【仿真结果】
示例中,非接口类normal1实现非接口类normal0,此时编译报错,报错提示:只有接口类可以被implements,即非接口类不能implements非接口类。可见,关键字implements是专用于接口类实现的。而在实际使用的时候,我们可以在一个非接口类派生自另一个非接口类的同时,implements另一个接口类,如下例所示。
【示例】
【仿真结果】
示例中,分别声明了三个句柄f、n0和n1,其中n0和n1的类型之间是继承和被继承的关系,f和n1之间是接口类定义和接口类实现的关系,也就是说normal1既派生自了normal0,也同时实现了接口类itfc。n1指向创建好的对象,可以调用其父类中的方法disp0(),其中又实现了接口类itfc中的方法disp(),所以也调用itfc中声明的方法disp()
句柄n0指向n1指向的对象后,可以调用normal0中定义的方法,但是不能调用normal1子类中的方法disp1(),也不能调用接口类itfc中的方法。接口类句柄f指向句柄n1指向的对象,虽然n1类中实现了接口类中的方法,但是接口类句柄只能访问接口类中定义的方法,不能访问实现其方法的类中的其他方法。
通过上述这些示例,可以看到extends和implements在非接口类和接口类使用时的区别,主要如下:
l接口类可以派生自其他接口类;
l接口类不能派生自非接口类;
l接口类不能实现其他接口类;
l接口类不能实现其他非接口类;
l非接口类可以实现接口类;
l非接口类不能派生自接口类;
l非接口类可以派生自非接口类;
l非接口类可以同时派生自非接口类,并且实现接口类;
l非接口类不能实现非接口类;
评论区
登录后即可参与讨论
立即登录